Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Рисование на canvas в DELPHI


Автор: Faraon 20.10.2006, 14:12
У меня такая проблема.
Мне необходимо создать простенький графический редактор.
Вся информация о рисунке сохраняется в виде координат в отдельном файле.
Я затрудняюсь написать процедуру, которая бы выделяла выбранную мною линию.

Пользуюсь таким методом: 

при нажатии кнопки мыши

if (x-x1)*(y2-y1)=(y-y1)*(x2-x1) then
  //прорисовываю линию с новым цветом

x,y - координаты мыши при нажатии кнопки
x1,y1,x2,y2 - координаты линии

Работает только для вертикальных или горизонтальных линий.

Подскажите, как выбирать наклонную линию?

Автор: drkot 20.10.2006, 14:28
Цитата(Faraon @  20.10.2006,  14:12 Найти цитируемый пост)
if (x-x1)*(y2-y1)=(y-y1)*(x2-x1) then

непонятно в чем смысл условия

Автор: Nicholas_S 20.10.2006, 17:42
drkot, смысл не понятен, потому что либо школа давно прошла, либо прошла очень легко smile 

Faraon, дело в том, что когда ты указываешь точку мышой, то координаты есть целые числа (в пикселях).
Поэтому, подставляя в уравнение прямой, не получется верное равенство, т.к. точка (x, y) не принадлежит линии. Тебе следует сделать "приближенную" проверку. Как? Подумай немножко, потому как решение простое, а самому получить его приятнее.  smile 

Автор: Alexeis 20.10.2006, 18:00
Faraon, ну для начала надо проверить попадает ли точка в прямоугольник, образованый начальной и конечной точкой отрезка, затем проверять, указаное условие, но проверять не ТОЧНО! , а с определенной заданной погрешностью, скажем 3 - 5 единиц человек не снайпер, он не может так точно попасть на линию, да и сама линия чертится НЕ ТОЧНО, а по приближенному алгоритму. Так что то что видно на экране совпадает, с теоретическим, только для гоизонтальных и вертикальных линий, так как только они могут рисоватся точно, все остальное рисуется "с запасом" smile .

Добавлено @ 18:02 
ps. Уравнение в целом составлено верное.

Автор: Nicholas_S 20.10.2006, 20:02
alexeis1, небольшое замечание на коммент: "сама линия чертится НЕ ТОЧНО" не играет роли при получении координат точки, т.к. визуальное отображение не влияет на точность расчета формулы.
"Уравнение в целом составлено верное" - почему в целом? Верное, верное.  smile 

Автор: Alexeis 20.10.2006, 21:24
Цитата(Nicholas_S @  20.10.2006,  20:02 Найти цитируемый пост)
"Уравнение в целом составлено верное" - почему в целом? Верное, верное.

Потому что должно быть неравенство, а не уравнение.

Автор: rounin 25.10.2006, 14:27
Код

function PtInLine(X, Y, X0, Y0, X1, Y1, Sens: Integer; var param01: TFloat): Boolean;
var L, P, D: Double;
begin
  Result := False;
  if (X0 = X1)and(Y0 = Y1)then Exit;

  L := Sqrt( Sqr(X1-X0) + Sqr(Y1-Y0) );
  P := ((X-X0)*(X1-X0) + (Y-Y0)*(Y1-Y0))/L;

  if (P > -Sens)and(P < L + Sens) then
  begin
    D := Abs( ( (X-X0)*(Y1-Y0) - (X1-X0)*(Y-Y0) )/L );
    if D < Sens then
    begin
      Result := True;
      param01 := P/L;
    end;
  end;
end;


M
alexeis1
Модератор: для выделения кода следут использовать кнопку "КОД" слева выше поля ввода


Автор: Faraon 25.10.2006, 22:05
rounin.
Огромное тебе спасибо. Очень помог.
Я правильно понял? Sens - это чувствительность???

Автор: Alexeis 26.10.2006, 21:09
Модератор: Тема разделена 
Новая тема находтся по адресу http://forum.vingrad.ru/index.php?showtopic=118446
И называется.
"Рисование линий внутри уже существующих линий"

Faraon, никто не запрещает задавать новые вопросы, просто для этого нужно создавать новые темы smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)