Реализация алгоритма грубой силы для обнаружения самопересекающегося многоугольника

Первоначально я реализовал алгоритм Hoey-Shamos, однако он слишком сложен для будущей ремонтопригодности (я не могу сказать об этом), и он не быля не сообщаю правильно, поэтому оптимизированный алгоритм перебораЯ собираюсь использовать.

Мой вопрос: как я могу оптимизировать этот код, чтобы его можно было использовать?

В моем коде есть вложенный цикл for, повторяющий один и тот же список дважды.

РЕДАКТИРОВАТЬ: превратил строки в HashSet и использовал два цикла foreach ... сбрил около 45 секунд от сканирования 10000. Это'все еще недостаточно.

foreach (Line2D g in lines)
{                   
foreach (Line2D h in lines)
{
    if (g.intersectsLine(h))
    {
        return false;
    }
}                  

 } // end 'lines' for each loop

Если я заставлюintersectsLine ()» метод возврата false (для тестирования) все еще занимает 8 секунд для сканирования 10000 записей (у меня 700 000 записей). Это слишком долго, поэтому мне нужно оптимизировать этот кусок кода.

Я пытался удалить строки из списка после негобыли сравнены со всеми другими линиями, однако естьs проблема точности (не знаю почему) и увеличение скорости едва заметно.

Вот мой метод intersectsLine. Я нашел альтернативный подходВот но похоже,будет медленнее со всеми вызовами методов и еще много чего. Расчет склона не делаетмне не нравитсяпотребовалось бы слишком много вычислений (поправьте меня, если ям не так?)

public bool intersectsLine(Line2D comparedLine)
{

//tweakLine(comparedLine);
if (this.Equals(comparedLine) ||
    P2.Equals(comparedLine.P1) ||
    P1.Equals(comparedLine.P2))
{
    return false;
}

double firstLineSlopeX, firstLineSlopeY, secondLineSlopeX, secondLineSlopeY;

firstLineSlopeX = X2 - X1;
firstLineSlopeY = Y2 - Y1;

secondLineSlopeX = comparedLine.X2 - comparedLine.X1;
secondLineSlopeY = comparedLine.Y2 - comparedLine.Y1;

double s, t;
s = (-firstLineSlopeY * (X1 - comparedLine.X1) + firstLineSlopeX * (Y1 - comparedLine.Y1)) / (-secondLineSlopeX * firstLineSlopeY + firstLineSlopeX * secondLineSlopeY);
t = (secondLineSlopeX * (Y1 - comparedLine.Y1) - secondLineSlopeY * (X1 - comparedLine.X1)) / (-secondLineSlopeX * firstLineSlopeY + firstLineSlopeX * secondLineSlopeY);

if (s >= 0 && s = 0 && t 

Ответы на вопрос(3)

Ваш ответ на вопрос