Hallo zusammen,
ich möchte als Allererstes das Ziel des Programms erläutern und dann komm ich zum eigentlichen Problem, was ich gerade entdeckte...
Mathelastig!
Ich habe eine Ebene
Nun habe ich die Ebene um die y-Achse gedreht, mithilfe der Drehmatrix, also
Das ergibt, wenn man die Zahlen bei 1 belässt:
Eine Drehung um beispielsweise 20° gibt uns dies (in diesem Online-Tool gezeichnet):
Das kann ich mit meinem Programm auch berechnen. Ich habe gestern und heute an der Projektion gesessen. Wie man hier sieht, wird die gekippte grüne Ebene links (also dort wo sie höher ist) größer dagestellt und rechts, wo sie niedriger ist, kleiner. Das ist logisch. Ich kam gestern und heute allerdings nicht auf die Formel – also wie viel breiter / dünner die Ebene aussieht (in y Richtung). Ich habe nun das Ganze mit einem Sinus angenähert. Diese Annäherung kommt mir sinnvoll vor, da der Effekt des Breiterwerdens bei kleinen Winkel größer ist und bei großen Winkel (fast senkrechte Ebene) kleiner wird. Für die andere Richtung nehme ich den cos, da der Effekt andersherum ist. Da ich den genauen Sachverhalt nicht kenne, multipliziere ich das mit einem Justierfaktor.
Da ich die Zahlen bei 1 belassen habe, multipliziere ich mit einem Vergrößerungsfaktor.
Ich berechne nun 8 Punkte für die 4 Linien und zeichne sie.
Für die, die neu sind und das nicht wissen: Im Gegenzug zum Online-Tool läuft +y in VB.Net nach unten! Daher muss ich im Code das umgekehrte Vorzeichen verwenden.
Drehung um die y-Achse
Das sieht optisch ganz gut aus (zumindest plausibel):
Meine Fragen wären nun:
1.) Könnte mir bitte jemand sagen oder erklären, wie ich diese Projektion korrekt auszuführen habe, also wie die Formel ist? Ich habe schon bei math.stackexchange.com gefragt, aber da kriegst ja keine Antwort. Wahrscheinlich ist das für die zu trivial.
2.) Wie ihr an den auskommentierten Code-Zeilen (Zeilen 5-7) seht, habe ich versucht, die Variablen anzulegen und die Werte zwischenzuspeichern, damit nicht immer wieder derselbe Wert berechnet wird. Das Ganze wird leider ungenau. Bei 90° habe ich nicht die seitliche Kante der Ebene gesehen, sondern es sah so aus, als wäre sie nur um 85° gekippt. Wie kann das sein? Kann mir das jemand bezüglich Speicher erklären? Warum macht es so einen gravierenden Unterschied, ob ich dies schreibe
oder das?
3.) Mischdrehung - und projektion
Joa, und für die Drehung um die x-Achse verhält sich das andersherum, also sin und cos umplatzieren:
Drehung um die x-Achse
Das gibt uns:
Leider ist damit keine Mischdrehung und -projektion möglich. Ich weiß, das sind bestimmte Matrizen, aber ich habe mit diesem Thema leider Schwierigkeiten, das Richtige im Netz zu finden. (Ich habe das Gefühl, darüber wird sehr selten gesprochen; entweder, man findet nix oder man findet Doktorarbeiten). Auch, wenn ich Mathe I und II hatte und mich mit Ebenen auskenne und ich ein gutes, räumliches Denkvermögen habe und mir nun einen provisorische Zusammenhang erdenken konnte – diese Projektionsgeschichten haben wir nie gemacht. Ich habe mir vor 2 Tagen ein Video von Prof Loviscach angesehen und bin jetzt dabei, mir das Thema selbst beizubringen.
ich möchte als Allererstes das Ziel des Programms erläutern und dann komm ich zum eigentlichen Problem, was ich gerade entdeckte...
Mathelastig!
Ich habe eine Ebene
$E: \overrightarrow{x} = (0|0|0) + s·(1|0|0) + t·(0|1|0)$
, liegt also in der xy-Ebene. Vorzeichenkonvention: +x geht nach rechts, +y nach oben und +z geht aus der Zeichenebene heraus.Nun habe ich die Ebene um die y-Achse gedreht, mithilfe der Drehmatrix, also
Das ergibt, wenn man die Zahlen bei 1 belässt:
Eine Drehung um beispielsweise 20° gibt uns dies (in diesem Online-Tool gezeichnet):
Das kann ich mit meinem Programm auch berechnen. Ich habe gestern und heute an der Projektion gesessen. Wie man hier sieht, wird die gekippte grüne Ebene links (also dort wo sie höher ist) größer dagestellt und rechts, wo sie niedriger ist, kleiner. Das ist logisch. Ich kam gestern und heute allerdings nicht auf die Formel – also wie viel breiter / dünner die Ebene aussieht (in y Richtung). Ich habe nun das Ganze mit einem Sinus angenähert. Diese Annäherung kommt mir sinnvoll vor, da der Effekt des Breiterwerdens bei kleinen Winkel größer ist und bei großen Winkel (fast senkrechte Ebene) kleiner wird. Für die andere Richtung nehme ich den cos, da der Effekt andersherum ist. Da ich den genauen Sachverhalt nicht kenne, multipliziere ich das mit einem Justierfaktor.
Da ich die Zahlen bei 1 belassen habe, multipliziere ich mit einem Vergrößerungsfaktor.
Ich berechne nun 8 Punkte für die 4 Linien und zeichne sie.
Für die, die neu sind und das nicht wissen: Im Gegenzug zum Online-Tool läuft +y in VB.Net nach unten! Daher muss ich im Code das umgekehrte Vorzeichen verwenden.
VB.NET-Quellcode
- Public Sub um_y_drehen(ByVal dtheta As Double)
- Theta += dtheta
- If Theta > 90.0 OrElse Theta < (-90.0) Then Return
- 'Dim urspruengliche_Groesse_X As Double = AB.X * enlargement_factor
- 'Dim urspruengliche_Groesse_Y As Double = AC.Y * enlargement_factor
- 'Dim rad As Double = Theta * Math.PI / 180.0
- AB = New Vector3D(Math.Cos(Theta * Math.PI / 180.0), AB.Y, -Math.Sin(Theta * Math.PI / 180.0))
- Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
- CSng(Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor))
- Linie_links(1) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
- CSng(-(Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor)))
- Linie_oben(0) = Linie_links(1)
- Linie_oben(1) = New PointF(CSng(-Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor),
- CSng(-(-Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor)))
- Linie_rechts(0) = Linie_oben(1)
- Linie_rechts(1) = New PointF(CSng(-Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor),
- CSng(-Justierfaktor * Math.Sin(Theta * Math.PI / 180.0) + AC.Y * enlargement_factor))
- Linie_unten(0) = Linie_rechts(1)
- Linie_unten(1) = Linie_links(0)
- FormMain.Label_Theta.Text = "θ = " & Math.Round(Theta, 0).ToString(Deu).PadLeft(2, "0"c) & " °"
- FormMain.PictureBox1.Invalidate()
- End Sub
Das sieht optisch ganz gut aus (zumindest plausibel):
Meine Fragen wären nun:
1.) Könnte mir bitte jemand sagen oder erklären, wie ich diese Projektion korrekt auszuführen habe, also wie die Formel ist? Ich habe schon bei math.stackexchange.com gefragt, aber da kriegst ja keine Antwort. Wahrscheinlich ist das für die zu trivial.
2.) Wie ihr an den auskommentierten Code-Zeilen (Zeilen 5-7) seht, habe ich versucht, die Variablen anzulegen und die Werte zwischenzuspeichern, damit nicht immer wieder derselbe Wert berechnet wird. Das Ganze wird leider ungenau. Bei 90° habe ich nicht die seitliche Kante der Ebene gesehen, sondern es sah so aus, als wäre sie nur um 85° gekippt. Wie kann das sein? Kann mir das jemand bezüglich Speicher erklären? Warum macht es so einen gravierenden Unterschied, ob ich dies schreibe
Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(Theta * Math.PI / 180.0) + AB.X * enlargement_factor)),
oder das?
Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_X)),
3.) Mischdrehung - und projektion
Joa, und für die Drehung um die x-Achse verhält sich das andersherum, also sin und cos umplatzieren:
VB.NET-Quellcode
- Public Sub um_x_drehen(ByVal dphi As Double)
- Phi += dphi
- If Phi > 90.0 OrElse Phi < (-90.0) Then Return
- Dim urspruengliche_Groesse_X As Double = AB.X * enlargement_factor
- Dim urspruengliche_Groesse_Y As Double = AC.Y * enlargement_factor
- Dim rad As Double = Phi * Math.PI / 180.0
- AC = New Vector3D(AC.X, Math.Cos(rad), Math.Sin(rad))
- Linie_links(0) = New PointF(CSng(-(Justierfaktor * Math.Sin(-rad) + urspruengliche_Groesse_X)),
- CSng(-Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_Y))
- Linie_links(1) = New PointF(CSng(-(Justierfaktor * Math.Sin(rad) + urspruengliche_Groesse_X)),
- CSng(-Justierfaktor * Math.Cos(rad) - urspruengliche_Groesse_Y))
- Linie_oben(0) = Linie_links(1)
- Linie_oben(1) = New PointF(CSng(Justierfaktor * Math.Sin(rad) + urspruengliche_Groesse_X),
- CSng(-Justierfaktor * Math.Cos(rad) - urspruengliche_Groesse_Y))
- Linie_rechts(0) = Linie_oben(1)
- Linie_rechts(1) = New PointF(CSng(Justierfaktor * Math.Sin(-rad) + urspruengliche_Groesse_X),
- CSng(-Justierfaktor * Math.Cos(rad) + urspruengliche_Groesse_Y))
- Linie_unten(0) = Linie_rechts(1)
- Linie_unten(1) = Linie_links(0)
- FormMain.Label_Phi.Text = "ϕ = " & Math.Round(Phi, 0).ToString(Deu).PadLeft(2, "0"c) & " °"
- FormMain.PictureBox1.Invalidate()
- End Sub
Das gibt uns:
Leider ist damit keine Mischdrehung und -projektion möglich. Ich weiß, das sind bestimmte Matrizen, aber ich habe mit diesem Thema leider Schwierigkeiten, das Richtige im Netz zu finden. (Ich habe das Gefühl, darüber wird sehr selten gesprochen; entweder, man findet nix oder man findet Doktorarbeiten). Auch, wenn ich Mathe I und II hatte und mich mit Ebenen auskenne und ich ein gutes, räumliches Denkvermögen habe und mir nun einen provisorische Zusammenhang erdenken konnte – diese Projektionsgeschichten haben wir nie gemacht. Ich habe mir vor 2 Tagen ein Video von Prof Loviscach angesehen und bin jetzt dabei, mir das Thema selbst beizubringen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ () aus folgendem Grund: besseres Verständnis. Die bunten Bilder kommen von einem Online-Tool.