Geometrisches Problem

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Geometrisches Problem

Beitrag 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
Zuletzt geändert von Christian+ am 27.10.2009 19:53, insgesamt 2-mal geändert.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Geometrisches Problem

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Geometrisches Problem

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Re: Geometrisches Problem

Beitrag von memdee »

Euch allen drei vielen, vielen Dank!
Werd mich wohl für Christians Methode entscheiden.

Schönen Abend noch.
meep?
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Geometrisches Problem

Beitrag 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
Win11 64Bit / PB 6.0
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: Geometrisches Problem

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
memdee
Beiträge: 134
Registriert: 09.09.2004 18:49
Computerausstattung: Win 7 x64
Wohnort: Wiesbaden
Kontaktdaten:

Re: Geometrisches Problem

Beitrag von memdee »

Gut, dann eben über den Flächeninhalt.
Vielen Dank Allen!
meep?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Geometrisches Problem

Beitrag von NicTheQuick »

Stargates Alogrithmus ist richtig. Das haben wir letztens auch bei Computer Graphics gemacht als es um Polygone ging.
Antworten