Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проверить, находится ли курсор на линии

Delphi , ОС и Железо , Мышка и Курсор

Проверить, находится ли курсор на линии

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  Check if a Point(X,Y) (e.g a Cursor) is on a Linie (x1,y1) ; (x2,y2) 
  d = line width (min. 1) 

  Testen, ob sich der Punkt(X,Y) (z.B der Maus-Cursor) auf der Linie x1,y1 nach x2,y2 befindet. 
  d = halbe Liniendicke (min 1) 
  durch direkte Programmierung der FPU wird die Unit Math nicht benotigt 
  nur mit 80387 oder hoher einsetzbar! 
}

 function CursorOnLinie(X, Y, x1, y1, x2, y2, d: Integer): Boolean;
 var
   sine, cosinus: Double;
   dx, dy, len: Integer;
 begin
   if d = 0 then d := 1;
   asm
     fild(y2)
     fisub(y1) // Y-Difference 
    fild(x2)
     fisub(x1) // X-Difference 
    fpatan    // Angle of the line in st(0) 
    fsincos   // Cosinus in st(0), Sinus in st(1) 
    fstp cosinus
     fstp sine
   end;
   dx  := Round(cosinus * (x - x1) + sine * (y - y1));
   dy  := Round(cosinus * (y - y1) - sine * (x - x1));
   len := Round(cosinus * (x2 - x1) + sine * (y2 - y1)); // length of line 
  if (dy > -d) and (dy < d) and (dx > -d) and (dx < len + d) then Result := True
   else
      Result := False;
 end;

 procedure TForm1.FormPaint(Sender: TObject);
 begin
   Canvas.Pen.Width := 1;
   Canvas.MoveTo(0, 0);
   Canvas.LineTo(Width, Weight);
 end;

 procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
   Y: Integer);
 var
   p: TPoint;
 begin
   GetCursorPos(p);
   p := ScreenToClient(p);
   if CursorOnLinie(p.x, p.y, 0, 0, Width, Height, 1) then
     Caption := 'Mouse on line.'
   else
     Caption := 'Mouse not on line.'
 end;

Программа на языке Delphi, которая проверяет, находится ли курсор (покажчик мыши) над определенной линией. Программа использует Фloating Point Unit (FPU) для выполнения некоторых математических расчетов.

Вот подробное описание работы программы:

  1. Функция CursorOnLinie принимает семь параметров: X, Y (координаты точки, например, курсора), x1, y1, x2, y2 (координаты линии) и d (ширина линии).
  2. Функция сначала проверяет, равен ли d нулю, и если так, то устанавливает его в 1.
  3. Затем функция использует ассемблерный код для расчета угла линии (fpatan) и косинусных и синусных значений этого угла (fsincos). Эти значения хранятся в регистрах.
  4. Программа затем рассчитывает разницы координат x и y между точкой (X, Y) и начальной точкой линии (x1, y1). Эти разницы хранятся в переменных dx и dy.
  5. Она также рассчитывает длину линии (len) с помощью косинусных и синусных значений.
  6. Функция затем проверяет, находится ли курсор на линии, выполняя четыре условия:
    • Если разница координат y (dy) больше -d, но меньше d, то курсор находится в вертикальном диапазоне линии.
    • Если разница координат x (dx) больше -d, но меньше длины линии (len) + d, то курсор находится в горизонтальном диапазоне линии и не выходит за пределы линии.
  7. Если все четыре условия выполняются, функция возвращает True, указывая, что курсор находится на линии.

Программа затем использует эту функцию в обработчике события FormMouseMove для проверки, находится ли курсор на линии при перемещении мыши. Если это так, то заголовок формы изменяется на "Mouse on line". В противном случае он изменяется на "Mouse not on line".

В отношении предложений и улучшений:

  • Ассемблерный код можно заменить более дельфийским решением с использованием математических библиотек.
  • Функцию можно оптимизировать, уменьшив количество расчетов и используя более эффективные алгоритмы.
  • Должен быть добавлен обработчик ошибок для случаев, когда курсор находится вне границ формы или линия вертикальная.

В целом, это интересный пример использования ассемблерного кода в Delphi для выполнения математических расчетов. Однако программа может выиграть от более современного и поддерживаемого подхода с использованием более высокоуровневых программных конструкций.

Функция CursorOnLinie проверяет, находится ли курсор на линии, заданной координатами x1, y1 и x2, y2 с учетом ширины линии d.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Мышка и Курсор ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:50:32/0.0052170753479004/1