У меня есть интересная проблема, которую я пытался решить за последнее время:
У меня есть 3 круга на плоскости 2D xy, каждый с тем же известным радиусом. Я знаю координаты каждого из трех центров (они произвольны и могут быть где угодно).
Каков наибольший треугольник, который можно нарисовать так, чтобы каждая вершина треугольника находилась на отдельном круге, каковы координаты этих вершин?
Я рассматривал эту проблему часами и спрашивал кучу людей, но пока только один человек смог предложить правдоподобное решение (хотя я не могу доказать это).
Решение, которое мы придумали, предполагает сначала создание треугольника вокруг трех центров окружности. Затем мы смотрим на каждый круг индивидуально и вычисляем уравнение линии, проходящей через центр круга и перпендикулярно противоположному краю. Затем мы вычисляем две точки пересечения круга. Затем это делается для следующих двух кругов с результатом 6 баллов. Мы перебираем 8 возможных трехточечных треугольников, создаваемых этими 6 точками (ограничение состоит в том, что каждая точка большого треугольника должна быть на отдельном круге) и найти максимальный размер.
Результаты выглядят разумно (по крайней мере, когда они вытягиваются на бумаге), и он проходит специальный случай, когда центры кругов все падают на прямую (дает известный наибольший треугольник). К сожалению, у меня нет способа доказать, что это правильно или нет.
Мне интересно, если кто-то столкнулся с проблемой, подобной этому, и если да, то как вы ее разрешили?
Примечание. Я понимаю, что это в основном математический вопрос, а не программирование, однако он будет реализован в коде, и он должен быть оптимизирован для работы очень быстро и эффективно. На самом деле, у меня уже есть вышеупомянутое решение в коде и проверено на работу, если вы хотите взглянуть, пожалуйста, дайте мне знать, я решил не публиковать его, потому что его все в векторной форме и в значительной степени невозможно выяснить точно, что происходит (потому что он был сжат, чтобы быть более эффективным).
Наконец, да, это для школьной работы, хотя это НЕ домашнее задание/задание/проект. Это часть моей дипломной работы (притом очень маленькая часть, но по-прежнему технически ее часть).
Спасибо за вашу помощь.
Edit: Heres новый алгоритм, который я придумал немного назад.
Начиная с центра круга, нарисуйте линию на два других центра. Вычислите линию, которая делит пополам созданный угол и вычисляет пересечения между кругом и линией, проходящей через центр вашего круга. Вы получите 2 результата. Повторите это для двух других кругов, чтобы получить в общей сложности 6 очков. Итерации по этим 6 пунктам и получить 8 возможных решений. Найдите максимум 8 решений.
Этот алгоритм будет иметь дело с коллинеарным случаем, если вы рисуете свои линии в одном "направлении" относительно трех точек.
Из нескольких случайных испытаний я попытался использовать программное обеспечение САПР для определения геометрии для меня, этот метод, по-видимому, превосходит все другие ранее описанные методы. Однако уже доказано, что это не оптимальное решение одним из счетчиков Victor примеры.
Завтра я запомню это, по какой-то причине я потерял удаленный доступ к моему университетскому компьютеру, и большинство вещей на нем.