Frage

Ich möchte eine Ebene zeichnen, die durch die Gleichung angegeben ist: AX+nach+cz+d = 0. Ich habe zuerst versucht, ihn zu zeichnen, indem ich X, y einstellte und dann Z aus der Gleichung holte. Dies hat nicht gut funktioniert, da es einige Ebenen wie 0x+0y+Z+0 = 0 und usw. gibt ...

Meine aktuelle Lösung lautet: - Zeichnen Sie die Ebene auf der ZY -Ebene, indem Sie 4 Koordinaten geben, die in Unendlichkeit gehen. - Finden Sie die Drehung heraus, die durchgeführt werden sollte, um die Normalität der angegebenen Ebene (a, b, c) auf die Z -Achse zu bringen. - Finden Sie die Übersetzung, die durchgeführt werden sollte, damit diese Ebene auf der X -Achse befindet. - Machen Sie die genaue entgegengesetzte Transformation in diese Rotation und zu dieser Übersetzung, daher werde ich das bekommen
Flugzeug an seiner Stelle.

OK

Das ist eine großartige Sache, aber ich kann die richtigen Mathematikberechnungen (viele Male versucht ...) mit dem Punktprodukt und usw.

Kann mir jemand helfen, genau zu verstehen, wie es getan werden sollte, oder mir eine Formel geben, in der ich ABCD einsetzen und die richtige Transformation erhalten werde?

War es hilfreich?

Lösung

Fragst du das?

Das Umwandeln eines einfachen Flugzeugs wie das XY -Flugzeug in Ihr Flugzeug ist ziemlich einfach:

Ihre Ebene ist ax+nach+cz+d = 0

Die XY -Ebene ist einfach z = 0. dh a = b = d = 0, während c = was auch immer du willst. Wir werden um den Einfachheit halber willen sagen.

Wenn Sie eine Ebene in dieser Form haben, wird die Normalität der Ebene vom Vektor definiert (a, b, c)

Sie möchten also eine Rotation, die Sie von (0,0,1) nach (a, b, c)* bringt

*Beachten Sie, dass dies nur funktioniert, wenn {a, b, c} einheitlich ist. Möglicherweise müssen Sie jeweils AB und C durch SQRT (a^2+b^2+c^2) teilen.

Wenn Sie nur zwei der Achsen drehen, können Sie Ihre Richtung in eine andere Richtung bringen, also werden wir x und y auswählen.

Hier sind die Rotationsmatrizen für Rotationen durch eine über die x -Achse und B um die y -Achse.

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]}}

Wenn wir eine Rotation um X durchführen, gefolgt von einer Rotation um y, des Vektors, der normal zur XY -Ebene (0,0,1) ist, bekommen wir:

Ry.rx. {0,0,1} = {-cos [a] sin [b], sin [a], cos [a] cos [b]}

Welches sind Ihre ABC -Werte.

dh

