Kugel oder Würfel berechen und als grafik ausgeben?

Klaiba

Grünschnabel
Kugel oder Würfel berechen und als grafik ausgeben
wie geht des mit visual basic

ich habe nur soweit mitgekriegtr das mand as mit shapes machen kann...

wäre spitze wenn ihr mir helfen könnten ich hoffe es kostet auch nich zuviel Zeit :rolleyes:
 
2D ist einfach!

Man nehme n Shape und ziehe das einfach! dann in den eigenschaften das gewünschte objekt wählen!
Rechteck, Quadrat, Kreis, Oval,...

3D ist Sehr Komplex!
Da empfehle ich DirectX! ist einfacher und Schneller, in der Grafik!

Wen das nicht machen willst, kannste das natürlich auch auf der Form oder ähnlichem ausgeben!

Hier mal n kleiner Ansatz!

Grundsätzlich ist n Würfel einfach zu zeichnen!
3Dimensionen, heist 3Positionen PRO PUNKT! Nicht pro Linie! Pro Linie sind das 6 Punkte!

X, Y und Z

X = Linker abstand
Y = Abstand von Oben
Z = Abstand von Vorne bzw Hinten!

Jetz wirds komplex!
Wenn das ding jetz noch drehen willst, musst du die 3D-Vektordaten in 2D-Positionen umrechnen! ... Habe das zwar mal gemacht, für mein Rocket-Desinge Prog, aber ist schon n bischen her! :rolleyes:

Naja... werds schon noch zam kriegen....

fangen wir einfach mal damit an, uns mit dem 3D-Raum zu beschäftigen!

Wenn n Würfel im 3D zeichnen willst, brauchst du, wie schon erwähnt 3Daten! X, Y und Z!
Den Würfel zeichnen wir erstmal nur mit linien!
Dazu brauchen wir insgesamt 3 Grössen! Breite, Höhe und Tiefe!
Zeichnen tun wir das ab Position 0,0,0 also X = 0, Y = 0 und Z = 0.

B = Breit, H = Höhe, T = Tiefe
B = 100
H = 100
T = 100

Berechnen wird das ganze über einen KREIS! ... auch Würfel werden über einen Kreis bereichen! Brei Kugeln ist das noch n Stück komplexer, und dauert dementsprechend länger (Rechen-Zeit der CPU bzw. des PCs)

Wenn du schon einmal n Kreis berechnet hast, hilft uns das enorm weiter, da du weist wies grundsätzlich geht!

Anfangen tun wir mit der ersten Linie!
Stell dir vor, du hast einen würfel vor deiner Nase, und du drehst ihn um eine achse! Welche ist vorerst egal aber wir nehmen mal die Y achse!
Wenn wir den würfel jetzt drehen, sieht man, das sich der würfen (von oben gesehen) mit allen 4 ecken im grunde in einem Kreis bewegen! und das können wir berechnen!

Hier mal n kleines Control, das ich geschrieben habe, um Kreise darzustellen, inklusive Graf!
 
Code:
Option Explicit

Dim XWinkel As Long
Dim KColor As OLE_COLOR
Dim FColor As OLE_COLOR
Dim GStart As Long
Dim GCount As Long
Dim GStep As Long
Dim GUse As Boolean
Dim GWidth As Long
Dim UWidth As Boolean

Public Function MK()
On Error Resume Next
Dim convert As Double
Dim X As Long
Dim Y As Long
Dim Z As Long
Dim XHX, XCX, XPX
Dim Radi As Long
If UWidth = True Then
    Radi = UserControl.Width / 2
Else
    Radi = UserControl.Height / 2
End If
convert = 3.141593 / 180
UserControl.Cls

If GUse = True Then
    UserControl.ForeColor = KColor
    XHX = GWidth
    For Z = GStart To GCount Step GStep
        UserControl.Line (Radi - (Sin(-Z * convert) * (Radi - XHX)), Radi - (Sin((90 + Z) * convert) * (Radi - XHX)))-(Radi - (Sin(-Z * convert) * Radi), Radi - (Sin((90 + Z) * convert) * Radi))
    Next
    If UWidth = True Then
        XHX = (UserControl.Width / 2) - XHX
    Else
        XHX = (UserControl.Height / 2) - XHX
    End If
Else
    If UWidth = True Then
        XHX = (UserControl.Width / 2)
    Else
        XHX = (UserControl.Height / 2)
    End If
End If
UserControl.ForeColor = FColor
Z = XWinkel
UserControl.Line (Radi, Radi)-(Radi - (Sin(-Z * convert) * XHX), Radi - (Sin((90 + Z) * convert) * XHX))
End Function

Public Property Get Value() As Long
On Error Resume Next
Value = XWinkel
End Property

Public Property Let Value(ByVal vNewValue As Long)
On Error Resume Next
XWinkel = vNewValue
MK
End Property

Public Property Get ForeColor() As OLE_COLOR
On Error Resume Next
ForeColor = FColor
End Property

Public Property Let ForeColor(ByVal vNewValue As OLE_COLOR)
On Error Resume Next
FColor = vNewValue
MK
End Property

Public Property Get BackColor() As OLE_COLOR
On Error Resume Next
BackColor = UserControl.BackColor
End Property

Public Property Let BackColor(ByVal vNewValue As OLE_COLOR)
On Error Resume Next
UserControl.BackColor = vNewValue
MK
End Property

