Gleichungen mit Variablen

15/04/2010 - 12:56 von Alexander Richter | Report spam
Hallo,
das Lösen von Gleichungen mit einem Programm, habe ich schon öfters
umgesetzt.
Wie löse ich aber Gleichnungen mit Variablen?

Beispiel:
Ich will den Schnittpunkt von zwei Geraden ermitteln.
Dazu muss ich für jede Gerade die Geradengleichung erstellen.
Für die erste Gerade mit den Punkten P1(1,2) und P2(3,4) - immer P(x,y)- ist
folgendes notwendig.

y - y1 = (y2 -y1) / (x2 - x1) * (x -x1) <-- Ausgangsgleichung
y - 2 = (4 - 2) / (3 - 1) * (x - 1) <-- y - 2 = 2 /
2 * (x -1)
y - 2 = x -1
y = 1 * x +1 <-- so soll
die Geradengleichung aussehen

Das gleiche für die zweite Gerade u.s.w.
Wie setze ich die oberen Gleichungen mit VB um?


Alexander
 

Lesen sie die antworten

#1 Armin Zingler
15/04/2010 - 15:06 | Warnen spam
Am 15.04.2010 12:56, schrieb Alexander Richter:
Hallo,
das Lösen von Gleichungen mit einem Programm, habe ich schon öfters
umgesetzt.
Wie löse ich aber Gleichnungen mit Variablen?

Beispiel:
Ich will den Schnittpunkt von zwei Geraden ermitteln.
Dazu muss ich für jede Gerade die Geradengleichung erstellen.
Für die erste Gerade mit den Punkten P1(1,2) und P2(3,4) - immer P(x,y)- ist
folgendes notwendig.

y - y1 = (y2 -y1) / (x2 - x1) * (x -x1) <-- Ausgangsgleichung
y - 2 = (4 - 2) / (3 - 1) * (x - 1) <-- y - 2 = 2 /
2 * (x -1)
y - 2 = x -1
y = 1 * x +1 <-- so soll
die Geradengleichung aussehen

Das gleiche für die zweite Gerade u.s.w.
Wie setze ich die oberen Gleichungen mit VB um?



Also sind pro Gerade zwei Punkte gegeben?

Zu berücksichtigen sind die Lagen, die zwei Geraden zueinander haben können.

Außerdem kann es vertikale Geraden geben, weswegen die Form der Gleichung
x = Wert
und nicht mehr
y = mx + t
ist. Deswegen würde ich logisch an die Sache rangehen. Mit der Vektorschreibweise
(P = V1 + s*V2) tàte man sich leichter, aber deinem obigem Beispiel nach ist
das nicht gefragt.

Ich hab mich mal ausgetobt...: (auch wenn das schon x-fach programmiert wurde)
(Achtung, ungetestet!)

Structure PointR
Public X, Y As Double
Shared Operator =(ByVal P1 As PointR, ByVal P2 As PointR) As Boolean
Return P1.X = P2.X AndAlso P1.Y = P2.Y
End Operator
Shared Operator <>(ByVal P1 As PointR, ByVal P2 As PointR) As Boolean
Return P1.X <> P2.X OrElse P1.Y <> P2.Y
End Operator
End Structure

Class Gerade
Public P1, P2 As PointR

Sub New(ByVal P1 As PointR, ByVal P2 As PointR)

If P1 = P2 Then
Throw New ArgumentException("P1 and P2 must be different")
End If

Me.P1 = P1
Me.P2 = P2
End Sub
Public ReadOnly Property IsHorizontal() As Boolean
Get
Return P1.Y = P2.Y
End Get
End Property
Public ReadOnly Property IsVertical() As Boolean
Get
Return P1.X = P2.X
End Get
End Property
Public ReadOnly Property Steigung() As Double
Get
If IsVertical Then
Throw New InvalidOperationException
End If

Return (P2.Y - P1.Y) / (P2.X - P1.X)
End Get
End Property
Public ReadOnly Property AchsenAbschnitt() As Double
Get
If IsVertical Then
Throw New InvalidOperationException
End If

If IsHorizontal Then
Return P1.Y
Else
Return P1.Y - Steigung * P1.X
End If
End Get
End Property
Private ReadOnly Property YDiff() As Double
Get
Return P2.Y - P1.Y
End Get
End Property
Private ReadOnly Property XDiff() As Double
Get
Return P2.X - P1.X
End Get
End Property

Enum Lage
SchnittPunkt
Parallel
Identisch
End Enum

Shared Function BerechneSchnittpunkt( _
ByVal Gerade1 As Gerade, ByVal Gerade2 As Gerade, _
ByRef Schnittpunkt As PointR) As Lage

If Gerade1.IsHorizontal Then
If Gerade2.IsHorizontal Then
If Gerade1.P1.Y = Gerade2.P1.Y Then
Return Lage.Identisch
Else
Return Lage.Parallel
End If
Else
Schnittpunkt.Y = Gerade1.P1.Y

If Gerade2.IsVertical Then
Schnittpunkt.X = Gerade2.P1.X
Else
Schnittpunkt.X = (Schnittpunkt.Y - Gerade2.AchsenAbschnitt) / Gerade2.Steigung
End If

Return Lage.SchnittPunkt
End If
ElseIf Gerade1.IsVertical Then
If Gerade2.IsVertical Then
If Gerade1.P1.X = Gerade2.P1.X Then
Return Lage.Identisch
Else
Return Lage.Parallel
End If
Else
Schnittpunkt.X = Gerade1.P1.X

If Gerade2.IsHorizontal Then
Schnittpunkt.Y = Gerade2.P1.Y
Else
Schnittpunkt.Y = Gerade2.Steigung * Schnittpunkt.X + Gerade2.AchsenAbschnitt
End If

Return Lage.SchnittPunkt
End If
Else
If Gerade2.IsHorizontal Then
Schnittpunkt.Y = Gerade2.P1.Y
Schnittpunkt.X = (Schnittpunkt.Y - Gerade1.AchsenAbschnitt) / Gerade1.Steigung
Return Lage.SchnittPunkt
ElseIf Gerade2.IsVertical Then
Schnittpunkt.X = Gerade2.P1.X
Schnittpunkt.Y = Gerade1.Steigung * Schnittpunkt.X + Gerade1.AchsenAbschnitt
Return Lage.SchnittPunkt
Else
If Gerade1.Steigung = Gerade2.Steigung Then
If Gerade1.AchsenAbschnitt = Gerade2.AchsenAbschnitt Then
Return Lage.Identisch
Else
Return Lage.Parallel
End If
Else
Schnittpunkt.X = (Gerade2.AchsenAbschnitt - Gerade1.AchsenAbschnitt) / (Gerade1.Steigung - Gerade2.Steigung)
Schnittpunkt.Y = Gerade1.Steigung * Schnittpunkt.X + Gerade1.AchsenAbschnitt
Return Lage.SchnittPunkt
End If
End If
End If

End Function
End Class


Ich kommentiere das jetzt nicht weiter. Einfach fragen bei Bedarf.

Armin

Ähnliche fragen