Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-96252
Dysan
2003-09-17 15:34
2003.09.29
Halt(1)


1-96240
vlv
2003-09-17 16:28
2003.09.29
Можно ли с помощью TRegistry работать с удаленным реестром?


1-96257
Stas1
2003-09-16 16:26
2003.09.29
RichEdit или что-то другое...???


7-96462
Nevermind
2003-07-15 08:43
2003.09.29
Стили оформления (XP, Классический)


14-96352
Igor_thief
2003-09-12 12:36
2003.09.29
PopupMenu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский