Question

Je veux dessiner un plan qui est donné par l'équation: Ax + By + Cz + D = 0. J'ai d'abord essayé de l'attirer en définissant x, y et z alors obtenir de l'équation. cela n'a pas très bien parce qu'il ya des avions comme 0x + 0y + z + 0 = 0 et etc ...

ma solution actuelle est la suivante: - établir le plan sur plan ZY en donnant 4 coordonnées qui tend vers l'infini. - à savoir la rotation qui devrait être fait afin d'amener la normale du plan donné (a, b, c) d'établir sur l'axe z. - trouver la traduction qui devrait être fait pour que ce plan soit sur l'axe x. - faire la transformation exactement opposés à ceux rotation et à cette traduction donc je vais obtenir le
avion à sa place.

ok

est une grande chose, mais je peux faire les calculs mathématiques appropriés (essayé beaucoup de fois ...) avec le produit scalaire et etc ....

quelqu'un peut me aider à comprendre la manière exacte, il doit être fait ou me donner une formule dans laquelle je vais mettre ABCD et obtenir la transformation droite?

Était-ce utile?

La solution

Est-ce que vous demandez?

Transformer un simple plan comme le plan xy à votre plan est assez simple:

votre avion est Ax + By + Cz + D = 0

le plan xy est simplement z = 0. à savoir A = B = D = 0, tandis que C = tout ce que vous voulez. Nous disons 1 pour des raisons de simplicité.

Quand on a un plan sous cette forme, la normale du plan est défini par le vecteur (A, B, C)

donc vous voulez une rotation qui vous mènera de (0,0,1) à (A, B, C) *

* Notez que cela ne fonctionnera que si {A, B, C} est unitaire. vous pouvez donc avoir à diviser A B et C chacun par sqrt (A ^ 2 + B + C ^ 2 ^ 2).

tournant autour deux des axes peut obtenir votre de toute direction à toute autre direction, nous allons donc chercher x et y;

ici sont les matrices de rotation pour la rotation par un autour de l'axe x, et b autour de l'axe y.

Rx: = {{1, 0, 0}, {0, Cos [a], Sin [a]}, {0, -Sin [a], Cos [a]}}

Ry: = {{Cos [b], 0, -Sin [b]}, {0, 1, 0}, {Sin [b], 0, Cos [b]}}

si nous faisons une rotation autour de x, suivie d'une rotation autour de y, du vecteur normal au plan xy, (0,0,1), nous obtenons:

Ry.Rx. {0,0,1} = {cos [a] Sin [b], Sin [a], Cos [a] Cos [b]}

qui sont vos valeurs A B C.

i.e..

A = cos [a] Sin [b]

B = Sin [a]

C = cos [a] Cos [b]

A partir de là, il est simple.

a = Asin [B]

maintenant A = cos [Asin [B]] Sin [b]

Cos [Asin [x]] = sqrt (1-x ^ 2) donc:

A = -Sqrt [1-B ^ 2] * sin [b]

b = Asin [-A / sqrt [1-B ^ 2]]

