![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу нарисовать толстую линию, возникают проблемы.
Might © (2003-05-30 09:52:00)Хочу в графическом редакторе нарисовать линии разной толщины (карандашом). Если я очень медленно веду мышкой по "холсту", то получаю красивую гладкую кривую нужной мне толщины. Если же провести мышкой чуть быстрее, то я получаю нечто вроде бус, где на нитку толщиной в один пиксель нанизаны шарики диаметром с толщину нужной мне линии.
Что я могу делать не так, икак это можно исправить?
procedure TMain.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var L,i,n:integer;
k:real;
const h=15;
begin
if Line1.Down=true then L:=0
else if Line2.Down=true then L:=1
else if Line3.Down=true then L:=2
else if Line4.Down=true then L:=3
else if Line5.Down=true then L:=4;
n:=round(360/h+1); k:=1;
.....................
if SBPen.Down
then begin
for i:=1 to n do begin Image.Canvas.LineTo(X,Y);
( round(X1+L*cos(k)Хочу в графическом редакторе нарисовать линии разной толщины (карандашом). Если я очень медленно веду мышкой по "холсту", то получаю красивую гладкую кривую нужной мне толщины. Если же провести мышкой чуть быстрее, то я получаю нечто вроде бус, где на нитку толщиной в один пиксель нанизаны шарики диаметром с толщину нужной мне линии.
Что я могу делать не так, икак это можно исправить?
procedure TMain.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var L,i,n:integer;
k:real;
const h=15;
begin
if Line1.Down=true then L:=0
else if Line2.Down=true then L:=1
else if Line3.Down=true then L:=2
else if Line4.Down=true then L:=3
else if Line5.Down=true then L:=4;
n:=round(360/h+1); k:=1;
.....................
if SBPen.Down
then begin
for i:=1 to n do begin Image.Canvas.LineTo(X,Y);
Image.Canvas.LineTo(round(X1+L*cos(k)),round(Y1+L*sin(k)));
end;
..................................
Fenik (2003-06-04 18:19:00) [1]
> Evgeny © (03.06.03 06:27)
Paint Brush
Might (2003-06-03 17:14:00) [2]
>Evgeny ©
>Маленький нюанс. Не встречал ни одного редактора, который бы >рисовал не рваную линию, если вести мышкой достаточно быстро.
Либо тебе не попадались хорошие редакторы, либо ты водишь мышкой со скоростью не менее 10 м/с (хотя и это не должно влиять на работу редактора).
Evgeny (2003-06-03 06:27:00) [3]
Маленький нюанс. Не встречал ни одного редактора, который бы рисовал не рваную линию, если вести мышкой достаточно быстро.
Might (2003-06-02 10:45:00) [4]
>Я не думаю, что это был Might
Да, это был не я.
Fenik (2003-06-01 08:12:00) [5]
> Я плакалъ.
Я тоже. Мне один чел писал с вопросами, ну я ему помог, написал такие-то вот есть функции, парочку сам написал. DrawLine была с названием DrawP а в LineDDA было имя - DrawLine. Причем, в описании написал: @DrawLine - указатель на процедуру рисования точки. Прошло две недели - ответа нет. Я ему снова посдал письмо, думаю может не дошло первое. Он мне отвечает: не пишите мне больше. вы непутёвый программист, ваш пример не работает. Я понял в чём дело, но писать больше не стал.
Я не думаю, что это был Might, но на всякий случай...
Плохой человек (2003-05-31 21:47:00) [6]
>(название может быть любым, а параметры нет)
Я плакалъ.
Fenik (2003-05-30 23:26:00) [7]
Эту проблему я решил так:
Объявляю отдельную процедуру типа (название может быть любым, а параметры нет), которая отвечает за прорисовку отдельной линии, например:
procedure DrawLine(x, y: Integer; Canvas: TCanvas); stdcall;
begin
Canvas.Brush.Color := RGB(Random(256), Random(256), Random(256));
Canvas.Ellipse(x-4, y-4, x+5, y+5);
end;
а когда нужно соединить две точки во время MouseMove вызываю спец. процедуру Windows.LineDDA:
LineDDA(x1, y1, x2, y2, @DrawLine, Integer(Canvas));
x1, y1 - координаты начала линии
x2, y2 - координаты конца линии
@DrawLine - указатель на проц-у прорисовки точки
Integer(Canvas) - без коммент.
Короче, винда для каждой точки линии вызывает DrawLine, и не нужны ни какие алгоритмы.
Плохой человек (2003-05-30 22:15:00) [8]
>Кривая должна быть не совокупностью точек, а совокупностью линий и/или дуг.
Абсолютно верно. Нужно не ставить точки в координаты мыши, а соединять эти точки линиями нужной толщины (для этого есть свойства).
Might (2003-05-30 17:05:00) [9]
Поставим вопрос немного по другому.
Каждый хоть раз в жизни пользовался графическим редактором PaintBrush для Windows"а. Там есть такой инструмент "кисть". Можно выбрать одну из предлагаемых форм "кисти" и ее размер, а затем, как маляр по забору, так и мышкой по экрану водишь и остается след. Так может кто знает как в Delphi такой инструмент создать?
pasha676 (2003-05-30 16:44:00) [10]
Кривая должна быть не совокупностью точек, а совокупностью линий и/или дуг.
AlexT1000 (2003-05-30 15:33:00) [11]
скорее всего тебе нужно по контрольным точкам строить траекторию движения мыши .
т.е добавлять промежуточные точки с каким то шагом . и потои отрисовывать твою линию по построенной траектории
Might (2003-05-30 14:21:00) [12]
pasha676, спасибо, что ответил.
Это ты описал как рисовать прямую линию, толщиной в один пиксель. Мне же надо нарисовать кривую от руки (мышь прошла и оставила след, как карандаш в PaintBrush), толщиной в 3, 5, 7 или 9 пикселей.
pasha676 (2003-05-30 12:38:00) [13]Что то у тебя сложновато. Не то линия какая то замороченная...
Я делал примерно так.
на даун мыши
LineDraw:=true;
XbeginMouse:=X;
YbeginMouse:=Y;
XendMouse:=X;
YendMouse:=Y;
на муве мыши
if LineDraw then
begin
//ставить точку
//стереть преведущую
Canvas.MoveTo(XendMouse,YendMouse);
Canvas.LineTo(XbeginMouse,YbeginMouse);
//рисовать новую
XendMouse:=X;
YendMouse:=Y;
Canvas.MoveTo(XendMouse,YendMouse);
( XbeginMouse,YbeginMouse)Что то у тебя сложновато. Не то линия какая то замороченная...
Я делал примерно так.
на даун мыши
LineDraw:=true;
XbeginMouse:=X;
YbeginMouse:=Y;
XendMouse:=X;
YendMouse:=Y;
на муве мыши
if LineDraw then
begin
//ставить точку
//стереть преведущую
Canvas.MoveTo(XendMouse,YendMouse);
Canvas.LineTo(XbeginMouse,YbeginMouse);
//рисовать новую
XendMouse:=X;
YendMouse:=Y;
Canvas.MoveTo(XendMouse,YendMouse);
Canvas.LineTo(XbeginMouse,YbeginMouse);
end;
ну и на ап мыши
LineDraw:=false;
А еще где-то в начале - Canvas.Pen.Mode:=pmxor; Что то может быть лишнем, но это не помню для чего использовалось :).
Тянешь линию - прямая за мышем. Отпустил осталась.