Змінюй хід війни! Допомагай ЗСУ!

Задачка. Кто попалит мои сорцы?

🔴 04:32 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 03.01.2008
Повідом.: 73
  • 🔴 04:32 Повітряна тривога в Харків.обл.
  • #1
Задачка. Кто попалит мои сорцы?

Может у кого есть немного свободного времени?

Задача: Определить, находится ли заданная координатами точка в многоугольнике, вершины которого заданы координатами соответственно. + визуализация (с ней все отлично)

Собственно не получилось пока доделать алгоритм. Основан на количестве пересечений луча из точки с гранями. Четное - снаружи, нечетное - внутри.

Решается система из уравнений отрезка и луча (в каментах сорца)
Не работает.

Хотел бы получить идеи по выпрямлению кода.

это все дело на delphi
 
Останнє редагування:
  • 🔴 04:32 Повітряна тривога в Харків.обл.
  • #2
Проект не собирается :(.

По существу:

В адаптированном виде идеи изложенные для решения данной задачи здесь
xtt точка grsu точка by/download/books/lang/delphi/DelphiKingdom/ArhivKruglogoStola/KDOffline_14.htm

в коде выглядят примерно так:

PHP:
function IsPointInPolygon(aPointX, aPointY: Integer; aVertexCount: Integer; aX, aY: array of Integer): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to aVertexCount - 2 do begin
    if (aPointY > aY[i]) xor (aPointY <= aY[i + 1]) then begin
      continue;
    end;

    if ((aPointX - aX[i]) < ((aPointY - aY[i]) * (aX[i + 1] - aX[i]) / (aY[i + 1] - aY[i]))) then begin
      Result := not Result;
    end;
  end;
end;

У тебя в список вершин не добавляется последняя вершина (а алгоритм на это надеется ;)), которая совпадает с первой, то есть в Button4Click (например) нужно добавить последнюю вершину, совпадающую с первой:
PHP:
  xl[k] := xl[0];
  yl[k] := yl[0];
  k := k + 1;

Исходя из того, что в переменной k - количество фактически существующих вершин, в функцию IsPointInPolygon передавать нужно k:

PHP:
  if InPolygon(x1, y1, k, xl, yl) then label1.Caption := 'Принадлежит' else label1.Caption := 'Не принадлежит';

По поводу стиля написание кода и необходимости проверки что количество вершин больше 2 - промолчу.
 
  • 🔴 04:32 Повітряна тривога в Харків.обл.
  • #3
благодарен, не думал, что кто-то решится открыть тему.

нет, я не индус, вы не думайте :) ладно, не буду оправдываться со стилем

еще вопрос - что где дописать, дабы юзать основную форму из модуля вычислений?
 
  • 🔴 04:32 Повітряна тривога в Харків.обл.
  • #4
  • 🔴 04:32 Повітряна тривога в Харків.обл.
  • #5
Назад
Зверху Знизу