Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.10.2020, 13:17

Punkt-Dreieck-Beziehung in Faktoren darstellen

Hi,

folgende Situation:


(Link)


Ich habe ein Dreieck und innerhalb dieses Dreiecks (rot) liegt ein einzelner Punkt (grüner Kreis). Daraus lässt sich leicht die Entfernung des Punktes zu den drei Ecken ermitteln. Was ich jetzt allerdings haben will, sind nicht drei absolute Entfernungswerte, sondern Faktoren, welche die Verhältnisse der Entfernungen anzeigen:

- um so näher der Punkt an einer der Ecken ist (d.h. um so kürzer die Entfernung ist), um so näher soll der zugehörige Faktor an 1 sein

- um so weiter der Punkt von einer der Ecken entfernt ist (d.h. um so größer die Entfernung ist), um so näher soll der Faktor an 0 sein

- die Summe aller drei Faktoren soll 1 sein

Was mich allerdings gerade überraschenderweise vor Probleme stellt, sprich ich bekomme es nicht gebacken. Hat jemand eine Idee/einen Ansatz, wie die drei Faktoren zu ermitteln wären?

Danke!

Tris

Treue Seele

Beiträge: 102

Wohnort: ~Stuttgart

  • Private Nachricht senden

2

21.10.2020, 14:00

Kannst du nicht die Summe aller 3 Distanzen als 100% nehmen und so für jede der drei Strecken die % ausrechnen?

Sges = 100% = 10m
S1 = 2,0m
S2 = 3,5m
S3 = 4,5m

S1 = 20% = 0,20
S2 = 35% = 0,35
S3 = 45% = 0,45

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

21.10.2020, 14:28

Was Du suchst, nennt sich "baryzentrische Koordinaten": nennen wir die drei Ecken A, B und C. Dann kannst Du jeden Punkt auf dem Dreieck mit der Formel P = A + s * (B - A) + t * (C - A) erreichen. s und t sind Laufvariablen mit s >= 0 und t >= 0 und s + t <= 1.

Diese Formel ergibt ein lineares Gleichungssystem (zumindest in 2D), das Du einfach nach s und t auflösen kannst. Wenn Du das nicht selbst machen willst, kannst Du theoretisch auch die Matrix aus den Basisvektoren (B - A) und (C - A) invertieren. Oder einfach googeln, das gibt's ganz sicher schon dutzendfach ausgerechnet mit Beispielcode in allen Programmiersprachen dieser Welt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

FSA

Community-Fossil

  • Private Nachricht senden

4

21.10.2020, 14:28

Es wäre wichtig zu wissen, zu was das Verhältnis sein soll. Verhältnis zu den Seitenlängen des roten Dreiecks? Des gelben Dreiecks? Zu der maximal möglichen gelben Linie bei gegeben Winkel (Schnittpunkt durch den Kreis)?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

5

21.10.2020, 14:42

Es wäre wichtig zu wissen, zu was das Verhältnis sein soll. Verhältnis zu den Seitenlängen des roten Dreiecks? Des gelben Dreiecks? Zu der maximal möglichen gelben Linie bei gegeben Winkel (Schnittpunkt durch den Kreis)?


Das Verhältnis ist immer auf die Entfernung des Punktes von den Ecken bezogen, also auf die Längen der orange eingezeichneten Linien.

6

21.10.2020, 14:48

Was Du suchst, nennt sich "baryzentrische Koordinaten"


OK, damit kommt man bei Google tatsächlich zu Ergebnissen. Unter https://gamedev.stackexchange.com/questi…ric-coordinates gibt es eine Formel, die anscheinend ohne die Laufvariablen auskommt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// Compute barycentric coordinates (u, v, w) for
// point p with respect to triangle (a, b, c)
void Barycentric(Point p, Point a, Point b, Point c, float &u, float &v, float &w)
{
    Vector v0 = b - a, v1 = c - a, v2 = p - a;
    den = v0.x * v1.y - v1.x * v0.y;
    v = (v2.x * v1.y - v1.x * v2.y) / den;
    w = (v0.x * v2.y - v2.x * v0.y) / den;
    u = 1.0f - v - w;
}

FSA

Community-Fossil

  • Private Nachricht senden

7

21.10.2020, 15:00

Es wäre wichtig zu wissen, zu was das Verhältnis sein soll. Verhältnis zu den Seitenlängen des roten Dreiecks? Des gelben Dreiecks? Zu der maximal möglichen gelben Linie bei gegeben Winkel (Schnittpunkt durch den Kreis)?


Das Verhältnis ist immer auf die Entfernung des Punktes von den Ecken bezogen, also auf die Längen der orange eingezeichneten Linien.


Also entweder habe ich jetzt einen Denkfehler, oder das macht keinen Sinn. Wenn das Verhältnis [0..1] den relativen Abstand zwischen Punkt und Ecke angibt und sich gleichzeitig auf den Abstand von Punkt zu Ecke bezieht, wäre das Ergebnis immer 1. Denn der Punkt hat ja die Entfernung, welche der Bezug für das Verhältnis ist. Oder meinst du das Verhältnis Bezogen auf die beiden anderen Entfernungen von Punkt<->Ecke? Dann kann man einfach alle Entfernungen summieren und mit dem arithmetischem Mittel arbeiten.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

8

22.10.2020, 10:37

Oder meinst du das Verhältnis Bezogen auf die beiden anderen Entfernungen von Punkt<->Ecke? Dann kann man einfach alle Entfernungen summieren und mit dem arithmetischem Mittel arbeiten.


Ja das meine ich - sonst wäre die Frage ja auch sinnlos.

Und eben dieses arithmetische Mittel funktioniert bei einem Dreieck scheinbar nicht, jedenfalls bekomme ich es nicht gebacken.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

22.10.2020, 11:50

Aber mit den baryzentrischen Koordinaten ist dein Problem jetzt gelöst, oder?

10

23.10.2020, 08:35

Aber mit den baryzentrischen Koordinaten ist dein Problem jetzt gelöst, oder?


Ja und nein, im Prinzip sieht die Antwort gut aus, nur die Formel, die ich mir oben rausgesucht habe, funktioniert nicht, ich brauche wohl eine andere :-)

Werbeanzeige