A = -cos [a] sin [b

B = sin [a

C = cos [a] cos [b

Von hier aus ist es einfach.

A = Asin [B

Also jetzt a = -cos [Asin [b]] sin [b

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

A = -sqrt [1 -b^2] * sin [b

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

a = Asin [b] (Rotation um x -Achse)

B = Asin [-a/sqrt [1-b^2]] (Drehung um y Achse)

Wir haben jetzt die Winkel über die x- und y -Achsen, nach denen wir drehen müssen.

Danach müssen Sie nur Ihr Flugzeug nach oben oder unten verschieben, bis es dem bereits entspricht, den Sie bereits haben.

Die Ebene, die Sie im Moment haben (nach diesen beiden Rotationen), wird AX+durch+cz = 0 sein.

Die gewünschte Ebene ist Ax+Bx+CZ+D = 0. Um D herauszufinden, werden wir sehen, wo die Z -Achse Ihr Flugzeug überschreitet.

IE CZ+D = 0 -> z = -d/c

Also transformieren wir Ihr Z in Ax+nach+cz = 0 nach -d/c, um zu geben:

Ax+nach+C (z+d/c) = ax+nach+cz+d = 0. Oh, würdest du dir das ansehen!

Es stellt sich heraus, dass Sie keine zusätzlichen Mathematik machen müssen, sobald Sie die Winkel zum Drehen haben!

Die beiden Winkel geben Ihnen A, B und C, um zu bekommen, dass Sie ihn einfach von dem kopieren, was Sie hatten.

Ich hoffe, das ist etwas Hilfe, ich bin mir nicht ganz sicher, wie Sie das Flugzeug tatsächlich zeichnen möchten ...

Bearbeitet, um eine schreckliche Formatierung zu beheben. Hoffentlich ist es jetzt besser.

Andere Tipps

Sie möchten die folgende Transformationsmatrix:

    [ 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 ]

Hier ist Z0 die Normalität Ihrer Ebene, und o ist der Ursprung Ihrer Ebene, und X0 und Y0 sind zwei Vektoren in Ihrer Ebene orthogonal bis z0, die die Rotation und Verschleierung Ihrer Projektion definieren.

Dann kann jeder Punkt (x, y) in Ihrer XY -Ebene bis zu einem Punkt (p_x, p_y, p_z) Ihre neue Ebene mit Folgendes projiziert werden:

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

Jetzt ist Z0 in Ihrer Transformationsmatrix einfach, das ist die Normalität Ihres Flugzeugs und das ist einfach n = normalize(a,b,c).

Bei der Auswahl des Restes haben Sie jedoch deutlich mehr Freiheit. Für den Ursprung könnten Sie den Punkt annehmen, dass die Ebene die Z -Achse schneidet, es sei denn, die Ebene ist parallel zur Z -Achse. In diesem Fall brauchen Sie etwas anderes.

Also zB

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;
}

In der Praxis möchten Sie vielleicht einen anderen Test bevorzugen als (c != 0), Denn mit diesem Test wird es gelingen, dass sogar C sehr sehr klein ist, aber einfach von Null unterscheidet, was dazu führt, dass Ihr Ursprung beispielsweise ist, x=0, y=0, z=10e100 Das wäre wahrscheinlich nicht wünschenswert. Also ein paar Tests wie (abs(c) > threshold) ist wahrscheinlich vorzuziehen. Sie könnten jedoch natürlich einen ganz anderen Punkt in der Ebene einnehmen, um den Ursprung zu setzen, vielleicht den Punkt, der dem Ursprung Ihres ursprünglichen Koordinatensystems am nächsten liegt, was wäre:

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

Dann müssen wir schließlich einen X0 und Y0 herausfinden. Dies könnte zwei linear unabhängige Vektoren sein, die orthogonal bis z0 sind.

Lassen Sie uns zunächst einen Vektor in der XY -Ebene für unseren X0 -Vektor auswählen:

x0 = normalize(z0_y, -z0_x, 0)

Dies schlägt nun fehl, wenn Ihr Z0 aus dem Formular (0, 0, Z0_Z) ist. Daher benötigen wir einen Sonderfall dafür:

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

Nehmen wir schließlich an, wir wollen nicht, dass sich y0 sowohl für X0 als auch für Y0 orthogonal aussieht, unter Verwendung des Kreuzprodukts dann mit dem Kreuzprodukt

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)

Jetzt haben Sie alle, um Ihre Transformationsmatrix zu füllen.

Haftungsausschluss: Bei der Verwendung von Gleitkomma -Darstellungen für Ihre Zahlen sollte angemessene Sorgfalt aufgenommen werden, einfache (foo == 0) Tests reichen in diesen Fällen nicht aus. Lesen Sie die Mathematik für Gleitkomma, bevor Sie mit der Implementierung beginnen.

Bearbeiten: Um Klarheit in einigen Variablen umbenannt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top