Berechnen, ob ein Punkt in einem Dreieck liegt??

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

BasicTobi

Betreff: Berechnen, ob ein Punkt in einem Dreieck liegt??

BeitragFr, Apr 07, 2006 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, wie der Titel schon sagt, suche ich nach einer Möglichkeit zu bestimmen, ob ein Punkt in einem Dreieck liegt. Der Punkt und das Dreieck liegen in einem 2D Raum. Ich hab jetzt schon paar Versuche gestartet, aber mir steht komplett jemand aufm Schlauch.... Hab auch schon heir gescuht aber nix gefunden. Das Problem ist außerdem, dass die Routine möglichst schnell sein sollte, da ich dadurch eine einfache Kollisionserkennung realisieren will.

Also, wenn jemand ne Idee hat, einfach posten
Danke schonmal im Voraus!

MfG Tobi
Gruß Tobi

Geeecko

BeitragFr, Apr 07, 2006 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
vllt. eine for schleife von x zu y' und von x zu y'' und dann if punkx = x
und punkty=y print der punkt liegt im dreieck... mit einer seite^^
 

BasicTobi

BeitragFr, Apr 07, 2006 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wäre eine Möglichkeit, doch leider kann ich die nicht anwenden, da ich mit Floats arbeite.
Danke trotzdem!

Gruß Tobi
Gruß Tobi

Firstdeathmaker

BeitragFr, Apr 07, 2006 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurze Frage, willst du damit die Imagecollide Funktion umgehen? Wenn ja: Mach´s dir nicht zu kompliziert.

Edit: Habs hinbekommen (Bin ein klein wenig stolz auf mich Wink )

BlitzBasic: [AUSKLAPPEN]
Graphics 400,300,32,2
SetBuffer BackBuffer()


X1 = 0
Y1 = 0

X2 = 250
Y2 = 200

X3 = 20
Y3 = 60



Repeat
Cls

Text 10,10,InTriangle(X1,Y1,X2,Y2,X3,Y3,MouseX(),MouseY())

Line X1,Y1,X2,Y2
Line X2,Y2,X3,Y3
Line X3,Y3,X1,Y1

Flip
Until KeyHit(1)
End



