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

26.07.2016, 07:22

Punkte um einen Radius herum biegen

Hi,

ich habe hier eigentlich ein ganz lausiges Anfängerproblem, stehe damit aber gerade dermaßen auf dem Schlauch, dass ich keinerlei Ansatzpunkt finde:


(Link)


Ich habe eine Linie, die aus mehreren Koordinatenpunkten besteht (rote Linie im Bild). Die Positionen der Punkte ist dabei nicht gleichmäßig verteilt. Weiterhin habe ich in Z-Richtung einen Abstand, der mir einen Radius definiert (schwarzer Pfeil). Jetzt möchte ich die Position der Punkte aus der roten Linie so in X-Richtung (horizontal) und Z-Richtung (Höhe) verändern, dass sich diese Linie im Ergebnis um diesen Radius herum biegt (grüne Linie im Bild).

Mein Problem hier: ich habe die X- und die Z-Koordinate der Punkte (Y im Prinzip auch, aber die sind für das Beispiel ja egal) und möchte die entsprechend Ihrer X-Position so verändern, dass sie eben diesen Kreis bilden. Wie geht das am cleversten?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

26.07.2016, 07:32

Du berechnest den Vektor vom Mittelpunkt zum jeweiligen Punkt, berechnest seine Länge, dividierst ihn durch seine Länge, multiplizierst ihn mit dem Radius und addierst das Ergebnis zum Mittelpunkt:
P_neu = M + r / |(P_alt - M)| * (P_alt - M)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

26.07.2016, 07:59

Japp...passt - Danke!

4

26.07.2016, 08:22

OK, passt noch nicht ganz: kann es sein, dass ich mit der Methode keinen geschlossenen Kreis bzw. mehr als einen Halbkreis hinbekomme (bei ausreichender Breite der Linie und passendem Radius)? Oder müsste das gehen (dann wäre es noch ein Fehler bei mir)?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

26.07.2016, 08:31

Wenn man die "gebogenen Punkte" nur anhand von Punkten auf einer Geraden bildet, kann man höchstens einen Halbkreis erhalten.

Wenn du einen Kreis haben willst, musst du die Punkte auf dem Kreis wie folgt berechnen:

Quellcode

1
2
x = sin(angle) * radius;
y = cos(angle) * radius;
Allerdings kann man so nicht auf die Punkte der roten Linie eingehen.

Alternativ könntest du die Punkte nicht nur zwischen Mittelpunkt und Punkt auf roter Linie ermitteln, sondern auch für die auf dem "Kreis" gegenüber liegende Seite. Dazu müsste der Vektor vom Mittelpunkt zum jeweiligen Punkt negiert werden, bevor er mit de Position des Mittelpunkts addiert wird.
Weiterhin sollten dann die grünen Punkte rechts und links vielleicht pauschal gesetzt werden, da sonst an Position unendlich auf der roten Linie ein Punkt vorhanden sein müsste.


Du könntest aber auch schreiben, wofür du denkst, dass dies die richtige Herangehensweise ist. Möglicherweise ist der Ansatz, den du gewählt hast, schon nicht der beste. (Das lässt sich daraus ableiten, dass du Bedenken hast, keinen geschlossenen Kreis zu erhalten.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

26.07.2016, 08:37

OK, passt noch nicht ganz: kann es sein, dass ich mit der Methode keinen geschlossenen Kreis bzw. mehr als einen Halbkreis hinbekomme (bei ausreichender Breite der Linie und passendem Radius)?
Das ist wohl richtig. Da in deinem Bild die Abstände zwischen den Punkten immer kürzer wurden, ging ich davon aus, dass du einfach nur eine Lot-Abbildung haben willst. Ist das nicht der Fall, musst du die Abstände der Punkte mit beachten und daraus eine Winkel-Änderung von Punkt zu Punkt berechnen. Einfacher ist es da vermutlich einfach direkt einen Kreis zu berechnen mit der passenden Winkel-Änderung. Siehe Sacaldurs Beitrag.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

26.07.2016, 08:42

Du könntest aber auch schreiben, wofür du denkst, dass dies die richtige Herangehensweise ist. Möglicherweise ist der Ansatz, den du gewählt hast, schon nicht der beste. (Das lässt sich daraus ableiten, dass du Bedenken hast, keinen geschlossenen Kreis zu erhalten.)

Die rote Linie ist eigentlich ein flaches Polygon (welches sich in X- und Y-Richtung ausdehnt). Das Polygon kann eine beliebige Form haben, d.h. die Punkte auf diesem sind nicht so regelmäßig wie in dem Beispielbild. Es gibt jetzt verschiedene Funktionen, dieses Polygon in die Z-Richtung zu erweitern/modifizieren, eins davon soll die Möglichkeit zu sein, es zu biegen.

Der Benutzer gibt hier (neben ein paar anderen Parametern) den Radius an. Je nach dem wie breit das Polygon ist, soll es um diesen Radius herumgebogen werden, wenn der Radius klein genug bzw. das Polygon breit genug ist, soll sich halt auch mehr als ein Halbkreis ergeben. Im Extremfall "wickelt" sich das Polygon ein paar mal um den Mittelpunkt.

Ich schreibe hier immer von der Breite, ich weiß dass ein 2D-Polygon sich sphärisch biegen würde, aber bei der Berechnung jeweils eine Koordinate wegzulassen um eine zylindrische Biegung hinzubekommen, ist ja das kleinere Problem.

8

26.07.2016, 08:46

Da in deinem Bild die Abstände zwischen den Punkten immer kürzer wurden


Sorry, das ist meinen mangelhaften Fähigkeiten in Sachen "handgemalter Grafiken" geschuldet und war so nicht beabsichtigt...

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

26.07.2016, 08:52

Ich denke mal, dass dann das Umrechnen von "Entfernung zum Bezugspunkt" (in deiner Darstellung der Punkt, auf dem der Mittelpunkt des Kreises senkrecht steht) zu Winkel für "Biegung" der zu gehende Weg sein dürfte.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

10

26.07.2016, 09:46

Ok, ich hab's - danke :-)

Werbeanzeige