Vektor/Pfeil berechnen
-
Hi,
Es geht darum, ich berechne in meinem Programm einen Vektor. Diesen möchte ich natürlich auch darstellen:
Eine kleine Graphik zur Veranschaulichung (die dicken roten, vertikalen Linien, trennen versch. Graphen ab, die nichts miteinander zu tun haben. nur um zu zeigen, dass der Vektor irgendwie beliebig liegen kann) http://home.arcor.de/partusch/privates/graph.jpg
Ich hab die Start- und Endkoordinaten der grünen Strecke. Doch ich habe keine Ahnung, wie ich die roten Strecken zur Vervollständigung des Vektors berechnen kann. Das Problem ist, der Vektor kann beliebig liegen ...
Hab schon einiges probiert, doch nichts funktioniert richtig.P.S.: Ich hab das hier gepostet, weil ich nicht wusste, wohin. Ist zwar im Prinzip Graphik, aber doch eher ein mathematisches Problem. Denn wie ich was zeichnen kann, das weiß ich. Bloß die Koordinaten müsste ich halt vorher berechnen
[ Dieser Beitrag wurde am 22.01.2003 um 21:40 Uhr von sarfuan editiert. ]
-
Wenn es nur rein 2D ist - ist es einfach
http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.htmlDer Bresenham Algo ist recht gut. Der verhindert daß es zackig aussieht
-
Ja danke erstmal, aber so weit ich das sehe, berechnet Bresenham Linien oder?
Ich bräuchte aber die Endkoordinaten der roten Strecken "des Pfeilkopfes". Über das Zeichnen der Linien selber mach ich mir keine Gedanken, da bin ich mit der API-Funktion LineTo() vollkommen zufrieden, dankeIch hab mir überlegt, ich könnte die grüne Strecke mathematisch als Vektor betrachten, die Richung umkehren (also mal -1) und ihn auf z.B. 10% der Originalgröße schrumpfen. Wenn ich diesen Vektor dann um z.B. 45 Grad drehen könnte, hätte ich bereits die eine Hälfte des "Pfeilkopfes". Durch Addition dieses Vektors mit den Koordinaten des Endpunktes der grünen Strecke, hätte ich dann nämlich die Koordinaten des Endpunktes der einen roten "Kopfstrecke".
Ich muss nicht jeden einzelnen Punkt der Strecke berechnen, sondern nur den Endpunkt. Den Rest erledigt dann LineTo(). Aber wie kann ich diesen verfluchten Endpunkt berechnen?
(Bei Pythagoras z.B. verliere ich ja alle sonstigen Eigenschaften und habe nur noch Absolutbeträge, damit kann ich doch keine Koordinaten mehr ausrechnen :()
Meine Schulmathematik ist damit vollkommen am Ende
-
Ich denke, wenn du die Länge des Vectors nimmst und ihn durch 10 Teilst, dann müßte die Länge der Spitzen passen. Ich würde die aber eher auf einen festen Wert festlegen, sonst schaut es ungleichmäßig aus.
Um das ganze berechnen zu können, mit den Pfeilen, mußt du natürlich erst mal den Winkel haben.
Dabei empfehlen sich Funktionen wie sin, cos, tan
Wenn du den Winkel hast, dann kannst du ohne Invertierung einmal -120° und einmal +120° nehmen.
Z.B.
Original Winkel: 40°
Länge: 100 - also 10 für die Spitzendann kannst du mit
X = sin( neuer winkel ) * Länge Spitze
Y = cos( neuer winkel ) * Länge Spitze
die neue Position berechnenHoffe, ich hab das jetzt nicht zu wir geschrieben
Aber jetzt hab ich zumindest dein Prob verstanden *gHatte gerade noch was vergessen
[ Dieser Beitrag wurde am 22.01.2003 um 23:01 Uhr von SnorreDev editiert. ]
-
Das kommt doch alles darauf an, wieviel Pixel bei dir eine Längeneinheit hat.
-
Stimmt - das ist ja auch nur ein grobes Beispiel
Klar muß man das erst auf das Längenmaß, daß man Benutzt umstricken
-
@SnorreDev:
Danke, allerdings versteh ich das Prinzip nicht so ganz *g
Wenn du es mir erklären könntest?Außerdem wird ja mit nem simplen sin/cos die Lage des Pfeiles nicht berücksichtigt. D.h. die "Steigung" von Anfangs- zu Endpunkt des grünen Pfeils kann ja variieren und an diese Variation müsste sich auch der "Kopf" anpassen, damit immer der gleiche Abstand auf beiden seiten des Kopfes zum grünen Pfeil ist.
D.h. die Punkte des Kopfes müssten irgendwie in Abhängigkeit von Anfangs- und Endpunkt des grünen Vektors berechnet werden... Jemand ne Idee?
-
du meinst den kopf
/|\
/ | \
/ | \
|Die spitze ist p1 die zwei seitlcihen enden sind d1 und d2
Querstrichdrüber(p1d1)=Querstrichdrüber(p1d2)
also die beiden sind gleich lang.
entweder ist die länge fix, oder ein bruchteil des gesamten pfeiles ( ca 10 % ? )
dieselbe länge geht auch von p1 die strecke runter. dann hat man c1|\
| \
| \
| \das bildet ein rechteckiges dreieck von dem wir die zwei setie wissen, und den spitzen winkel legen wir selbst fest. Aus den 2 Seiten und dem Winkel können wir alle restlichen informationen mit sin,cos,tan, phytagorassatz cosinussatz ermitteln, dadurch kann man dann die koordinaten punkte ermitteln
-
Original erstellt von sarfuan:
**@SnorreDev:
Außerdem wird ja mit nem simplen sin/cos die Lage des Pfeiles nicht berücksichtigt. D.h. die "Steigung" von Anfangs- zu Endpunkt des grünen Pfeils kann ja variieren und an diese Variation müsste sich auch der "Kopf" anpassen, damit immer der gleiche Abstand auf beiden seiten des Kopfes zum grünen Pfeil ist.D.h. die Punkte des Kopfes müssten irgendwie in Abhängigkeit von Anfangs- und Endpunkt des grünen Vektors berechnet werden... Jemand ne Idee? **
Also - du rechnest den Winkel mit ein.
Wenn der Winkel der Linie sagen wir mal 45° ist, die Position der Spitze ist sagen wir auf 100x / 100yDann währe der Linkes drehender Winkel bzw. linke Pfeilspitze: 45° - 135° = -90°
und der Rechte 45° + 135° = 180°Dann rechest du die neuen Vectoren von der Spitze aus aus. ( Was fürn dummer Satz )
Spitze = ( 100 | 100 )
Länge = 100
Spitzenlänge = Länge / 10 = 10;linke spitze:
x = sin( neuer winkel also -90° ) * Spitzenlänge + Aktuelle X Position also 100
y = cos( neuer winkel also 180° ) * Spitzenlänge + Aktuelle Y Position also 100rechts das selbe
Nun kannst du Zeichnen
[Edit] - natürlich was vergessen
[ Dieser Beitrag wurde am 24.01.2003 um 00:22 Uhr von SnorreDev editiert. ]
-
Danke euch, jetzt funktioniert es einwandfrei