/** * Bezieht einen Strahl, der in die entgegengesetzte Richtung zeigt * * @return Der Strahl */ @NotNull @ReturnsCachedValue public Ray3 getInverted() { Vector3 inverted = direction.getInverted(); Ray3 ray = Ray3.createNew(origin, inverted); inverted.recycle(); return ray; }
/** * Berechnet die Distanz eines Punktes zu diesem Strahl * * @param point Der Punkt * @return Die berechnete Distanz */ public float getDistanceFromPoint(@NotNull final Vector3 point) { // http://answers.yahoo.com/question/index?qid=20080912194015AAIlm9X Vector3 w = point.sub(origin).crossInPlace(direction); float length = w.getLength(); // aufräumen und raus hier w.recycle(); return length; }
/** * Definiert die Plane über drei Punkte. * * @param a Erster Punkt * @param b Zweiter Punkt * @param c Dritter Punkt * @return Diese Instanz für method chaining */ @NotNull public Plane3 set(@NotNull final Vector3 a, @NotNull final Vector3 b, @NotNull final Vector3 c) { assert !a.equals(b) && !b.equals(c); // TODO: Dürfen nicht auf einer Geraden liegen! // Normale berechnen: _normal = a.sub(b).cross(a.sub(c)); final Vector3 aSubB = a.sub(b); Vector3 aSubC = a.sub(c); _normal.set(aSubB.cross(aSubC)); _normal.normalize(); // aSubB freigeben. // aSubC wird noch nicht freigegeben, da wir den Wert in Kürze weiterverwenden werden aSubB.recycle(); // Entfernung berechnen final Vector3 invNormal = aSubC; invNormal.set(_normal).invert(); _distanceToOrigin = invNormal.dot(a); invNormal.recycle(); return this; }
/** * Projiziert einen Punkt auf den Strahl * * @param point Der Punkt * @return Der projizierte Punkt */ @NotNull @ReturnsCachedValue public Vector3 projectPoint(@NotNull final Vector3 point) { // Richtung bestimmen und auf Richtungsvektor projizieren Vector3 w = point.sub(origin); Vector3 projected = direction.mul( w.dot( direction)); // TODO: Als static herausziehen, damit für diesen Test das Caching der // anderen Werte nicht nötig ist w.recycle(); return projected; }