Hej!
Robie w delphi wektor wodzacy, tzn jeden koniec znajduje sie w ustalonym punkcie, a drugi koniec jest tam, gdzie znajduje sie kursor myszy na formatce. Ta czesc tego programiku dziala mi bez zarzutu. Ale musze jeszcze zrobic grot tego wektora (czyli strzalka na koncu) i mam takie pytanie: czy zna ktos jakis sposob rozwiazania, jakis algorytm itp, aby ten grot byl ustawiony prawidlowo w stosunku do wektora w kazdym dowolnym jego polozeniu? Czyli jesli bede poruszal myszka w dowolnym kierunku, wektor bedzie sie zmienial, to zeby grot wektora byl rysowany prawidlowo. z gory dzieki za jakakolwiek podpowiedz!!
0
0
a cóż tu jest do podpowiadania. Masz jeden koniec kreski będącej połową strzałki, masz długość oraz kąt jaki ma tworzyć z wektorem. Z punktu i kąta wyliczysz wzór prostej a z długości obliczysz punt - czysta matematyka
0
To proste: wysujesz 2 odcinki
- kursor myszy - punkt powstały przez obrócenie wektora wodzącego o powiedzmy 5 stopni i skrócenie o 10%
- kursor myszy - punkt powstały przez obrócenie wektora wodzącego o powiedzmy -5 stopni i skrócenie o 10%
Obroty oczywiście dokonujesz względem ustalonego punktu zaczepienia wektora. Najpierw oczywiście musisz policzyć kąt nachylenia oryginalnego wektora, ale mając jego zaczepienie oraz lokację kursora myszy, jest to zadanie z podstaw trygonometrii.
Przykład rysowania strzałki z grotem:
//Parametry:
// Canvas: powierzchnia rysowania
// p: początek wektora
// k: koniecz wektora
procedure Rysuj(Canvas:TCanvas; p:TPoint; k:TPoint);
var arc:double; //kąt obrotu wektora
r:double; //długość wektora
arr:array[0..2] of TPoint; //trójkąt grota
begin
arc:=ArcTan2(-k.Y+p.Y, k.X-p.X);
r:=sqrt(sqr(k.X-p.X)+sqr(k.Y-p.Y))*0.95;
arr[0]:=Point(p.X+round(r*cos(arc+0.015)), p.Y+round(r*-sin(arc+0.015)));
arr[1]:=Point(p.X+round(r*cos(arc-0.015)), p.Y+round(r*-sin(arc-0.015)));
arr[2]:=k;
with Canvas do
begin
Polygon(arr);
MoveTo(p.X, p.Y);
LineTo(k.X, k.Y);
end;
end;
0
wielkie dzieki!! dam juz sobie rade:)