Public Property Get KreisColor() As OLE_COLOR
On Error Resume Next
KreisColor = KColor
End Property

Public Property Let KreisColor(ByVal vNewValue As OLE_COLOR)
On Error Resume Next
KColor = vNewValue
MK
End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
On Error Resume Next
UserControl.BackColor = PropBag.ReadProperty("BACKCOLOR")
FColor = PropBag.ReadProperty("FORECOLOR")
KColor = PropBag.ReadProperty("KREISCOLOR")
XWinkel = PropBag.ReadProperty("WINKEL")

GUse = PropBag.ReadProperty("GUSE")
GStart = PropBag.ReadProperty("GStart")
GStep = PropBag.ReadProperty("GStep")
GCount = PropBag.ReadProperty("GCount")
GWidth = PropBag.ReadProperty("GWidth")

UWidth = PropBag.ReadProperty("UWidth")
MK
End Sub

Private Sub UserControl_Resize()
On Error Resume Next
MK
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
On Error Resume Next
Call PropBag.WriteProperty("BACKCOLOR", UserControl.BackColor)
Call PropBag.WriteProperty("FORECOLOR", FColor)
Call PropBag.WriteProperty("KREISCOLOR", KColor)
Call PropBag.WriteProperty("WINKEL", XWinkel)

Call PropBag.WriteProperty("GUSE", GUse)
Call PropBag.WriteProperty("GStart", GStart)
Call PropBag.WriteProperty("GStep", GStep)
Call PropBag.WriteProperty("GCount", GCount)
Call PropBag.WriteProperty("GWidth", GWidth)

Call PropBag.WriteProperty("UWidth", UWidth)
End Sub

Public Property Get UseGraf() As Boolean
On Error Resume Next
UseGraf = GUse
End Property

Public Property Let UseGraf(ByVal vNewValue As Boolean)
On Error Resume Next
GUse = vNewValue
MK
End Property

Public Property Get GrafWertStart() As Long
On Error Resume Next
GrafWertStart = GStart
End Property

Public Property Let GrafWertStart(ByVal vNewValue As Long)
On Error Resume Next
GStart = vNewValue
MK
End Property

Public Property Get GrafWertCount() As Long
On Error Resume Next
GrafWertCount = GCount
End Property

Public Property Let GrafWertCount(ByVal vNewValue As Long)
On Error Resume Next
GCount = vNewValue
MK
End Property

Public Property Get GrafWertStep() As Long
On Error Resume Next
GrafWertStep = GStep
End Property

Public Property Let GrafWertStep(ByVal vNewValue As Long)
On Error Resume Next
GStep = vNewValue
MK
End Property

Public Property Get GrafWertWidth() As Long
On Error Resume Next
GrafWertWidth = GWidth
End Property

Public Property Let GrafWertWidth(ByVal vNewValue As Long)
On Error Resume Next
GWidth = vNewValue
MK
End Property

Public Property Get UseWhisWidth() As Boolean
On Error Resume Next
UseWhisWidth = UWidth
End Property

Public Property Let UseWhisWidth(ByVal vNewValue As Boolean)
On Error Resume Next
UWidth = vNewValue
MK
End Property
 
Ich weis, das ist n haufen code, aber wenn dich da reinarbeitest, können wir auch einen grossen schrit nach vorne machen! :D

Wir man sehen kann, ist das eigentlich nichts anderes als ne ständige sinusberechnung von 2 Punkten, die wir auf 2 Achsen verteilen! (x und Y)

Ein Würfel ist ähnlich zu berechenen!

Wenn man nun eine achse nicht mit berechnent, sieht das ganze zwar etwas merkwürdig aus, allerdings ist genau dies, was wir jetzt brauchen!

Lösche einfach mal bei der zeichnung "LINE"-Funktion die Y Berechnung! ... nun haste ne horizontale linie!

Verpacke das ganze in eine eigene funktion (das zeichnen der linie) und stezte nen timer ein, der ständig den Winkel (Z) ändert!

Nun siehst du ne linie, die von links und rechts ständig zur mitte läuft, und wieder auseinander! ... was man nicht sieht, ist das die beiden punkte ständig die seiten wechseln!
Also, punkt eins geht von links nach rechts, und punkt 2 von rechts nach links!

Kannste auch mit Point-Funktion kontrolieren!

Das ganze machen wir nun noch einmal, nur das wir Y um ca. 100 nach unten versetzen!
Also, 2X die Line-Funtion! einmal mit Y = 0 und einmal mit Y = 100.

Jetzt haben wir zwei linien! die eine bei 0 und die zweite bei 100!

Man verbinde die punkte der Linien miteinander, und schon haben wir eine Wand, die die seite wechselt! also nen würfel mit 1er seite!

diese berechnung kann man nun auch auf die Y achse erweitern!

Das Schwierige allerdings ist, das ganze räumlich dar zu stellen! dazu musst du JEDEN Punkt, X und Y mit allen 3 Achsen Verbinden!, sonnst läuft dir ein würfel auf total merkwürdige art und weise duch den raum!

Wenn das hast, und das auch bei dir , schreib einfach nochmal! ... bis dahin suche ich mir das ganze gefussel nochmal raus, und verfass mal n anständigen text, mit dem auch Ich was anfangen kann :rolleys:

Greez
Martin


PS: Da der server das anscheinend nicht packt (Das ganze auf einmal zu schlucken), musste ich das als 3Messages versenden!

SORRY! (@Admins)
 
Zurück