Реализация алгоритма грубой силы для обнаружения самопересекающегося многоугольника
Первоначально я реализовал алгоритм 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