Учитывая координаты нескольких точек на плоскости и радиус окружности, окружающей каждую точку, нарисуйте многоугольники, представляющие окружности и ребра, где встречаются окружности. Прямые края всегда будут падать вдоль линий пересечения окружность-круг , но могут не следовать всей длине этих линий.
Согласно предложению mbomb007 , представьте себе поведение двумерных мыльных пузырей. Это технически неправильно, потому что мыльные пузыри всегда встречаются под углом 120 °, чтобы минимизировать энергию, в то время как эти круги могут встречаться под любым углом.
Это диаграмма Вороного, за вычетом плоскости определенной области. Спасибо Андреас . Это на самом деле обобщение диаграммы Вороного, называемой степенной диаграммой .
Примеры
Например, учитывая две точки и два радиуса, результат может выглядеть следующим образом:
Добавьте другую точку и радиус, и результат может выглядеть следующим образом:
вход
Вы можете структурировать вход по своему усмотрению. Пожалуйста, опубликуйте результаты со следующими данными.
Тест 1
- х: 10, у: 10, р: 10
- х: 25, у: 12, р: 8
Тест 2
- х: 8, у: 10, р: 6
- х: 20, у: 8, р: 4
- х: 18, у: 20, р: 12
Выход
Вывод должен быть графическим и должен включать границы многоугольника, но больше ничего не требуется. Точки и пересечения не должны быть представлены, как в примерах.
Ограничения
- Никакая точка не будет существовать в радиусе другого круга.
- Стандартные правила Codegolf.
- Никакие ответы с лазейками не будут приняты, но не стесняйтесь веселиться с ним.
источник
Ответы:
Python 2,
473355 байтЭто читает набор кругов как
(x,y,r)
кортежи на стандартном вводе и выводит изображение в формате PGM на стандартный вывод. Он работает приблизительно, вычисляя функцию расстояния диаграммы для каждого пикселя, и затеняя каждый пиксель менее чем на один пиксель пропорционально его расстоянию.Здесь функция расстояния была разделена на 32, чтобы сделать ее видимой:
источник
exec"%s=m%s(%s for u,v,r in L);"*4%('a','in','u-r','b','ax','v-r','c','in','u+r','d','ax','v+r')
C # ~ 2746
Это решение в C #. Вероятно, далеко от оптимального, но C # все равно не выиграет. Просто хотел доказать, что могу это сделать.
Ввод через командную строку путем указания значений, разделенных пробелом в следующем порядке: xyr. Выходные данные - это файл 'l.bmp' в каталоге выполнения.
Программа принимает любое количество кругов.
Тест 1: 10 10 10 25 12 8
Тест 2: 8 10 6 20 8 4 18 20 12
Вся математика, участвующая здесь, основана на этом . Координаты линий было легко получить с помощью формул по ссылке. Однако их нужно было поворачивать на угол между двумя задействованными центрами криклов.
Чтобы уменьшить длину линий, я рассчитал их пересечения. Затем для этого пересечения я проверил, достигает ли конец текущей строки окружности, которая не является «родителем линии», а также содержит само пересечение. Если это так, то конец линии был уменьшен до места пересечения.
Круги было просто нарисовать, «ненужные» детали было трудно удалить, поэтому я придумал «резиновый» раствор, который удаляет ненужный материал, окрашивая его в белый цвет. Вид грубого принуждения. Это делается путем обхода края каждого круга и проверки, находится ли этот пиксель в пределах диапазона другого круга.
Первоначально я хотел использовать свой собственный метод рисования кругов, который рисует только круг с указанными углами, но это не получилось хорошо и потребовал еще больше строк кода.
Действительно трудно объяснить это, если вы не заметили ... Английский не моя мать, поэтому я прошу прощения за это.
Golfed
Более сложные примеры (верхний круг попадает в отрицательные значения y)
источник