![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Я прям ждал подобного ответа...
Вы меня немного не поняли мне нужна функция которая будет рисовать с помощью Pixels!!! К примеру:Код:
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 изменяется в цикле, вот и все, должно работать Последний раз редактировалось 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; |