1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| /*
* This file is part of Plants-Growth-2
* Plants-Growth-2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plants-Growth-2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Plants-Growth-2. If not, see <http://www.gnu.org/licenses/>.
*/
package be.manudahmen.growth.graphics;
import be.manudahmen.empty3.Matrix33;
import be.manudahmen.empty3.Point2D;
import be.manudahmen.empty3.Point3D;
/***
* Rotation d'un angle quelconque autour d'un axe
Bonjour,
Je galère pour trouver l'agorithme correct pour la "Rotation3D"
J'ai trouvé ceci ce matin
https://www.developpez.net/forums/d8...t-3d-distance/
Ce qui donne les coordonnées du projeté P du point sur l'axe. J'ai essayé ça fonctionne.
Maintenant pour la rotation je crois, et si on veut faire tourner beaucoup de points il faut calculer la matrice de rotation en fonction de XP (droite perpendiculaire à l'axe AB.
Puis faire M.X => X' (point "rotationné")
Voilà pour calculer la matrice comment faire?
On a le vecteur directeur de l'axe disons V ou U1
On a P P0 si on le divise par la norme |PP0| on obtient un deuxième vecteur unitaire. U2
Pour le troisième on fait U1^U2 = U3.
Mais là comment les mettre sous forme matricielle, en lignes, en colonnes?
A l fin M*X = X'
Puis finalement repositionner le point dans l'espace réel: P+X'
Non je crois que la fin du raisonnement est fausse. mais à partir de P, U2, et U3, on peut faire une matrice de rotation non? Rotation d'un angle quelconque autour d'un axe
Bonjour,
Je galère pour trouver l'agorithme correct pour la "Rotation3D"
J'ai trouvé ceci ce matin
https://www.developpez.net/forums/d8...t-3d-distance/
Ce qui donne les coordonnées du projeté P du point sur l'axe. J'ai essayé ça fonctionne.
Maintenant pour la rotation je crois, et si on veut faire tourner beaucoup de points il faut calculer la matrice de rotation en fonction de XP (droite perpendiculaire à l'axe AB.
Puis faire M.X => X' (point "rotationné")
Voilà pour calculer la matrice comment faire?
On a le vecteur directeur de l'axe disons V ou U1
On a P P0 si on le divise par la norme |PP0| on obtient un deuxième vecteur unitaire. U2
Pour le troisième on fait U1^U2 = U3.
Mais là comment les mettre sous forme matricielle, en lignes, en colonnes?
A l fin M*X = X'
Puis finalement repositionner le point dans l'espace réel: P+X'
Non je crois que la fin du raisonnement est fausse. mais à partir de P, U2, et U3, on peut faire une matrice de rotation non?
*/
public class Rotation2 {
private static double Epsilon = 0.000001;
/** Methode qui calcule la projection orthogonale du point P sur une droite D representee par un point X et un vecteur V (P = X + kV).
* ATTENTION : cette methode renvoit le coefficient k.
* @param X Un point de la droite D.
* @param V Le vecteur directeur de la droite D.
* @param P Le point dont on souhaite connaitre le projete sur la droite D.
* @return Le coefficient de k de P = X + kV.*/
public Point3D IntersectionCoef(Point3D X, Point3D V, Point3D P)
{
int Size = 3 ;
double num = 0.0, den = 0.0 ;
for (int i=0 ; i < Size ; i++)
{
num += V.get(i) * (P.get(i)-X.get(i)) ;
den += Math.pow(V.get(i), 2.0) ;
}
if ( Math.abs(den) < Epsilon ) throw new ArithmeticException("Denominator equal to zero => Vector V is a vector null.") ;
P = X.plus(V.mult(num / den));
return P;
}
/***
*
* @param X Point à faire tourner
* @param A Point de la droite d (premier)
* @param B Point de la droite d (deuxième)
* @param angle Angle de rotation
* @return résultat
*/
public Point3D rotation( Point3D X, Point3D A, Point3D B, double angle)
{
Point3D V = B.moins(A);
Point3D P = IntersectionCoef(A, V, X);
Point3D u1 = V.norme1();
Point3D u2 = X.moins(P).norme1();
Point3D u3 = u1.prodVect(u2);
double distance = P.moins(X).norme();
Matrix33 rotationPlanPperdAB = new Matrix33(new double[]
{
Math.cos(angle), Math.sin(angle), 0,
-Math.sin(angle), Math.cos(angle), 0,
0, 0, 1
});
Point3D pU2U3 = new Point3D(distance, 0, 0);
Point3D res = u2.mult(pU2U3.getX()).plus(u3.mult(pU2U3.getY()));
return P.plus(res);
}
} |
Partager