Hallo zusammen,
ich habe mir eine Klasse geschrieben, die mir Punkte auf einer Kugeloberfläche speichert. Wenn ich diese Kugel (erst einmal in 2D) zeichne, will ich alle paar Höhenpixel eine andere Farbe nehmen. Leider läuft das schief. Woran liegt's? Ich habe bereits ausprobiert:
1.) Step der For loop auf 0.25 -> Programm rattert ewig... Zeichnung wird nicht besser
2.) Step der For loop auf 0.5 -> Zeichnung ist schlecht wie im angehängten Bild
3.) Step der For loop auf 1 -> Zeichnung ist (logischerweise) schlechter (mehr Löcher an den Rändern etc).
Dies ist die Class_HalfSphere.vb
Spoiler anzeigen
und dies die Form1.vb
Spoiler anzeigen
Viele Grüße
Bartosz
ich habe mir eine Klasse geschrieben, die mir Punkte auf einer Kugeloberfläche speichert. Wenn ich diese Kugel (erst einmal in 2D) zeichne, will ich alle paar Höhenpixel eine andere Farbe nehmen. Leider läuft das schief. Woran liegt's? Ich habe bereits ausprobiert:
1.) Step der For loop auf 0.25 -> Programm rattert ewig... Zeichnung wird nicht besser
2.) Step der For loop auf 0.5 -> Zeichnung ist schlecht wie im angehängten Bild
3.) Step der For loop auf 1 -> Zeichnung ist (logischerweise) schlechter (mehr Löcher an den Rändern etc).
Dies ist die Class_HalfSphere.vb
VB.NET-Quellcode
- #Disable Warning IDE1006 ' Benennungsstile
- Imports System.Windows.Media.Media3D
- Public NotInheritable Class Class_HalfSphere
- Public Phi As UInt16 = 0US
- Public Theta As UInt16 = 0US
- Public ReadOnly Liste_mit_allen_Vektoren As New List(Of Vector3D)
- Private ReadOnly Liste_thetas As New List(Of Double)
- Private ReadOnly Liste_phis As New List(Of Double)
- Public Sub New(ByVal Radius As Double)
- For _phi As Double = 0.0 To 359.0 Step 0.5
- For _theta As Double = 0.0 To 90.0 Step 0.5
- Liste_mit_allen_Vektoren.Add(New Vector3D(
- Radius * Math.Cos(_phi * Math.PI / 180.0) * Math.Sin(_theta * Math.PI / 180.0),
- Radius * Math.Sin(_phi * Math.PI / 180.0) * Math.Sin(_theta * Math.PI / 180.0),
- Radius * Math.Cos(_theta * Math.PI / 180.0))
- )
- Liste_thetas.Add(_theta)
- Liste_phis.Add(_phi)
- Next
- Next
- End Sub
- 'Private Function unitV(ByVal par As Double, ByVal xx As Double, ByVal yy As Double, ByVal zz As Double) As Double
- ' Return par / Math.Sqrt(Math.Pow(xx, 2.0) + Math.Pow(yy, 2.0) + Math.Pow(zz, 2.0))
- 'End Function
- Public Function getVector() As Vector3D
- Dim Value As Vector3D
- For i As Integer = 0 To Liste_mit_allen_Vektoren.Count - 1 Step 1
- If Liste_phis(i) = CDbl(Phi) AndAlso Liste_thetas(i) = CDbl(Theta) Then
- Value = Liste_mit_allen_Vektoren(i)
- Return Value
- End If
- Next
- Return Value
- End Function
- End Class
- #Enable Warning IDE1006 ' Benennungsstile
und dies die Form1.vb
VB.NET-Quellcode
- Imports System.Windows.Media.Media3D
- Public NotInheritable Class FormMain
- Private ReadOnly Deu As New System.Globalization.CultureInfo("de-DE")
- Private half_sphere As Class_HalfSphere
- Private program_has_finished_loading As Boolean = False
- Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Me.BackColor = Color.FromArgb(171, 207, 181)
- PictureBox1.BackColor = Color.White
- End Sub
- Private Sub FormMain_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
- Select Case e.KeyCode
- Case Keys.NumPad8
- If half_sphere.Theta > 0US Then
- half_sphere.Theta -= 1US
- Vektor_finden()
- End If
- Case Keys.NumPad2
- If half_sphere.Theta < 90US Then
- half_sphere.Theta += 1US
- Vektor_finden()
- End If
- Case Keys.NumPad4
- If half_sphere.Phi < 360US Then
- half_sphere.Phi += 1US
- Vektor_finden()
- End If
- If half_sphere.Phi = 360US Then half_sphere.Phi = 0US
- Case Keys.NumPad6
- If half_sphere.Phi > 0US Then
- half_sphere.Phi -= 1US
- Vektor_finden()
- End If
- Case Else
- Exit Select
- End Select
- TextBox_theta.Text = half_sphere.Theta.ToString(Deu).PadLeft(2, "0"c) & " °"
- TextBox_phi.Text = half_sphere.Phi.ToString(Deu).PadLeft(2, "0"c) & " °"
- End Sub
- Private Sub FormMain_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
- half_sphere = New Class_HalfSphere(190.0)
- program_has_finished_loading = True
- End Sub
- Private Sub Vektor_finden()
- Dim meingefundenerVektor As Vector3D = half_sphere.getVector()
- TextBox_x.Text = Math.Round(meingefundenerVektor.X, 3).ToString(Deu)
- TextBox_y.Text = Math.Round(meingefundenerVektor.Y, 3).ToString(Deu)
- TextBox_z.Text = Math.Round(meingefundenerVektor.Z, 3).ToString(Deu)
- End Sub
- Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
- PictureBox1.Invalidate()
- End Sub
- Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
- If Not program_has_finished_loading Then Return
- If e.Graphics Is Nothing Then Return
- e.Graphics.TranslateTransform(CSng(PictureBox1.Size.Width / 2.0), CSng(PictureBox1.Size.Height / 2.0))
- e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
- e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
- e.Graphics.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
- e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
- For i As Integer = 0 To half_sphere.Liste_mit_allen_Vektoren.Count - 1 Step 3
- If CInt(half_sphere.Liste_mit_allen_Vektoren(i).Z) Mod 30 = 0 Then
- Using PenGruen As New Pen(Color.FromArgb(0, 173, 0), 1.0F)
- e.Graphics.DrawLine(
- PenGruen,
- 0.0F,
- 0.0F,
- CSng(half_sphere.Liste_mit_allen_Vektoren(i).X),
- CSng(-half_sphere.Liste_mit_allen_Vektoren(i).Z))
- End Using
- Else
- Using PenBlau As New Pen(Color.FromArgb(0, 204, 255), 1.0F)
- e.Graphics.DrawLine(
- PenBlau,
- 0.0F,
- 0.0F,
- CSng(half_sphere.Liste_mit_allen_Vektoren(i).X),
- CSng(-half_sphere.Liste_mit_allen_Vektoren(i).Z)) 'Negatives Vorzeichen weil y in VB.net nach unten positiv läuft.
- End Using
- End If
- Next
- End Sub
- End Class
Viele Grüße
Bartosz
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()