C Linie um Element legen

Pauleheisster

Newbie
Registriert
Dez. 2014
Beiträge
2
Hallo Computerbase Mitglieder,

Ich hänge derzeit an einem ziemlich komplexen Problem für ein EDV Projekt in C. Der Roboter (grafisch in 2 D mit WinAPI realisiert) setzt Stecker und Säulen auf willkürliche Positionen in den Raum. Anschließend verbindet er immer zwei Stecker über eine Säule miteinander. Säulen im Bild orange und Stecker rot. Alle benötigten Informationen zur Position und welche Stecker verbunden werden, werden aus einer .txt Datei ausgelesen. Alles funktioniert soweit super, jetzt häng ich nur noch daran, dass bei den Säulen (orange) die Linien um die Kreise gelegt werden. Je nachdem wo die Stecker sitzen um den oberen Kreis bzw. um den unteren Kreis. Am besten natürlich Tangential anliegend, aber kann natürlich auch nur mit 3 oder 4 Punkten realisiert werden. Bekannt ist die Anfangsposition, die Zwischenposition und die Endposition der Linien. Gespeichert sind die Positionen in einer Struct Deklarierung: saeulen.x und saeulen.y das ganze auch für Stecker. Die Positionen beschreiben nur den Mittelpunkt der Elemente, die spätere Zeichnung der Elemente erfolgt um den Punkt mit Polygon bzw. Rectangle usw. Die Linie (Kabel) wurde mit MoveTo, LineTo realisiert.
Derzeit hab ich überhaupt keinen Ansatz, wie ich das angehen könnte, vielleicht irgendwie über den Winkel der Linien? Jemand eine Idee?

Danke für eure Hilfe


 
Ich hoffe hab dich richtig verstanden...
Es muss relativ viel herumgerechnet werden. Als erster benötigst du die beiden Berührungspunkte der Verbindung zum Kreis (In der Skizze unten 'p1' und 'p2'; beide Skizzen stellen das gleiche dar.). Wenn die bestimmt sind, muss nur noch der Kreisabschnitt zwischen ihnen ermittelt werden (roter Bogen). Der Verlauf der Verbindung geht dann vom Mittelpunkt der Säule zum ersten Berührungspunkt 'p1' über den Kreisabschnitt (da sich die Verbindung um den Kreis 'wickeln' wird) bis zu 'p2' und von dort zum Stecker.

Schritt 1:
Berechne die Geradengleichung vom Mittelpunkt der Säule zum Endpunkt am Stecker.
http://de.wikipedia.org/wiki/Parameterform

Schritt 2:
Berechne die Normale (in der Skizze dunkelblau) vom Mittelpunkt des Kreises (grüner Punkt) der Säule zur Geradengleichung aus Schritt 1.

Schritt 3:
Ermittle die Schnittpunkte der Normalen zum Kreis (in der Skizze als 'm' bezeichnet). Hier musst man natürlich aufpassen, dass man den richtigen Schnittpunkt weiterverwendet. Falls die Gerade genau durch den Mittelpunkt (grün) geht, musst du dich zuällig für einen entscheiden oder irgendeine Festlegung treffen.
http://de.wikipedia.org/wiki/Kreis#Funktionsgleichung

Schritt 4:
Mit 'm' kannst du nun die Geradengleichung von 'm' zum Mittelpunkt der Säule aufstellen. Diese Geradengleichung wird den Kreis in zwei Punkten schneiden. Der eine Punkt ist 'm' und der andere heißt in der Skizze 'p3' (gelb).

Schritt 5:
Aus 'm' und 'p3' kannst du nun 'p1' bestimmen. Das ist der Punkt genau in der Mitte des Kreisabschnitts zwischen 'm' und 'p3'.
Der Rest funktioniert für 'p2' analog.

haha.png
 
Ich versteh überhaupt nicht was du willst :D Kannst du mal eine Skizze machen, wie das Endergebnis aussehen soll? Das Bild oben ist ja der "Ist-Zustand".
 
Für mich sieht das aus, als müsstest du die Tangenten bestimmen, die von der Quelle/Ziel zu den Kreisen gehen (siehe Wikipedia). Davon gibt es pro Kreis zwei. Davon ausgehend kannst du dann bestimmen, welche der Tangenten für den konkreten Fall die schönste ist (ideal wäre, von den beiden mit der kürzeren Länge eine zufällig zu bestimmen und für die andere Tangente die andere Seite zu nehmen).

Wenn du die Tangenten gezeichnet hast musst du noch die "Innereien" der Säule zeichnen, die sich aus Teilen der Kreislinie und eventuell einer Tangente zwischen den Kreisen zusammensetzt.
 
Stimmt, ist natuerlich auch wesentlich einfacher als der Unsinn den ich da geschrieben hab, es sei denn er will es unbedingt ohne Tangentengleichung loesen. :D
 
Servus Jungs,

Vielen Dank für eure ausführlichen Antworten. Hab euch mal im Anhang ein Soll Bild erstellt. Das schwierige ist natürlich noch die Unterscheidung um welchen Kreis die Linien gezogen werden. Eine einfache If Abfrage ob die Anfangsposition und die Endposition über oder unter der y-Koordinaten der Kreise liegen reicht ja nicht aus. (Im Bild ist der linke Fall ja genau der Fall, dass die Stecker über und unter der Position liegen). Der Weg muss ja immer der kürzeste sein.
Das ganze in C umzusetzen wird mit Sicherheit keine einfache Angelegenheit.
Habt mir aufjedenfall bis hierher schon einmal enorm geholfen!

 
Zurück
Oben