;Hauptfunktion die du gesucht hast
;X/Y 1-3 sind die Eckpunkte des Dreiecks, Xs/Ys ist der Punkt der darauf geprüft wird ob er im Dreieck liegt.
Function InTriangle(X1#,Y1#,X2#,Y2#,X3#,Y3#,Xs#,Ys#)
Local Xa#,Ya#,Xb#,Yb#,Xc#,Yc#
Local m#,b#
Local tmpX#,tmpY

;Erste Prüfung: Liegt Ps überhaupt im Definitionsbereich des Dreiecks?
If (Xs<X1 And Xs<X2 And Xs<X3) Or (Xs>X1 And Xs>X2 And Xs>X3) Return 0
If (Ys<Y1 And Ys<Y2 And Ys<Y3) Or (Ys>Y1 And Ys>Y2 And Ys>Y3) Return 0

;Punkt liegt also im Df...


If X1<>X2 And X2<>X3;Wenn kein Punkt (1,2,3) ÜBER dem anderen liegt (x-Koordinate)
If X1<X2 And X1<X2;Welcher liegt am weitesten links?
Xa = X1
Ya = Y1
ElseIf X2<X1 And X2<X3
Xa = X2
Ya = Y2
Else
Xa = X3
Ya = Y3
EndIf

If X1>X2 And X1>X2;Welcher liegt am weitesten rechts?
Xb = X1
Yb = Y1
ElseIf X2>X1 And X2>X3
Xb = X2
Yb = Y2
Else
Xb = X3
Yb = Y3
EndIf

If X1>Xa And X1<Xb;Welcher ist der Mittelpunkt?
Xc = X1
Yc = Y1
ElseIf X2>Xa And X2<Xb
Xc = X2
Yc = Y2
Else
Xc = X3
Yc = Y3
EndIf

;Funktion für die Verbindungsgerade die über die Mitte geht
m# = (Ya-Yb)/(Xa-Xb)
b# = -m * Xa + Ya

If Xs>Xc;Wenn der gesuchte Punkt rechts vom Mittelpunkt liegt
;Neuen Pa Punkt festlegen
Xa = Xc
Ya = m * Xa + b

If Ya>Yc
X1 = Xa
Y1 = Ya
X2 = Xc
Y2 = Yc
Else
X1 = Xc
Y1 = Yc
X2 = Xa
Y2 = Ya
EndIf
X3 = Xb
Y3 = Yb

ElseIf Xs<Xc;Wenn der gesuchte Punkt links vom Mittelpunkt liegt
;Neuen Pb Punkt festlegen
Xb = Xc
Yb = m * Xb + b

If Yb>Yc
X1 = Xb
Y1 = Yb
X2 = Xc
Y2 = Yc
Else
X1 = Xc
Y1 = Yc
X2 = Xb
Y2 = Yb
EndIf
X3 = Xa
Y3 = Ya
EndIf
Else
If X1=X2
Xa = X1
Ya = Y1
Xc = X2
Yc = Y2
Xb = X3
Yb = Y3
Else ;if X1=X3
Xa = X1
Ya = Y1
Xb = X3
Yb = Y3
Xb = X2
Yb = Y2
EndIf

If Ya>Yc
X1 = Xa
Y1 = Ya
X2 = Xc
Y2 = Yc
Else
X1 = Xc
Y1 = Yc
X2 = Xa
Y2 = Ya
EndIf
X3 = Xb
Y3 = Yb
EndIf

;Definitionen der Punkte: Punkt 1 ist der Obere der Mittelpunkte, Punkt 2 ist der untere der Mittelpunkte
;Punkt 3 ist der außenstehende Punkt.

;Obere Verbindungslinie: Punkt 1 zu Punkt 3
m# = (Y1-Y3) / (X1-X3)
b# = -m * X1 + Y1
;Wenn Ps über dieser ist, ist er nicht im Dreieck
If Ys> m * Xs + b Return 0

;Untere Verbindungslinie: Punkt 2 zu Punkt 3
m# = (Y2-Y3) / (X2-X3)
b# = -m * X2 + Y2
;Wenn Ps unter dieser ist, ist er nicht im Dreieck
If Ys< m * Xs + b Return 0

;Ansonsten ist er wohl im Dreieck:
Return 1
End Function
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

ChaosCoder

BeitragFr, Apr 07, 2006 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
warte mal, das kenn ich doch, das problem hatte ich auch mal^^ Laughing
Hab mir dann einfach mal folgenden codeschnipsel angeguckt (is glaub ich hier ausm archiv Rolling Eyes )

Code: [AUSKLAPPEN]

Graphics 800,600,0,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Const Points = 6

Dim Point#(Points,2)
RandomizeFigure()

While Not KeyDown(1)
 Cls
 If KeyHit(57) Then RandomizeFigure()
 ShowFigure()
 Text 1,1,"MOUSEOVER: " + MouseOver(MouseX(),MouseY())
 Flip
Wend
End

Function RandomizeFigure()
 For i = 0 To Points-1
  Point(i,1) = Rand(GraphicsWidth())
  Point(i,2) = Rand(GraphicsHeight())
 Next
End Function

Function ShowFigure()
 Color 255,255,255
 For i = 0 To Points-1
  Line Point(i,1), Point(i,2), Point((i+1) Mod Points,1), Point((i+1) Mod Points,2)
 Next
End Function

Function MouseOver(x#,y#)
 Color 100,100,100
 Line x,0,x,600
 For i = 0 To Points-1
  x1# = Point(i,1)
  x2# = Point((i+1) Mod Points, 1)
  y1# = Point(i,2)
  y2# = Point((i+1) Mod Points, 2)
  If x2 < x1 Then x3 = x2  x2 = x1  x1 = x3  y3 = y2  y2 = y1  y1 = y3
  If (x >= x1) And (x <= x2) Then
   yp# = y1 + (x - x1) * (y2 - y1) / (x2 - x1)
   If yp => y Then s = s + 1
   Color 255,0,0
   Oval x-3,yp-3,6,6,1
  EndIf
 Next
 Color 255,255,255
 Return s Mod 2
End Function
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

Mr.Keks

BeitragSa, Apr 08, 2006 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.blitzbasic.com/code...p?code=483

immer guter tipp: im englischen codearchiv ist jeeeede menge nützliches zeugs. man findet da eigentlich die meisten algos, die man fürs tägliche coden braucht.
MrKeks.net

Firstdeathmaker

BeitragSa, Apr 08, 2006 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Aua, die sind ja viel kürzer als meiner. Wie kommt man nur darauf?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

CodeMaster

BeitragSa, Apr 08, 2006 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/view...highlight=
Dies ist ein Text, der an jeden Beitrag von dir angehängt werden kann. Es besteht eine Limit von 500 Buchstaben.

Zuletzt bearbeitet von CodeMaster am Mo Apr 01, Parse error: syntax error, unexpected ';' in htdocs\viewtopic.php on line 102

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group