![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Всем доброго времени суток! Таков вопрос: Как нарисовать прямую используя Pixels то есть "В ручную"? Как сделать цикл прорисовки по пикселям???
![]() ![]() Я ни в чем никогда не уверен... И в этом тоже... ![]() |
#2
|
|||
|
|||
![]() Ау...
![]() Помогите!!! Надо сделать небольшую процедуру... Даешь ей 4 координаты, а он тебе линию рисует! Это ж не сложно!!! Я ни в чем никогда не уверен... И в этом тоже... ![]() |
#3
|
|||
|
|||
![]() Ну, если не сложно, то в чем проблема?
Код:
procedure DrawLine(Canv : TCanvas; C1, C2 : TPoint); begin Canv.MoveTo(C1.X, C1.Y); Canv.LineTo(C2.X, C2.Y); end; Не забывайте делать резервные копии |
#4
|
|||
|
|||
![]() Я прям ждал подобного ответа...
![]() Код:
For gip := 0 to l do begin [ну а тут должна быть та заветная формула!] Image1.Canvas.Pixels[x3,y3] := clBlack; end; ![]() ![]() Я ни в чем никогда не уверен... И в этом тоже... ![]() |
#5
|
||||
|
||||
![]() если вопрос в заветной формуле, то используя уравнения прямой, можно получить, что в цикле от Х1 до Х2 (координаты Х соответсвенно начала и конца линии), ищем Y3(X3), который равен:
Код:
Y3:=Y1+((X3-X1)*(Y2-Y1))/(X2-X1); Код:
Image1.Canvas.Pixels[x3,y3] := clBlack; а Х3 изменяется в цикле, вот и все, должно работать Понять, что хочет заказчик - бесценно, ведь он платит MasterCard ![]() Последний раз редактировалось cotseec, 25.10.2008 в 15:27. |
#6
|
|||
|
|||
![]() Если все правильно рассчитал то
Код:
procedure ImageLine(bPoint, ePoint: TPoint; Canvas: TCanvas; const Color: TColor); var x, y: Integer; K, B: Extended; // меняем местами А и В procedure xChg(var A, B: Integer); begin A := A + B; B := A - B; A := A - B; end; begin if bPoint.X <> ePoint.X then // любая прямая отличная от вертикальной begin if bPoint.X > ePoint.X then // если коэффициенты не в порядке возрастания begin xChg(bPoint.X, ePoint.X); xChg(bPoint.Y, ePoint.Y); end; // коэффициент наклона K := (ePoint.Y - bPoint.Y)/(ePoint.X - bPoint.X); // постоянная состовляющая B := bPoint.Y - K*bPoint.X; // вывод for x := bPoint.X to ePoint.X do begin y := Round(K*x + B); // формула Canvas.Pixels[x, y] := Color; end; end else // для вертикальной прямой begin x := bPoint.X; // постоянна if bPoint.Y > ePoint.Y then // меняем если нужно xChg(bPoint.Y, ePoint.Y); for y := bPoint.Y to ePoint.Y do // рисуем Canvas.Pixels[x, y] := Color; end; end; Использовать примерно так Код:
procedure TForm1.Button1Click(Sender: TObject); var bPoint, ePoint: TPoint; begin bPoint.X := StrToInt(Edit1.Text); bPoint.Y := StrToInt(Edit2.Text);; ePoint.X := StrToInt(Edit3.Text);; ePoint.Y := StrToInt(Edit4.Text);; ImageLine(bPoint, ePoint, Image1.Canvas, clBlack); end; |
#7
|
|||
|
|||
![]() Если ты думаешь, что это тривиальная задача, то ты ошибаешься. Есть два способа рисовать линию. Первый: найти угол наклона этой прямой и по известным формулам увеличивать радиус на малую величину и ставить пиксел в соответствии с полученными координатами. Второй и умный: алгоритм Брезенхама, короче ищи в инете, ну или в книгах
![]() |
#8
|
|||
|
|||
![]() А вот почему он так полхо вырисывовал при углах близких к 90 градусам
|