Isometrische, anschauliche Darstellung von Punkten
Verfasst: 22.12.2010 20:53
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.
Moved by NicTheQuick: Feedback - Anwendungen → Codes, Tipps & Tricks
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)