2015-02-01 3 views
4

Я искал Интернет и, возможно, мне не хватает правильных ключевых слов, но мне не удалось найти ничего подобного. Я нашел только полилинии (или просто строки), которые не являются точными графами. Я хотел бы создать схему графика (радиуса r), как видно на рисунке. Есть ли что-то уже доступное? Я бы хотел избежать повторного использования колеса, так сказать.Есть ли алгоритм для создания схемы графика?

enter image description here

Если кто-то может на меня намек на что-то или, по крайней мере, на каком-то базовом принципе, как сделать это было бы здорово. В противном случае я, конечно, буду «изобретать» один.

Оптимально в C#.

Обновление: Мне нужно рассчитать контур полигона, а не просто визуально нарисовать его. Зеленые точки представляют собой полученный многоугольник. Также «внутренние» отверстия полностью игнорируются. Достаточно всего одного многоугольника.

Обновление 2: Лучшее изображение, чтобы показать некоторые более экстремальные случаи. Также края графа никогда не перекрываются, поэтому нет необходимости приспосабливаться к этому.

Обновление 3: Картинка обновлена ​​еще раз, чтобы отразить скос.

+1

как рисовать каждый край толщиной 2р? что будет контур графика заполнен! – dotctor

+1

О, мне не нужно рисовать его, но вычислить полученный многоугольник. Я отредактирую вопрос, чтобы это отразить. Хорошая точка зрения. – SmartK8

+0

Какие углы будут? Если угол, подобный одному в левом верхнем углу, становится все меньше и меньше, что должно произойти с контуром? если он двинется в бесконечность? Также: могут ли линии приближаться, чтобы объединить контуры? – TaW

ответ

0

Во-первых, для каждой «линии» от точки A до B сгенерируйте прямоугольник (все 4 точки как «путь», так сказать). Затем выполните поиск двух перекрывающихся прямоугольников и объедините их:

Слияние немного сложнее, идея: начните с вычисления угла всех 8 строк (например, если прямоугольники пройдены по часовой стрелке). Затем проведите один прямоугольник до первого пересечения линии, проверьте с углами, какое направление «снаружи», и двигайтесь вдоль линии пересечения второго прямоугольника ... до тех пор, пока вы не вернетесь в начальную точку снова => Теперь вы пройдете форма обоих вместе (и, надеюсь, где-то она была сохранена).

Объединить до тех пор, пока не останется только одна большая часть (или несколько неперекрывающихся частей). Теоретически, начиная с любой точки, вы можете пройти всю форму, но есть еще одна проблема: возможны отверстия.
Если одна фигура имеет два или более набора дизъюнктов точек (где точка из набора 2 не может достижима из набора 1 и наоборот), все, кроме одного, дизъюнктного пути имеют отверстие. Легкая возможность получить реальную внешнюю границу - это поиск экстремума, т. Е. точка с наибольшей или наименьшей координатой X или Y (только одна из 4 комбинаций в достаточном количестве). Этот момент, безусловно, является частью внешней границы.

+0

Я знаю, что это всего лишь идея, но не слишком ли слияния? Я имею в виду. Вы объединяете два прямоугольника, но тогда вам нужно снова пересечь весь объединенный прямоугольник, когда в него сливается другой? У меня будут тысячи этих графов. Также граф никогда не перекрывает себя (пересечение края другим ребром). Но проблема с дыркой, о которой вы говорили, довольно глубока, вам в основном нужно будет делать CSG на прямоугольниках. Но я рассматриваю ваше решение (смысл и осуществимость я имею в виду). – SmartK8

+0

Жаль, что здесь была ночь. Первый подход выглядит «ОК», «поворачивая» угол, пока не появится пересечение, но я боюсь, что слияние тысяч прямоугольников действительно приведет к сумасшедшему объему слияния и пересечениям линий - неосуществимо (поскольку это должно быть в режиме реального времени). Вероятно, я не понимаю второго подхода крайностей. Поскольку, на мой взгляд, слияние двух прямоугольников может производить 6-точечный многоугольник, и я не знаю, как обнаружить внутренние (не «крайние») точки. Может быть, немного поразмыслите, если хотите. – SmartK8