
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.80] |
![]() |
|
Сообщ.
#1
,
|
|
|
формат заголовка функции: Strelka(x1,y1, x2,y2)
|
Сообщ.
#2
,
|
|
|
Цитата BiV, 17.04.03, 19:10:18 формат заголовка функции: Strelka(x1,y1, x2,y2) да ну думать неохота |
Сообщ.
#3
,
|
|
|
Что то я не понимаю. Что такое x1,y1 x2,y2 и как понять алгоритм рисования стрелки???
|
Сообщ.
#4
,
|
|
|
Может алгоритм вращения стрелки?
|
Сообщ.
#5
,
|
|
|
Цитата GrAnd, 18.04.03, 08:31:24 Что то я не понимаю. Что такое x1,y1 x2,y2 и как понять алгоритм рисования стрелки??? Да ему нужно линию из x1,y1 в x2,y2, а на конце еще две коротенькие линии (или три). Вот он и хочет точки тех линий => углы cos/sin считать надо |
Сообщ.
#6
,
|
|
|
Тогда ему не алгоритм, а сорс нужен;)
|
Сообщ.
#7
,
|
|
|
Сначала нужно найти пару ортогональных векторов (Vx, Vy) и (nx, ny). V - направлен из точки 1 в точку 2 (по направлению движения)
![]() ![]() <br>Vx := x2 - x1;<br>Vy := y2 - y1;<br>V := sqrt(Vx*Vx + Vy*Vy);<br>Vx := Vx/V;<br>Vy := Vy/V;<br> Вектор n - перпендикулярен направлению движения ![]() ![]() <br>nx := Vy;<br>ny := -Vx;<br> Обозначим h и w - размеры рисуемой стрелки. Находим точку (x3,y3) лежащую на прямой проходящей из 1 в 2 и находящейся на расстоянии h от точки 2. ![]() ![]() <br>x3 := x2 - h*Vx;<br>y3 := y2 - h*Vy;<br> Теперь найдем точки (x4,y4) и (x5,y5) расположенные "по бокам" - зазубрины стрелки ![]() ![]() <br>x4 := x3 + w*nx;<br>y4 := y3 + w*ny;<br>x5 := x3 - w*nx;<br>y5 := y3 - w*ny;<br> Ну вот и все, осталось нарисовать ![]() ![]() <br>MoveTo(x1,y1);<br>LineTo(x2,y2);<br>LineTo(x4,y4);<br>LineTo(x5,y5);<br>LineTo(x2,y2);<br> ![]() ![]() <br> (4)|\<br> | \<br> | \<br>(1)------------(3)--(2)<br> | /<br> | /<br> (5)|/<br> |
Сообщ.
#8
,
|
|
|
По алгоритму S.Yu.Gubanov'а сурс (ТМТ Паскаль)
![]() ![]() <br>Uses Graph,Crt,Strings;<br>var<br> h,w,x3,y3,x1,y1,x2,y2,x4,y4,x5,y5,i,j : LongInt;<br> nx,ny,vx,vy,v:real;<br>begin<br> { Set 256-colours graphics mode }<br> SetSVGAMode(640,480,24,LfbOrBanked);<br>{ Сначала нужно найти пару ортогональных векторов (Vx, Vy) и (nx, ny). }<br>{ V - направлен из точки 1 в точку 2 (по направлению движения) }<br>x1:=GetMaxX div 2;<br>y1:=GetMaxY div 2;<br>x2:=x1+20;<br>y2:=y2;<br>Vx := x2 - x1;<br>Vy := y2 - y1;<br>V := sqrt(Vx*Vx + Vy*Vy);<br>Vx := Vx/V;<br>Vy := Vy/V;<br>{ Вектор n - перпендикулярен направлению движения }<br>nx := Vy;<br>ny := -Vx;<br>h:=15;<br>w:=10;<br>{ Обозначим h и w - размеры рисуемой стрелки. Находим точку (x3,y3) лежащую на }<br>{ прямой проходящей из 1 в 2 и находящейся на расстоянии h от точки 2. }<br>x3 := x2 - Round(h*Vx);<br>y3 := y2 - Round(h*Vy);<br>{ Теперь найдем точки (x4,y4) и (x5,y5) расположенные "по бокам" - зазубрины }<br>{ стрелки }<br>x4 := x3 + Round(w*nx);<br>y4 := y3 + Round(w*ny);<br>x5 := x3 - Round(w*nx);<br>y5 := y3 - Round(w*ny);<br>{ Ну вот и все, осталось нарисовать }<br> MoveTo(x1,y1);<br> LineTo(x2,y2);<br> LineTo(x4,y4);<br> LineTo(x5,y5);<br> LineTo(x2,y2);<br> ReadKey; { Get the key pressed }<br> CloseGraph; { Return to the text mode }<br>end.<br> |
Сообщ.
#9
,
|
|
|
спасиб
|
Сообщ.
#10
,
|
|
|
Ааа... я как всегда опаздал
![]() ![]() ![]() ![]() <br>Gug - острота угла стрелки в градусах<br>Lstr - длинна стрелки<br><br>void DrawVector(HDC hdc, int bx, int by, int ex, int ey)<br> {<br> int ug;<br> POINT poly[3];<br><br> MoveToEx(hdc,bx,by,0);<br> LineTo(hdc,ex,ey);<br> ug=RetGrad(ex-bx,ey-by);<br> ug=ug-Gug;<br> poly[0].x=ex;<br> poly[0].y=ey;<br> poly[1].x=ex+Lstr*cos(ug*M_PI/180);<br> poly[1].y=ey+Lstr*sin(ug*M_PI/180);<br> ug=ug+2*Gug;<br> poly[2].x=ex+Lstr*cos(ug*M_PI/180);<br> poly[2].y=ey+Lstr*sin(ug*M_PI/180);<br> SetPolyFillMode(hdc,WINDING);<br> Polygon(hdc,poly,3);<br> }<br><br>int RetGrad(int w,int h)<br> {<br> float fw=w,fh=h,fg=sqrt(fw*fw+fh*fh),fs,fc;<br> if(fg==0) return 0;<br> fs=fh/fg;fc=fw/fg;<br> if(fs>=0) return 180.0*acos(fc)/M_PI;<br> else return 360.0-180.0*acos(fc)/M_PI;<br> }<br> |