Comment calculer le produit croisé vectorielD'après la documentation, il semble que l'opérateur * effectuera un produit croisé et ;* effectuera un produit scalaire. Je souhaite utiliser un produit croisé pour déterminer le vecteur normal à une paire de vecteurs connus comme celui-ci :
p1 = [1, 2, 4];
p2 = [2, 1, 4];
p3 = [2, 2, 4];
v1 = p3 - p1;
v2 = p2 - p1;
xProd = v1*v2;
3 points définissent un plan, deux vecteurs tirés de ces points font de même, le produit vectoriel doit donner le vecteur normal de ce plan. Le problème semble être que les dimensions des deux matrices multipliées (v1 et v2) ne concordent pas - nRows(v1) doit être égal à nCols(v2). Je peux l'implémenter manuellement avec une formule simplifiée pour les produits croisés vectoriels, mais est-ce que quelqu'un sait comment formater cela différemment pour travailler avec la multiplication matricielle?
Re : Comment calculer le produit croisé vectorielMerci cwillden, c'est essentiellement ce que j'ai implémenté. Cela fonctionne pour moi puisque je ne suis concerné que par les vecteurs 3D, mais je suis surpris que ce ne soit pas une fonction intégrée. Je vais laisser cela ouvert un peu pour voir si quelqu'un d'autre connaît un tel moyen.
Re : Comment calculer le produit croisé vectorielJ'espère que quelqu'un trouvera une façon intelligente de le faire. La fonction det() est étroitement liée, mais je ne comprends pas comment utiliser det(matrice 3x3) pour récupérer plus qu'une valeur scalaire. Je pense que vous pourriez utiliser det (sous-matrice 2x2) trois fois, mais je pense que le simple xyzzy approche est plus simple et tout aussi rapide.
Je l'utilise pour les normales de surface dans les scènes 3D, il y a du JSL dans https://community.jmp.com/t5/Uncharted/Custom-Visualization/ba-p/191559 .
Re : Comment calculer le produit croisé vectorielSi vous ne traitez que des vecteurs 3x1 (ou 1x3), alors je pense que l'efficacité ou l'élégance des calculs n'est pas trop importante.Serait-ce suffisant ?
cross_prod = function({v1, v2},
matrix({v1[2]*v2[3] - v1[3]*v2[2], v1[1]*v2[3] - v1[3]*v2[1], v1[1]*v2[2] - v1[2]*v2[1]});
);
cross_prod(v1, v2);