Форум — Ответы ( К темам )
? | Andrei: Как создать объект "ЛИНИЯ"? (31-12-2002 13:42:30) |
Необходимо создать линию, которую можно было бы растягивать и перемещать, кликая по ней мышкой. | |
Devnvd (31-12-2002 19:04:09) | |
Вот вам для затравки код рисования линий. На форму Form1 положите TImage *Image1, сверху на Image1 наложите TPaintBox *PaintBox1. Размеры Image1 и PaintBox1 должны быть одинаковыми. Image1 в примере служит контейнером для линий. Изображение в Image1 при этом хранится в виде метафайла, который является по сути списком того что вы на него рисуете. В дальнейшем вы можете в качестве промежуточного контейнера ваших объектов использовать список. Поиск линии для изменения её параметров делается чисто математически поиском ближайшей к месту вашего клика линии из списка. Обратите внимание, что уже начальный код занимает достаточно места. Я привёл здесь лишь набросок, а не руководство к написанию графического редактора. //Параметры линии int StartX,StartY; int CurX,CurY; TColor LineColor=clRed; //Индикатор процесса формирования линии bool idDrawLine=false; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Image1->Canvas->FillRect(Image1->ClientRect); PaintBox1->BringToFront(); } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button !=mbLeft)return; StartX=X; StartY=Y; CurX=X; CurY=Y; idDrawLine=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button==mbLeft) { //Переносим изображение в контейнер Image1 if(StartX !=CurX ||StartY !=CurY) { TCanvas *Cv=Image1->Canvas; Cv->Pen->Mode=pmCopy; Cv->Pen->Color=LineColor; Cv->MoveTo(StartX,StartY); Cv->LineTo(CurX,CurY); } idDrawLine=false; } } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(!idDrawLine)return; TColor pencolor; TPenMode penmode; TCanvas *Cv=((TPaintBox *)Sender)->Canvas; pencolor=Canvas->Pen->Color; penmode=Canvas->Pen->Mode; Cv->Pen->Mode=pmXor; Cv->Pen->Color=clWhite; //Подтираем старое изображение линии if(StartX !=CurX ||StartY !=CurY) { Cv->MoveTo(StartX,StartY); Cv->LineTo(CurX,CurY); } //Меняем координаты конца линии CurX=X; CurY=Y; // Рисуем новое изображение if(StartX !=CurX ||StartY !=CurY) { Cv->MoveTo(StartX,StartY); Cv->LineTo(CurX,CurY); } Cv->Pen->Color=pencolor; Cv->Pen->Mode=penmode; } | |
Andrei (05-01-2003 11:34:02) | |
Спасибо за ответ. Мне осталось непонятным, как осуществить математически поиск ближайшей линии: то ли находить коэффицеты (y=kx+b) или создавать массив со всеми точками из которых состоит линия? | |
Devnvd (06-01-2003 18:57:31) | |
Приведу выдержку из тестового примера. Если возникнут сложности, то могу выслать по почте полный проект примера. Пример был написан несколько для других целей, но в нём создаётся список линий и редактирование их.
| |
Andrei (23-01-2003 18:42:13) | |
Спасибо, я и пошел по этому пути (нахождение кратчайшего расстояния от точки до отрезка). |