Seite 2 von 2

Re: Geometrisches Problem

Verfasst: 27.10.2009 19:47
von Christian+
@Kaeru Gaman deines hat aber in der Ecke nicht 100% sondern 0%

So habe dann meines auch mal kurz lauffähig gemacht damit es gleich drei Beispiele gibt ich berechne es dabei auch mit dem Abstand und nicht mit der Fläche.

Code: Alles auswählen

OpenWindow(0,100,100,280,280,"Test",#PB_Window_SystemMenu)

If CreateStatusBar(0, WindowID(0))
AddStatusBarField(93)
AddStatusBarField(93)
AddStatusBarField(93)
EndIf

x1=100+Cos(-#PI*2/3)*100
y1=100+Sin(-#PI*2/3)*100

x2=100+Cos(0)*100
y2=100+Sin(0)*100

x3=100+Cos(#PI*2/3)*100
y3=100+Sin(#PI*2/3)*100

StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Transparent)
LineXY(x1,y1,x2,y2)
LineXY(x1,y1,x3,y3)
LineXY(x2,y2,x3,y3)
StopDrawing()

While WaitWindowEvent(10)<>#PB_Event_CloseWindow

x=WindowMouseX(0)
y=WindowMouseY(0)

a1.f = Sqr((x-x1)*(x-x1) + (y-y1)*(y-y1))
a2.f = Sqr((x-x2)*(x-x2) + (y-y2)*(y-y2))
a3.f = Sqr((x-x3)*(x-x3) + (y-y3)*(y-y3))

StatusBarText(0, 0, "Ecke oben: "+Str(100.0/(a1+a2+a3)*((a2+a3)-a1)))
StatusBarText(0, 1, "Ecke rechts: "+Str(100.0/(a1+a2+a3)*((a1+a3)-a2)))
StatusBarText(0, 2, "Ecke unten: "+Str(100.0/(a1+a2+a3)*((a2+a1)-a3)))

Wend

End

Re: Geometrisches Problem

Verfasst: 27.10.2009 19:48
von Kaeru Gaman
STARGÅTE hat geschrieben:jo geht auch, das ist nun aber genau das "invertierte"
ach SO.... Bild
yo das hab ich nu wieder übersehen gehabt...

Re: Geometrisches Problem

Verfasst: 27.10.2009 19:54
von STARGÅTE
@Christian+

JO das ist super :allright:

Das verhindert auch die über 100% die meins hatte, und das Ergebis je nach lage des Punkts.

Geht aber wiederum nur mit gleichseitigen Dreiecken, da du ja die Läge zwischen zwei Eckpunkte garnicht betrachtest.
Ist das Dreieck verzerrt, müssten die a1,a2,a3 unterschiedlich gewichtet werden.

Aber er wollte ja eh nur n Gleichseitiges

Re: Geometrisches Problem

Verfasst: 27.10.2009 19:56
von memdee
Euch allen drei vielen, vielen Dank!
Werd mich wohl für Christians Methode entscheiden.

Schönen Abend noch.

Re: Geometrisches Problem

Verfasst: 28.10.2009 12:38
von alter Mann
@ Christian+ : leider kann ich deinem Ergebnis nicht zustimmen, denn auf den Kanten des Dreiecks ist der
Anteil des gegenüberliegenden Punktes nicht 0

Da war Stargates Ansatz über den Flächeninhalt schon richtig (Stichwort homogene Koordinaten).

Hier mal meine Variante (im Prinzip nur eine Vereinfachung)

Code: Alles auswählen

OpenWindow(0,100,100,280,280,"Test",#PB_Window_SystemMenu)

If CreateStatusBar(0, WindowID(0))
AddStatusBarField(93)
AddStatusBarField(93)
AddStatusBarField(93)
EndIf

x1=100+Cos(-#PI*2/3)*100
y1=100+Sin(-#PI*2/3)*100

x2=100+Cos(0)*100
y2=100+Sin(0)*100

x3=100+Cos(#PI*2/3)*100
y3=100+Sin(#PI*2/3)*100

StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Transparent)
LineXY(x1,y1,x2,y2)
LineXY(x1,y1,x3,y3)
LineXY(x2,y2,x3,y3)
StopDrawing()

;a.f = 1.0/((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))

While WaitWindowEvent(10)<>#PB_Event_CloseWindow

x=WindowMouseX(0)
y=WindowMouseY(0)

;a1.f = ((x2-x)*(y3-y)-(x3-x)*(y2-y)) * a
;a2.f = ((x3-x)*(y1-y)-(x1-x)*(y3-y)) * a
;a3.f = ((x1-x)*(y2-y)-(x2-x)*(y1-y)) * a

a1.f = ((x2-x)*(y3-y)-(x3-x)*(y2-y))
a2.f = ((x3-x)*(y1-y)-(x1-x)*(y3-y))
a3.f = ((x1-x)*(y2-y)-(x2-x)*(y1-y))

If a1 < 0.0
  a1 = 0.0
EndIf
If a2 < 0.0
  a2 = 0.0
EndIf
If a3 < 0.0
  a3 = 0.0
EndIf

a.f = a1+a2+a3

StatusBarText(0, 0, "Ecke oben  : "+Str(100.0*a1/a))
StatusBarText(0, 1, "Ecke rechts: "+Str(100.0*a2/a))
StatusBarText(0, 2, "Ecke unten : "+Str(100.0*a3/a))

Wend

End

Re: Geometrisches Problem

Verfasst: 28.10.2009 13:53
von Christian+
@alter Mann
Stimmt deine Lösung ist besser. Das ganze über den Flächeninhalt zu berechnen ist hier dann wohl doch besser geeignet. Meine Lösung hat echt das Problem, dass der gegenüberliegende Punkt erst außerhalb des Dreiecks 0 wird hatte ich gar nicht bemerkt habe nur auf die Ecken geachtet.
mfg Christian+

Re: Geometrisches Problem

Verfasst: 29.10.2009 14:05
von memdee
Gut, dann eben über den Flächeninhalt.
Vielen Dank Allen!

Re: Geometrisches Problem

Verfasst: 29.10.2009 14:32
von NicTheQuick
Stargates Alogrithmus ist richtig. Das haben wir letztens auch bei Computer Graphics gemacht als es um Polygone ging.