Zum Berechnen der Schnittpunkte zweier Geraden, muss man zuerst die Geraden definieren. Dies geschieht hier über zwei Punkte, Start- und Endpunkt einer Linie.
Wenn man zwei Geraden definiert hat, kann man mit Hilfe der Operatoren "=" bzw. "<>" überprüfen ob es sich um die selbe Gerade handelt oder nicht.
Die Klasse verfügt noch über zwei Funktionen:
parallel_zu: Überprüft ob zwei Geraden Parallel zueinander liegen (kein Schnittpunkt)
schnittpunkt_mit: Berechnet den Schnittpunkt von dieser und einer zweiten Gerade
Spoiler anzeigen
Ein kurzes Anwendungsbeispiel:
Spoiler anzeigen
Mit freundlichen Grüßen
Steve
Wenn man zwei Geraden definiert hat, kann man mit Hilfe der Operatoren "=" bzw. "<>" überprüfen ob es sich um die selbe Gerade handelt oder nicht.
Die Klasse verfügt noch über zwei Funktionen:
parallel_zu: Überprüft ob zwei Geraden Parallel zueinander liegen (kein Schnittpunkt)
schnittpunkt_mit: Berechnet den Schnittpunkt von dieser und einer zweiten Gerade
VB.NET-Quellcode
- Public Structure Point2d
- Public Property X as Double
- Public Property Y as Double
- End Structure
- Public Class Gerade
- ''' <summary>
- ''' Definiert eine Gerade anhand von zwei Punkten
- ''' </summary>
- ''' <param name="p1">Erster Punkt</param>
- ''' <param name="p2">Zweiter Punkt</param>
- ''' <remarks></remarks>
- Public Sub New(ByRef p1 As Point2d, ByRef p2 As Point2d)
- dx = p1.X - p2.X
- dy = p1.Y - p2.Y
- a = dy
- b = -dx
- c = -(a * p1.X + b * p1.Y)
- End Sub
- 'Anhand dieser Werte wird die gerade definiert
- Private ReadOnly dx As Double
- Private ReadOnly dy As Double
- Private ReadOnly a As Double
- Private ReadOnly b As Double
- Private ReadOnly c As Double
- ''' <summary>
- ''' Vergleicht ob es sich um zwei gleiche Geraden handelt
- ''' </summary>
- ''' <param name="G1">Erste Gerade</param>
- ''' <param name="G2">Zweite Gerade</param>
- ''' <returns>Gibt "True" zurück wenn beide Geraden gleich sind</returns>
- ''' <remarks></remarks>
- Public Shared Operator =(ByVal G1 As Gerade, ByVal G2 As Gerade) As Boolean
- Return Abs((G1.a * G2.b) - (G1.b * G2.a)) <= Double.Epsilon AndAlso Abs((G1.b * G2.c) - (G1.c * G2.b)) <= Double.Epsilon AndAlso Abs((G1.a * G2.c) - (G1.c * G2.a)) <= Double.Epsilon
- End Operator
- ''' <summary>
- ''' Vergleicht ob es sich nicht um zwei gleiche Geraden handelt
- ''' </summary>
- ''' <param name="G1">Erste Gerade</param>
- ''' <param name="G2">Zweite Gerade</param>
- ''' <returns>Gibt "True" zurück wenn beide Geraden nicht gleich sind</returns>
- ''' <remarks></remarks>
- Public Shared Operator <>(ByVal G1 As Gerade, ByVal G2 As Gerade) As Boolean
- Return Not Abs((G1.a * G2.b) - (G1.b * G2.a)) <= Double.Epsilon AndAlso Abs((G1.b * G2.c) - (G1.c * G2.b)) <= Double.Epsilon AndAlso Abs((G1.a * G2.c) - (G1.c * G2.a)) <= Double.Epsilon
- End Operator
- ''' <summary>
- ''' Prüft ob eine Gerade parallel zu der aktuellen Gerade ist
- ''' </summary>
- ''' <param name="G">Die zweite Gerade</param>
- ''' <returns>Gibt "True" zurück wenn die Geraden parallel sind</returns>
- ''' <remarks></remarks>
- Public Function parallel_zu(ByRef G As Gerade) As Boolean
- return Abs((Me.a * G.b) - (G.a * Me.b)) <= Double.Epsilon andalso ((G.a * Me.b) <= -Double.Epsilon andalso (G.a * Me.b) >= double.Epsilon)
- End Function
- ''' <summary>
- ''' Errechnet den Schnittpunkt einer Gerade mit der aktuellen Gerade
- ''' </summary>
- ''' <param name="G">Die zweite Gerade</param>
- ''' <returns>Gibt die Koordinaten des Schnittpunkts zurück</returns>
- ''' <remarks></remarks>
- Public Function schnittpunkt_mit(ByRef G As Gerade) As Point2d
- If Me.parallel_zu(G) Then Throw New Exception("Geraden verlaufen Parallel!")
- If Me = G Then Throw New Exception("Beide Geraden sind gleich!")
- If Me.a <> 0 Then
- Dim y As Double = (G.a / Me.a * Me.c - G.c) / (G.b - G.a / Me.a * Me.b)
- Dim x As Double = (Me.b * y + Me.c) / (-Me.a)
- Return New Point2d With {.X = x, .Y = y}
- Else
- Return G.schnittpunkt_mit(Me)
- End If
- End Function
- End Class
Ein kurzes Anwendungsbeispiel:
VB.NET-Quellcode
- Sub test()
- Dim Startpunkt1 As New Point2d With {.X = 1, .Y = 5}
- Dim Endpunkt1 As New Point2d With {.X = 9, .Y = 4.2}
- Dim G1 As New Gerade(Startpunkt1, Endpunkt1)
- Dim Startpunkt2 As New Point2d With {.X = 81, .Y = 12}
- Dim Endpunkt2 As New Point2d With {.X = 6, .Y = 32}
- Dim G2 As New Gerade(Startpunkt2, Endpunkt2)
- Dim Schnittpunkt As Point2d
- If Not G1.parallel_zu(G2) Then
- Schnittpunkt = G1.schnittpunkt_mit(G2)
- End If
- MsgBox("X = " & Schnittpunkt.X & vbCrLf & "Y = " & Schnittpunkt.Y)
- End Sub
Mit freundlichen Grüßen
Steve
SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=
Weil einfach, einfach zu einfach ist!
Weil einfach, einfach zu einfach ist!
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „BiedermannS“ ()