Форум: "Media";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизНе могу нарисовать толстую линию, возникают проблемы. Найти похожие ветки
← →
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 вся ветка
Форум: "Media";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c