хотя я дааавно делал так : рисовал сначала само окончания стрелки (кружками с увеличивающимися радиусами, отступая от края стрелки), потом делал ей "обрезание" хвоста (где более широкая часть) тоже кружком, но фонового цвета, потом рисовал линию поверх (ну или линию "до" - не важно)... получалось очень симпатичная стрелка.... тока реализация хз где.
сори за делфи) но идею стрелки никто не изменял)
Код | procedure TForm1.DrawArrow(Cv : TCanvas; x1, y1, x2, y2 : Integer); var k1, a, b, c, D : Real; xp, yp, x3, y3, x4, y4 : Integer; lgth, wd2: Integer; begin lgth := 25; wd2 := 4; Cv.PenPos := Point(x1, y1); // Cv.LineTo(x2, y2); if abs(x2-x1) > 8 then begin k1 := (y2-y1)/(x2-x1); a := sqr(k1)+1; b := 2*k1*(x2*y1-x1*y2)/(x2-x1)-2*y2*k1-2*x2; c := sqr(x2)+sqr(y2)-sqr(lgth)+sqr((x2*y1-x1*y2)/(x2-x1))-2*y2*(x2*y1-x1*y2)/(x2-x1); D := sqr(b)-4*a*c; xp := round((-b+sqrt(D))/(2*a)); if (xp > x1) and (xp > x2) or (xp < x1) and (xp < x2) then xp := round((-b-sqrt(D))/(2*a)); yp := round(xp*k1+(x2*y1-x1*y2)/(x2-x1)); if y2 <> y1 then begin x3 := round(xp+wd2*sin(ArcTan(k1))); y3 := round(yp-wd2*cos(ArcTan(k1))); x4 := round(xp-wd2*sin(ArcTan(k1))); y4 := round(yp+wd2*cos(ArcTan(k1))); end else begin x3 := xp; y3 := yp-wd2; x4 := xp; y4 := yp+wd2; end; end else begin xp := x2; yp := y2-lgth; if (yp > y1) and (yp > y2) or (yp < y1) and (yp < y2) then yp := y2+lgth; x3 := xp-wd2; y3 := yp; x4 := xp+wd2; y4 := yp; end; Cv.Polygon([Point(x2, y2), Point(x3, y3), Point(x4, y4), Point(x2, y2)]); end;
|
|