Problem "Linien verbinden"

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Ava

Gast

Betreff: Problem "Linien verbinden"

BeitragMo, Jan 19, 2009 23:07
Antworten mit Zitat
Hallo Leutz,

ich habe folgendes Problem, dass mir nun schon den ganzen Abend mein Köpfchen zum Rauchen bringt: Ich möchte mehrere Linien-Segmente variabler Breiten miteinander verbinden. Mit dem Standard-DrawLine von BMax ( bzw. OpenGL ) funktioniert dies natürlich nicht, da man dort keinen vernünftigen Übergang zwischen den einzelnen Linien erhält. Die Segmente bestehen in meinem Fall quasi aus "verzerrten" Rechtecken, deren vier Vetexpunkte ich mittels der Linienpositionen und Atan2/Cos/Sin berechne. Hierbei passiert es allerdings sehr häufig, dass die Segmente "verdreht" werden.

Ich habe hierzu eine Skizze gezeichnet, die das Problem verdeutlichen soll:
user posted image
Oben: das gewünschte Ergebnis.
Unten: der Effekt, wie er zur Zeit u.a. auftreten könnte.

Ich habe schon eine Menge rumprobiert - ohne Erfolg. Nun streikt mein Schädel ... und ich hoffe, dass vielleicht jemand von euch einen Lösungsansatz parat hat. Wink

Liebe Grüsse,
Ava

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jan 20, 2009 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie ich dass jetzt verstanden habe berechnest du doch irgendwann den Winkel der (im Beispiel kürzeren und dicker gezeichneten) Berührungsseiten zwischen den Vierecken.

Falls mich nicht alles täuscht sollte es dann zu einer Überschneidung kommen, wenn die Differenz zwischen diesem beiden Winkeln(EDIT: Modulo 360 mag nötig sein, ohne Code schlecht zu sagen Wink) größer als 180 oder kleiner als -180 Grad ist.

Wenn du diese Winkel schon hast, sollte sich das ja leicht überprüfen lassen, sodass man dann entsprechend die Eckpunkte vertauschen kann
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

BladeRunner

Moderator

BeitragDi, Jan 20, 2009 0:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, die Winkel müssen identisch oder um 180° verdreht sein, da sie sonst nicht parallel liegen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Vertex

BeitragDi, Jan 20, 2009 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

(Ich habe nochmal die Methode performanter gemacht ohne Cos/Sin-Kram)
Betrachte P1-P2 als Vektor d1 und P3-P2 als d2. Bei der Vektorsubtraktion von d1-d2 entsteht ein Vektor j der von P3 nach P1 verläuft. Die Länge und Richtung von j stimmen, aber er liegt im Koordinatenursprung. Zunächst halbierst du j (Skalarmultiplikation mit 1/2) und verschiebst ihn um P3 (Vektoraddition). J ist nun ein Ortsvektor bei dem sich die zwei blauen Linien kreuzen.
Um nun auf S1 zu kommen subtrahierst du P2 von j = t. T normalisierst du, in dem du alle Komponenten durch dessen Betrag dividierst, danach hat er die Länge 1. Nun multiplizierst du ihn mit lineWidth/2. S1 ist dann P2 + t und S2 ist P2 - t.

Es gibt im übrigens versch. Methoden Linien zu verbinden. Kennste sicher aus Vektorgrafikprogrammen die einmal die obere Methode kennen, aber auch abgeflachte Ecken und abgerundete Ecken. Falls es dich interessiert, guckste mal in einer OpenVG implementierung rein und achtest auf die versch. Line-Join-Styles.

mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group