![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисование стрелок под любым углом
Stas_on © (2005-11-28 13:47:00)Нужно сделать при нажатии на Image рисование стрелки (от точки нажатия до того места где сейчас мышь(OnMouseMove)).
Стрелка сгодится любая, но чтоб было похоже.
Место начала стрелки (x0,y0), конец (x,y).
Помогите пожалуйста кодом......
P.S. Если загруженно изображение, то при перемещении указателя надобы сделать так, чтобы не очень мигало. Исп. других компонент не желательно.
P.S.S. В принципе вопрос на математику.
Zeqfreed (2005-12-03 22:50:00) [1]stas_on © (30.11.05 18:41) [3]
var
Form1: TForm1;
x1, y1 : Integer;
downed : Boolean = false;
...
procedure DrawArrowTip(const Canvas : TCanvas; const angle : Single; const Position : TPoint);
const
_p1 : TPoint = (X: 5; Y: 5);
_p2 : TPoint = (X: 5; Y: -5);
var
p1, p2 : TPoint;
begin
p1.X := Round(_p1.X * cos(angle) - _p1.Y * sin(angle));
p1.Y := Round(_p1.X * sin(angle) + _p1.Y * cos(angle));
p2.X := Round(_p2.X * cos(angle) - _p2.Y * sin(angle));
p2.Y := Round(_p2.X * sin(angle) + _p2.Y * cos(angle));
Canvas.MoveTo(Position.X, Position.Y);
Canvas.LineTo(Position.X + p1.X, Position.Y + p1.Y);
Canvas.MoveTo(Position.X, Position.Y);
Canvas.LineTo(Position.X + p2.X, Position.Y + p2.Y);
end;
procedure TForm1.pbMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
downed := true;
x1 := X;
y1 := Y;
end;
procedure TForm1.pbMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
vx, vy : Integer;
a,cosa : Single;
begin
if downed then begin
pb.Canvas.MoveTo(x1, y1);
pb.Canvas.LineTo(X, Y);
vx := X - x1;
vy := Y - y1;
if (vy <> 0) or (vx <> 0) then begin
cosa := (vx / ( sqrt(sqr(vx) + sqr(vy)) ));
if ((Sign(vx) = -1) and ((Sign(vy) = -1))) then
a := Pi - arccos(cosa)
else if ((Sign(vx) = 1) and ((Sign(vy) = -1))) then
a := arcsin(cosa) + Pi/2
else
a := arccos(cosa) + Pi;
DrawArrowTip(pb.Canvas, a, Point(X, Y));
end;
end;
downed := false;
end;
Доработаешь, по желанию, сам :)
p.s. Че-то я там с определением угла перемудрил, а что не могу никак понять :(
Джо (2005-12-03 22:41:00) [2]Если не хочешь вспоминать геометрию, можешь воспользоваться майкрософтовской библиотекой GDI+, там этих стрелок - хоть завались. Если нужен пример, могу показать.
Virgo_Style (2005-12-03 21:58:00) [3]Геометрия рулит
stas_on (2005-12-03 21:43:00) [4]Кто - нибудь помогите новичку.
Очень нужно сделать рисование стрелок
stas_on (2005-11-30 18:41:00) [5]Помогите пожалуйста кодом......
> 4) Вычисляешь угол этой стрелки (относительно оси ОХ)
> 5) В зависимости от угла (от четверти) и длины ушей вычисляешь
> точки для "ушек" стрелки
>
kami (2005-11-28 14:29:00) [6]В общем, "черепашья графика" - кажется, это так называется.
psa247 (2005-11-28 14:10:00) [7]Смотри...
1) Запоминаешь позицию Х1 и У1 основания стрелки
2) Получаешь позицию Х2 и У2 вершины стрелки
3) Рисуешь прямую
4) Вычисляешь угол этой стрелки (относительно оси ОХ)
5) В зависимости от угла (от четверти) и длины ушей вычисляешь точки для "ушек" стрелки
6) Рисуешь их
все просто... сплошная математика.