Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу нарисовать толстую линию, возникают проблемы.


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; Что то может быть лишнем, но это не помню для чего использовалось :).

Тянешь линию - прямая за мышем. Отпустил осталась.


Наверх

Титульная страница Поиск, карта сайта Написать письмо