Seite 1 von 1

Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 20:53
von DerMeister
Wir nehmen in Mathe gerade Analytische Geometrie durch, und mir haben besonders die grafischen Darstellungen von Punkten, Linien Quadern etc. gefallen. Ich hab jetzt auch ein Programm geschrieben, in dem man Punkte im dreidimensionalen Raum angeben kann, und mithilfe von Verbindungslinien vom Punkt zu den Achsen jeweils erkennen kann, wo genau der Punkt liegt.
Wahrscheinlich werde ich das Programm später noch erweitern, um z.B. auch Vektoren oder Geraden grafisch anschaulich darzustellen.
Eventuell kann man es wegen der vorhandenen Berechnungen auch als Grundbaustein für ein isometrisches Spiel o.ä. nehmen.

Es müsste eigentlich ohne Probleme gehen, die Auflösung oder die Länge der Basis zu ändern, ich hab versucht es relativ frei skalierbar zu machen. Im Unterpunkt "Plots zeichnen" kann man selber neue Plots erstellen, ich hab mal 3 als Beispiel genommen. Und ich hoffe mal auch dass ich bei meinen Kommentaren die mathematischen Begriffe einigermaßen korrekt verwende...
Ich freu mich natürlich über jeden Kommentar, Verbesserungsvorschläge etc. ;)

Code: Alles auswählen

; Author = DerMeister
; Date = 22.12.2010

