Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.29;
Скачать: CL | DM;

Вниз

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

 
Might   (2003-05-30 09:52) [0]

Хочу в графическом редакторе нарисовать линии разной толщины (карандашом). Если я очень медленно веду мышкой по "холсту", то получаю красивую гладкую кривую нужной мне толщины. Если же провести мышкой чуть быстрее, то я получаю нечто вроде бус, где на нитку толщиной в один пиксель нанизаны шарики диаметром с толщину нужной мне линии.
Что я могу делать не так, икак это можно исправить?

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;
..................................


 
pasha676   (2003-05-30 12:38) [1]

Что то у тебя сложновато. Не то линия какая то замороченная...



Я делал примерно так.

на даун мыши

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

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



 
Might   (2003-05-30 14:21) [2]

pasha676, спасибо, что ответил.
Это ты описал как рисовать прямую линию, толщиной в один пиксель. Мне же надо нарисовать кривую от руки (мышь прошла и оставила след, как карандаш в PaintBrush), толщиной в 3, 5, 7 или 9 пикселей.


 
AlexT1000 ©   (2003-05-30 15:33) [3]

скорее всего тебе нужно по контрольным точкам строить траекторию движения мыши .
т.е добавлять промежуточные точки с каким то шагом . и потои отрисовывать твою линию по построенной траектории



 
pasha676   (2003-05-30 16:44) [4]

Кривая должна быть не совокупностью точек, а совокупностью линий и/или дуг.


 
Might   (2003-05-30 17:05) [5]

Поставим вопрос немного по другому.
Каждый хоть раз в жизни пользовался графическим редактором PaintBrush для Windows"а. Там есть такой инструмент "кисть". Можно выбрать одну из предлагаемых форм "кисти" и ее размер, а затем, как маляр по забору, так и мышкой по экрану водишь и остается след. Так может кто знает как в Delphi такой инструмент создать?


 
Плохой человек   (2003-05-30 22:15) [6]

>Кривая должна быть не совокупностью точек, а совокупностью линий и/или дуг.

Абсолютно верно. Нужно не ставить точки в координаты мыши, а соединять эти точки линиями нужной толщины (для этого есть свойства).


 
Fenik ©   (2003-05-30 23:26) [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-31 21:47) [8]

>(название может быть любым, а параметры нет)

Я плакалъ.



 
Fenik ©   (2003-06-01 08:12) [9]

> Я плакалъ.

Я тоже. Мне один чел писал с вопросами, ну я ему помог, написал такие-то вот есть функции, парочку сам написал. DrawLine была с названием DrawP а в LineDDA было имя - DrawLine. Причем, в описании написал: @DrawLine - указатель на процедуру рисования точки. Прошло две недели - ответа нет. Я ему снова посдал письмо, думаю может не дошло первое. Он мне отвечает: не пишите мне больше. вы непутёвый программист, ваш пример не работает. Я понял в чём дело, но писать больше не стал.

Я не думаю, что это был Might, но на всякий случай...


 
Might   (2003-06-02 10:45) [10]

>Я не думаю, что это был Might

Да, это был не я.


 
Evgeny ©   (2003-06-03 06:27) [11]

Маленький нюанс. Не встречал ни одного редактора, который бы рисовал не рваную линию, если вести мышкой достаточно быстро.


 
Might   (2003-06-03 17:14) [12]

>Evgeny ©
>Маленький нюанс. Не встречал ни одного редактора, который бы >рисовал не рваную линию, если вести мышкой достаточно быстро.

Либо тебе не попадались хорошие редакторы, либо ты водишь мышкой со скоростью не менее 10 м/с (хотя и это не должно влиять на работу редактора).



 
Fenik ©   (2003-06-04 18:19) [13]

> Evgeny © (03.06.03 06:27)

Paint Brush



Страницы: 1 вся ветка

Текущий архив: 2003.09.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-96262
ShadowSmart
2003-09-17 11:36
2003.09.29
try except end


1-96278
AL1000
2003-09-18 09:17
2003.09.29
Как прибавить к дате M месяцев?


1-96175
Yuraz
2003-09-16 11:55
2003.09.29
мастера, посмотрите плз, компонент, компилирует, но не добавляет


3-96089
Hawk2
2003-09-09 15:18
2003.09.29
Вставка одним запросом


1-96265
aldapooh
2003-09-17 12:09
2003.09.29
Single Instance