2d Punkt in Dreieck

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

StepTiger

Betreff: 2d Punkt in Dreieck

BeitragDi, Nov 14, 2006 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Joa, mal wieder so ne dumme Dreiecksfrage ^^

Mit einem Unterschied: Ich hab vorarbeit geleistet ^^

gegeben:
Dreieck mit 3 Vektoren.
Vektor t, die Zielkoordinate

Dreieck:
Vektor p = Vektor des ersten Dreieckpunktes
Vektor a = Vektor von p zum Punkt B
Vektor b = Vektor von p zum Punkt C

Dann fang ich mit einem parallelogramm an:
t\x = p\x + k * a\x + l * b\x
t\y = p\y + k * a\y + l * b\y

Sind sowohl k als auch l unter gleich 1, so ist der Punkt im Parallelogramm.
Nun gezweitelt: ist die Summe aus k und l unter gleich 1, so ist der Punkt im Dreieck.

Nur:
Wie bekomme ich eine allgemeingültige Formel:
k=
l=
?

Danke!
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

BtbN

BeitragDi, Nov 14, 2006 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist doch einfachste Algebra.

t\x = p\x + k * a\x + l * b\x
<=> k = (t\x - l * b\x - p\x) / a\x
<=> l = (t\x - k * a\x - p\x) / b\x

t\y = p\y + k * a\y + l * b\y
<=> k = (t\y - p\y - l * b\y) / a\y
<=> l = (t\y - p\y - k * a\y) / b\y


So, das müste so passen.
Zumindest wenn man die Formeln einfach umstellt.

StepTiger

BeitragDi, Nov 14, 2006 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du jetzt noch schaffst, eine Formel mit nur einer Unbekannten zu machen, die dann auch nur auf einer Seite steht, dann stehe ich zu tiefst in deiner Schuld
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

BtbN

BeitragMi, Nov 15, 2006 14:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie meinst du das jetzt?
Welche unbekannte?
Ich blick auch nicht ganz durch, was du genau willst.

StepTiger

BeitragMi, Nov 15, 2006 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Unbekannten k und l

Hab heute meine Mathestunde sinnvoll genutzt, der Lehrerin nicht zugehört und ne Menge vorarbeit geleistet. Dabei kam ich auf folgende Ergebnisse:

k=(l*bx+tx-vx)/ax

hab mal alles in meinen Ti 92 eingetippt, der mir darauf folgende Formel ausgab.
l=(ax*by*(ty-vy)+tx-vx)/(ax*ay*by-bx)


t=target
v=dreiecksvektor 1
a=vektor von v zu punkt 2
b=vektor von v zu punkt 3

hällt sich das ergebnis l+k nun unter gleich 1 und ist über gleich 0, so ist der Vektor t im Dreieck Smile

Ich schreib heute noch ein Programm dafür Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

StepTiger

BeitragMi, Nov 15, 2006 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für Doppelpost aber ist mal wirklich wichtig Very Happy

also siehe hier:
Code: [AUSKLAPPEN]
Graphics 800,600,32,2

Dim pos(3,2)

num=0

SetBuffer BackBuffer()
While Not KeyDown(1)
   
   tx=MouseX()
   ty=MouseY()
   
   If KeyDown(2) Then num=0
   If KeyDown(3) Then num=1
   If KeyDown(4) Then num=2
   
   If MouseDown(1) And MilliSecs()>lt
      pos(num,0)=MouseX()
      pos(num,1)=MouseY()
      num=(num+1) Mod 3
      lt=MilliSecs()+100
   EndIf
   
   px=pos(0,0)
   py=pos(0,1)
   
   ax=pos(1,0)-pos(0,0)
   ay=pos(1,1)-pos(0,0)
   
   bx=pos(2,0)-pos(0,0)
   by=pos(2,1)-pos(0,0)
   
   l#=-1
   k#=-1
   
   dot2=0   
   If ax<>0 And ay<>0 And bx<>0 And by<>0
      
      k1#=(bx*(py-ty)-by*(px-tx))
      l1#=(-(ax*(py-ty)-ay*(px-tx)))
      div#=(ax*by-ay*bx)
      
      k#=k1#/div#
      l#=l1#/div#
      dot2=1
      
   EndIf
   
   tl#=l#
   tk#=k#
   ts#=-(k#+l#)
   
   dot=0
   If ts#>=0 And ts#<=1 And k#<0 And l#<0 Then dot=1
   
   Line pos(0,0),pos(0,1),pos(1,0),pos(1,1)
   Line pos(0,0),pos(0,1),pos(2,0),pos(2,1)
   Line pos(1,0),pos(1,1),pos(2,0),pos(2,1)
   
   LockBuffer
   For x=0 To GraphicsWidth()-1 Step 1
      For y=0 To GraphicsHeight()-1 Step 1
         If ax<>0 And ay<>0 And bx<>0 And by<>0
            
            tx=x
            ty=y
            
            k1#=(bx*(py-ty)-by*(px-tx))
            l1#=(-(ax*(py-ty)-ay*(px-tx)))
            div#=(ax*by-ay*bx)
            
            k#=k1#/div#
            l#=l1#/div#
            
            s#=-(k#+l#)
            
            If s>=0 And s<=1 And k#<0 And l#<0 Then WritePixelFast x,y,255 Shl 16 + 255 Shl 8 + 255
            
         EndIf
      Next
   Next
   UnlockBuffer
   
   Color 255,0,0
   Text 1,1,dot
   Text 1,15,dot2
   Text 1,30,tk#
   Text 1,45,tl#
   Text 1,60,ts#
      
   Flip
   Cls
   
Wend

End


Der Code zeichnet ein komplett falsches Dreieck obwohl die Formel richtig ist. Kann also nur mein Fehler sein. Die Formel IST richtig. Bin sie mit zich tausenden an Koordinaten im Koordinatensystem durchgegangen.

hier mal die jetzige Formel, denn meine vorherige war nicht ganz richtig ^^

Code: [AUSKLAPPEN]
      k1#=(bx*(py-ty)-by*(px-tx))
      l1#=(-(ax*(py-ty)-ay*(px-tx)))
      div#=(ax*by-ay*bx)
      
      k#=k1#/div#
      l#=l1#/div#
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group