Linie zeichnen nur auf weiß

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Turtle10.

    Hey,

    um was für Linien handelt es sich denn? Wenn es nur gerade Linien sind, könntest du so vorgehen:
    - erstelle eine Gerade, die durch den Anfangs- und Endpunkt deiner neu zu zeichnenden Linie geht
    - erstelle für jede bereits vorhandene Linie ebenfalls eine solche Gerade
    - prüfe, ob sich deine erste Gerade mit einer der anderen schneidet
    - wenn ja, überprüfe, ob der Schnittpunkt zwischen Anfangs- und Endpunkt der beiden sich schneidenden Geraden liegt; wenn ja, kann die Linie nicht gezeichnet werden.

    MfG
    Turtle10
    Die kriegst du aber ganz leicht aus den beiden Endpunkten deiner Linien ;) Nehmen wir mal an, die Linie, die neu gezeichnet werden soll, hat die Endpunkte p1 und p2 (wobei du die beiden Punkte sortieren musst, sodass p1 die kleinere x-Koordinate hat). Die Gerade, die durch diese Linie verlaufen soll, hat ja die allgemeine Form f(x) = m*x+c. Nun bekommst du die Parameter m und c über folgende Gleichungen:

    m = (p2.Y - p1.Y)/(p2.X - p1.X)
    c = -m*p1.X + p1.Y

    Du musst halt nur aufpassen im Fall p2.X = p1.X (d.h. wenn die Linie senkrecht ist) - diesen Fall musst du gesondert betrachten...
    Für jede Linie bekommst du auf diese Weise eine Geradengleichung.


    MfG
    Turtle10
    so ich habe nun die Klasse Gerade und so, aber wie setze ich die zwei Funktionen gleich und löse auf x auf :D. Habe es so versucht geht aber nicht.

    VB.NET-Quellcode

    1. Private Function kollision(ByVal distanz As Integer, ByVal p As Player) As Boolean
    2. Dim treffer As Boolean = False
    3. For i As Integer = 0 To geraden.Count - 2
    4. For j As Integer = 0 To spielebene.Width - 1
    5. Dim wert As Double = geraden(geraden.Count - 1).getFunktionsWert(j)
    6. Dim wert2 As Double = geraden(i).getFunktionsWert(j)
    7. If wert = wert2 Then
    8. treffer = True
    9. End If
    10. Next
    11. Next
    12. Return treffer
    13. End Function


    geraden(geraden.Count - 1) ist die neuste Gerade

    Edit:
    Tut mir leid für doppel Post. Hab es erst zuspät bemerkt, da hab ich schon auf Absenden geklickt
    Hey,

    Na ja, du hast ja zwei Funktionsgleichungen: f(x) = m1*x+c1 und g(x) = m2*x+c2. Gleichsetzen und Auflösen nach x liefert dann

    x = (c2-c1)/(m1-m2) (*)

    Jetzt musst du nur noch überprüfen, ob der Schnittpunkt tatsächlich auf deinen Linien liegt (bisher weißt du ja nur, dass er auf der Geraden liegt). Dazu brauchst du die Endpunkte deiner zwei Linien, deren Schnittpunkt du überprüfst, nennen wir sie p1 und p2 für die eine und q1 bzw. q2 für die andere Linie. Gilt nun

    x >= max(p1.X, q1.X) und x <= min(p2.X, q2.X)

    dann hast du einen Schnitt zweier Linien.

    Was du nur beachten musst sind gewisse Sonderfälle
    - eine (oder sogar beide) der Geraden ist senkrecht: in diesem Fall kannst du keine Geradengleichung angeben.
    - beide Geraden haben die gleiche Steigung. Dann kommt es in der Gleichung (*) zu einer Division durch 0.

    Für diese Fälle müssen wir uns noch was einfallen lassen ;) Ich denk noch mal drüber nach...

    Da du die Linien sowieso immer brauchst, würde ich mir überlegen, anstatt der Geraden-Klasse bzw. zusätzlich zu ihr eine Klasse/ Struktur "Linie" zu verwenden, in der du die einzelnen Linien in Form ihrer Endpunkte verwaltest. Dann kannst du aus diesen Endpunkten ggf. sogar die Geradenparameter dynamisch berechnen oder sogar mit in der Linien-Klasse verwalten (sozusagen eine kombinierte Linien-/ Geradenklasse).

    MfG
    Turtle10