Procedure.f Sinus(Zahl.f)
  Ergebnis.f = Sin(Zahl.f * #PI / 180 )
  ProcedureReturn Ergebnis
EndProcedure

Procedure.f Cosinus(Zahl.f)
  Ergebnis.f = Cos(Zahl.f * #PI / 180)
  ProcedureReturn Ergebnis
EndProcedure

Procedure.f Tangens(Zahl.f)
  Ergebnis.f = Tan(Zahl.f * #PI / 180)
  ProcedureReturn Ergebnis
EndProcedure

Procedure.f Distance(x1.w,y1.w,x2.w,y2.w)
  ProcedureReturn Sqr(Pow((x1-x2),2) + Pow((y1-y2),2))
EndProcedure

;-Variablen/Konstanten
#Width = 1280
#Height = 1024
#Depth = 32

#OX = #Width/2
#OY = #Height/2

;Länge der Basis
#Basis = 20

;Abstand vom Y-Rand zur X1 bzw. X2 Achse
Global YDistance = (#Height-Tangens(30)*#Width)/2

;Anzahl der Einzelabstände der Achsen zwischen Rand und Ursprung
X12Count = Distance(0,#Height-YDistance,#OX,#OY)/#Basis
X3Count = #Height/2/#Basis

Global Sin30.f = Sinus(30)
Global Cos30.f = Cosinus(30)


Procedure.w XPos(x1.f,x2.f,x3.f=0)
  x = #OX
  ;X1
  x - Cos30*x1*#Basis
  ;X2
  x + Cos30*x2*#Basis
  ProcedureReturn x
EndProcedure

Procedure.w YPos(x1.f,x2.f,x3.f)
  y = #OY
  ;X1
  y + Sin30*x1*#Basis
  ;X2
  y + Sin30*x2*#Basis
  ;X3
  y - x3 * #Basis
  ProcedureReturn y
EndProcedure

Procedure Plot3D(x1.f,x2.f,x3.f)
  x = XPos(x1,x2,x3)
  y = YPos(x1,x2,x3)
  
  ;Punkt zeichnen
  Circle(x,y,#Basis/4,RGB(255,0,0))
  
  ;Parallelen zur Veranschaulichung
  LineColor = 0
  
  ;Parallele zur X1-Achse
  If x2 <> 0 And (x1 = 0 XOr x3 = 0)
    LineXY(x,y,XPos(0,x2,0),YPos(0,x2,0),LineColor)
  EndIf
  ;Parallele zur X2-Achse
  If x3 <> 0 And (x1 = 0 XOr x2 = 0)
    LineXY(x,y,XPos(0,0,x3),YPos(0,0,x3),LineColor)
  EndIf
  ;Parallele zur X3-Achse
  If x1<> 0 And (x2 = 0 XOr x3 = 0)
    LineXY(x,y,XPos(x1,0,0),YPos(x1,0,0),LineColor)
  EndIf
  
  ;Parallelen zu allen Achsen
  If x1 <> 0 And x2 <> 0 And x3 <> 0
    ;Parallele Zur X1-Achse am Punkt selbst
    LineXY(x,y,XPos(0,x2,x3),YPos(0,x2,x3),LineColor)
    ;Parallele zur X1-Achse in der X1X2-Ebene
    LineXY(XPos(x1,x2,0),YPos(x1,x2,0),XPos(0,x2,0),YPos(0,x2,0),LineColor)
    ;Parallele zur X1-Achse in X1X3-Ebene
    LineXY(XPos(0,0,x3),YPos(0,0,x3),XPos(x1,0,x3),YPos(x1,0,x3),LineColor)
    
    ;Parallele zur X2-Achse am Punkt
    LineXY(x,y,XPos(x1,0,x3),YPos(x1,0,x3),LineColor)
    ;Parallele zur X2-Achse in der X1X2-Ebene
    LineXY(XPos(x1,x2,0),YPos(x1,x2,0),XPos(x1,0,0),YPos(x1,0,0),LineColor)
    ;Parallele zur X2-Achse in X2X3-Ebene
    LineXY(XPos(0,0,x3),YPos(0,0,x3),XPos(0,x2,x3),YPos(0,x2,x3),LineColor)
    
    ;Parallele zur X3-Achse am Punkt
    LineXY(x,y,XPos(x1,x2,0),YPos(x1,x2,0),LineColor)
    ;Parallele zur X3-Achse in X1X3-Ebene
    LineXY(XPos(x1,0,x3),YPos(x1,0,x3),XPos(x1,0,0),YPos(x1,0,0),LineColor)
    ;Parallele zur X3-Achse in X2X3-Ebene
    LineXY(XPos(0,x2,x3),YPos(0,x2,x3),XPos(0,x2,0),YPos(0,x2,0),LineColor) 
  EndIf
EndProcedure

InitSprite()
InitKeyboard()

OpenScreen(#Width,#Height,#Depth,"Isometrie")

Repeat
  ExamineKeyboard()
  ClearScreen(RGB(255,255,255))
  
  StartDrawing(ScreenOutput())
  
  ;X1-Achse
  LineXY(-2,#Height-YDistance,#Width-2,YDistance,0)
  LineXY(-1,#Height-YDistance,#Width-1,YDistance,0)
  LineXY(0,#Height-YDistance,#Width,YDistance,0)
  LineXY(1,#Height-YDistance,#Width+1,YDistance,0)
  LineXY(2,#Height-YDistance,#Width+2,YDistance,0)
  
  ;X2-Achse
  LineXY(-2,YDistance,#Width-2,#Height-YDistance,0)
  LineXY(-1,YDistance,#Width-1,#Height-YDistance,0)
  LineXY(0,YDistance,#Width,#Height-YDistance,0)
  LineXY(1,YDistance,#Width+1,#Height-YDistance,0)
  LineXY(2,YDistance,#Width+2,#Height-YDistance,0)
  
  ;X3-Achse
  LineXY(#OX-1,0,#OX-1,#Height,0)
  LineXY(#OX,0,#OX,#Height,0)
  LineXY(#OX+1,0,#OX+1,#Height,0)
  
  
  ;Abstand/Kennzeichnungen
  ;X1
  For k = -X12Count To X12Count
    LineXY(XPos(k,-0.5,0),YPos(k,-0.5,0),XPos(k,0.5,0),YPos(k,0.5,0),0)
    ;Zahlen
    If k%5 = 0 And k <> 0
      DrawText(XPos(k,0.5,0),YPos(k,0.5,0),Str(k),0,RGB(255,255,255))
    EndIf
  Next
  
  ;X2
  For k = -X12Count To X12Count
    LineXY(XPos(0.5,k,0),YPos(0.5,k,0),XPos(-0.5,k,0),YPos(-0.5,k,0),0)
    ;Zahlen
    If k%5 = 0 And k <> 0
      DrawText(XPos(0.5,k,0)-TextWidth(Str(k)),YPos(0.5,k,0),Str(k),0,RGB(255,255,255))
    EndIf
  Next
  
  ;X3
  For k = -X3Count To X3Count
    If k <> 0
      LineXY(#OX-#Basis/2,#OY+#Basis*k,#OX+#Basis/2,#OY+#Basis*k,0)
    EndIf
    ;Zahlen
    If k%5 = 0 And k <> 0
      DrawText(XPos(0,0,k)+#Basis/2+TextWidth(Str(k))/2,YPos(0,0,k)-TextHeight(Str(k))/2,Str(k),0,RGB(255,255,255))
    EndIf
  Next
  
  
  ;-Plots zeichnen
  
  Plot3D(-15,10,5)
  Plot3D(20,10,0)
  Plot3D(0,-10,10)
  
  
  StopDrawing()
  
  FlipBuffers()
  Delay(1)
Until KeyboardPushed(#PB_Key_Escape)
Moved by NicTheQuick: Feedback - Anwendungen → Codes, Tipps & Tricks

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 21:10
von HeX0R
Ist das nur bei mir, oder wieso flackert das wie verrückt?

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 21:13
von DerMeister
HeX0R hat geschrieben:Ist das nur bei mir, oder wieso flackert das wie verrückt?
Könnte eventuell durch das Delay(1) am Ende kommen. Du kannst es ja mal entfernen.

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 21:16
von HeX0R
Soweit war ich auch schon.
Hab auch schon andere Dinge probiert, kann aber am Code nicht wirklich erkennen, woran das liegen könnte,
ausser, dass ich noch nie soviel auf nen Screen gezeichnet habe.

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 21:19
von TomS
Bei mir flackert nix.
@DerMeister: Könntest du bitte den Rückgabewert einer Funktion über den Erfolg auch auswerten? z.B.

Code: Alles auswählen

IF OpenScreen()
Dann könnte jeder deinen Quelltext gleich abändern und müsste nicht erst herausfinden, wie man dein nicht funktionierendes Programm wieder killen kann...

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 21:24
von gnasen
Sieht sehr schön aus, gut gemacht.

Falls du etwas weiterdenken möchtest, hier ein paar Anstöße:
Was passiert, wenn die Basisvektoren (x,y,z) nicht orthonormal (*) sind, kann dann immer noch eine Projektion durchgeführt werden?
Ist es immer noch sinnvoll, jeden Punkt naiv als Punkt im orthonormalen System zu betrachten und zu versuchen ihn auf die "schiefen" Achsen zu projezieren, oder könnte man die schiefen Achsen einfach als neue Basis nehmen?

Was passiert, wenn zwei Vektoren der Basis linear abhängig sind (d.h. sie liegen auf der selben Geraden), kannst du dann noch jeden Punkt als Linearkombination (**) von den Einheitsvektoren darstellen? (In diesem Fall wäre es natürlich keine Basis mehr, aber man sollte denoch einmal darüber nachdenken).
Und wenn du dann noch weiter gehen möchtest, kannst du dir ja überlegen, was mit Geraden passiert, wenn diese abgebildet werden.

(*) zwei Vektoren sind orthonormal, wenn sie im rechten Winkel aufeinander stehen und normiert sind (d.h. die Länge des Vektors beträgt 1. Überleg dir doch mal zu beiden Szenarien (1. nicht rechtwinklig 2.nicht normiert) einzeln was passieren könnte.
(**) Wenn du eine Basis hast, zB im R^3 x=(1,0,0) , y=(0,1,0) , z=(0,0,1), so kannst du jeden Punkt als Linearkombination davon darstellen. zB ist (5,3,1) = 5x+3y+1z eine linearkombination

Ich weiss nicht, wieviel ihr in der Schule gemacht habt, aber dies wären interessante Ansätze um in die lineare Algebra einzusteigen.

Falls du interesse an solchen Sachen hast, solltest du überlegen Mathe zu studieren. Das erste Semester fängt nämlich mit genau diesem Thema (Lineare Algebra 1) an ;)

Edit: Bei mir flackert nichts, alles schick

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 22.12.2010 22:07
von DerMeister
gnasen hat geschrieben: Was passiert, wenn die Basisvektoren (x,y,z) nicht orthonormal (*) sind, kann dann immer noch eine Projektion durchgeführt werden?
Ist es immer noch sinnvoll, jeden Punkt naiv als Punkt im orthonormalen System zu betrachten und zu versuchen ihn auf die "schiefen" Achsen zu projezieren, oder könnte man die schiefen Achsen einfach als neue Basis nehmen?
OK, wir haben bis jetzt nur mit einem orthonormalen System gerechnet (deswegen höre ich das Wort wohl auch zum ersten Mal) und sind wohl auch nie so tief in diese Materie eingestiegen... Aber der Ansatz is natürlich interressant... obwohl mir auf den Moment nicht einfallen würde wie ich das umsetzen könnte...
gnasen hat geschrieben: Was passiert, wenn zwei Vektoren der Basis linear abhängig sind (d.h. sie liegen auf der selben Geraden), kannst du dann noch jeden Punkt als Linearkombination (**) von den Einheitsvektoren darstellen? (In diesem Fall wäre es natürlich keine Basis mehr, aber man sollte denoch einmal darüber nachdenken).
Und wenn du dann noch weiter gehen möchtest, kannst du dir ja überlegen, was mit Geraden passiert, wenn diese abgebildet werden.
Meinst du mit den Vektoren der Basis zwei ursprünglich auf verschiedenen Achsen liegende Vektoren (z.B. auf x1 und x2 Achse)? Wenn zwei Achsen linear abhängig wären, hätte man dann nicht quasi ein 2dimensionales System? Puh, aber das weiterführende kann ich mir gerade nicht wirklich vorstellen...
gnasen hat geschrieben: Falls du interesse an solchen Sachen hast, solltest du überlegen Mathe zu studieren. Das erste Semester fängt nämlich mit genau diesem Thema (Lineare Algebra 1) an ;)
Ich bin übrigens erst von der Informatik (also besonders Programmieren) auf die Mathematik "gekommen", also ich habe nicht angefangen zu programmieren, weil ich in Mathe besonders gut war, sondern durch das Programmieren haben sich meine Mathematikkenntnisse und Interesse erhöht...

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 23.12.2010 16:38
von gnasen
hey finde ich echt cool das du dir darüber Gedanken gemacht hast.

Ein wenig zur Erklärung: Wie du festgestellt hast, gelten in unserem "normalen" 3-dimensionalen Raum schöne Gesetze, wie zB die Projektion auf Achsen. Der Trick ist es, dieses Wissen zu übertragen. Und hier kommt ebend der Trick in der Mathematik.

Wie du gesehen hast, kann man sich die Frage stellen: Wie schauts denn aus, wenn wir unseren Raum mal etwas verbiegen?
In der Physik trifft man des öfteren auf Probleme in irgendwelchen verbogenen Räumen. Jetzt könnte man sich jedesmal fragen wie man denn hier nun rechnet.

Man kann feststellen, dass man zwischen unserem 3D Raum (und noch viel toller, in jedem Raum mit beliebig hoher Dimension, also schon nicht mehr vorstellbar) und einem beliebig krummen anderen Raum eine Funktion findet, die jeweils die Punkte aufeinander abbildet. Und diese Abbildung sorgt dafür, dass wir einfach die Punkte aus dem krummen Raum in unseren schönen hinüberbringen können, hier ein wenig rechnen und das Ergebnis einfach wieder hinüberschicken können.

Und wenn man darüber ein wenig nachdenkt stellt man fest: Hey die Räume sind ja quasi gleich, sie folgen den selben Gesetzen.
Das Verständnis dieser Tatsache kann einem sehr viel helfen, wenn man Koordinatentransformationen für 3D Anwendungen machen muss.

Darf man fragen in welcher Klasse du bist? Mich würde das interessieren, da wir nie solche schönen Sachen in der Schule gemacht hatten :cry:

Re: Isometrische, anschauliche Darstellung von Punkten

Verfasst: 24.12.2010 13:19
von DerMeister
gnasen hat geschrieben:Man kann feststellen, dass man zwischen unserem 3D Raum (und noch viel toller, in jedem Raum mit beliebig hoher Dimension, also schon nicht mehr vorstellbar) und einem beliebig krummen anderen Raum eine Funktion findet, die jeweils die Punkte aufeinander abbildet. Und diese Abbildung sorgt dafür, dass wir einfach die Punkte aus dem krummen Raum in unseren schönen hinüberbringen können, hier ein wenig rechnen und das Ergebnis einfach wieder hinüberschicken können.
Ja, und man muss halt noch diese Funktion finden :). Hier in dem Fall von 3D auf 2D (in isometrischer Darstellung) ging es ganz gut, indem ich mir einfach das Koordinatensystem aufgezeichnet habe, und dann z.B. statt der eigentlichen 90 Grad zwischen den Koordinatenachsen eben die "real" auf dem Blatt vorwiegenden Winkel zu nehmen. Und dann muss man halt noch ein bisschen mit Winkelfunktionen herumrechnen ;)
gnasen hat geschrieben:Und wenn man darüber ein wenig nachdenkt stellt man fest: Hey die Räume sind ja quasi gleich, sie folgen den selben Gesetzen.
Das Verständnis dieser Tatsache kann einem sehr viel helfen, wenn man Koordinatentransformationen für 3D Anwendungen machen muss.
Für mich ist es immer am besten, wenn ich es mir auch richtig vorstellen kann, also am Besten auch selber zeichnen kann. Und für solche krummen Räume ist es oft etwas schwer....
gnasen hat geschrieben:Darf man fragen in welcher Klasse du bist? Mich würde das interessieren, da wir nie solche schönen Sachen in der Schule gemacht hatten :cry:
Also ich bin in der K13 am Gymnasium, und wir nehmen gerade Analytische Geometrie durch, vor allem eben das Rechnen mit Vektoren (Früher hat man das ja auch noch anders gemacht). Die Darstellung von 3D Räumen in einem 2D Raum haben wir jetzt nicht speziell gemacht, wir haben nur z.B. die Projektion von Punkten oder Geraden auf eine Koordinatenebene durchgenomen, (indem man jeweils einen Koordinatenwert = 0 setzt), aber das konnte ich jetzt für die grafische Projektion von 3D auf 2D irgendwie nicht so gebrauchen...