a = Asin [B] (rotation autour de l'axe des x)

b = Asin [-A / sqrt [1-B ^ 2]] (rotation autour de l'axe y)

Nous avons maintenant les angles sur les axes x et y, nous devons tourner par.

Après cela, il vous suffit de déplacer votre avion vers le haut ou vers le bas jusqu'à ce qu'il corresponde à celui que vous avez déjà.

Le plan que vous avez à l'heure actuelle, (après ces deux rotations) va être Ax + By + Cz = 0.

le plan que vous voulez est Ax + Bx + Cz + D = 0. Pour en savoir d, nous verrons où l'axe z croise votre plan.

i.e.. Cz + D = 0 -> z = -D / C

Nous transformons votre z à Ax + By + Cz = 0 par -D / C pour donner:

Ax + By + C (z + D / C) = Ax + By + Cz + D = 0. Oh-vous regarder ça!

Il s'avère que vous ne devez pas faire des mathématiques supplémentaires une fois que vous avez les angles de rotation par!

Les deux angles vous donnera A, B et C. Pour obtenir D copier juste de ce que vous aviez.

Je espère que ce de l'aide, je ne suis pas tout à fait sûr de savoir comment vous envisagez de dessin en fait le plan que ...

modifié pour corriger une mise en forme horrible. espérons qu'il va mieux maintenant.

Autres conseils

Vous voulez la matrice de transformation suivante:

    [ x0_x y0_x z0_x o_x ]
M = [ x0_y y0_y z0_y o_y ]
    [ x0_z y0_z z0_z o_z ]
    [    0    0    0   1 ]

Ici, Z0 est la normale de votre avion, et o est l'origine de votre avion, et x0 et y0 sont deux vecteurs dans votre plan orthogonal à Z0 qui définissent la rotation et l'inclinaison de votre projection.

Ensuite, tout point (x, y) sur votre plan XY peut être projeté à un point (p_x, p_y, p_z) votre nouveau plan avec les éléments suivants:

(p_x, p_y, p_z, w) = M * (x, y, 0, 1)

maintenant, Z0 dans votre matrice de transformation est facile, c'est normal de votre avion et qui est tout simplement n = normalize(a,b,c).

En choisissant le reste cependant, vous avez nettement plus de liberté. Pour l'origine, vous pouvez prendre le point que le plan coupe l'axe Z, à moins bien sûr le plan est parallèle à l'axe Z, auquel cas vous avez besoin d'autre chose.

par exemple.

if (c != 0) { //plane intersects Z axis
  o_x = 0;
  o_y = 0;
  o_z = -d/c;
}
else if (b != 0) { // plane intersects Y axis
  o_x = 0;
  o_y = -d/b;
  o_z = 0;
}
else { // plane must intersect the X axis
  o_x = -d/a;
  o_y = 0;
  o_z = 0;
}

Dans la pratique vous pouvez préférer un test différent de celui (c != 0), car avec ce test, il réussira même est c est très très petit mais juste différent de zéro, ce qui votre origine pour être à dire, x=0, y=0, z=10e100 qui ne serait probablement pas souhaitable. Donc, certains tests comme (abs(c) > threshold) est sans doute préférable. Cependant, vous pouvez bien sûr prendre un point tout à fait différent dans le plan pour mettre l'origine, peut-être le point le plus proche de l'origine de votre système de coordonnées d'origine, ce qui serait:

o = n * (d / sqrt(a^2 + b^2 + c^2))

Alors, enfin, nous devons trouver un x0 et y0. Ce qui pourrait être deux vecteurs quelconques linéairement indépendants qui sont orthogonales à Z0.

Alors d'abord, nous allons choisir un vecteur dans le plan XY pour notre vecteur x0:

x0 = normalize(z0_y, -z0_x, 0)

Maintenant, cela ne fonctionne pas si votre Z0 se trouve être de la forme (0, 0, z0_z) donc nous avons besoin d'un cas particulier pour que:

if (z0_x == 0 && z0_y == 0) {
  x0 = (1, 0, 0)
}
else {
  x0 = normalize(z0_y, -z0_x, 0)
}

Enfin, disons que nous ne voulons pas de biais et choisissez y0 orthogonaux à la fois x0 et y0, puis, en utilisant la CrossProduct

y0 = normalize(x0_y*y0_z-x0_z*y0_y, x0_z*y0_x-x0_z*y0_z, x0_x*y0_y-x0_y*y0_x)

Maintenant, vous avez tout à remplir votre matrice de transformation.

Avertissement: il faut prendre soin lors de l'utilisation appropriée des représentations à virgule flottante pour vos numéros, tests simples (foo == 0) ne sont pas suffisantes dans ces cas. Renseignez-vous sur les mathématiques à virgule flottante avant de commencer à mettre en œuvre des choses.

Edit: renommé certaines variables pour plus de clarté

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top