Форум программистов, компьютерный форум, киберфорум
Наши страницы
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Demon071
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 6
1

Рисование ломанной фигуры вокруг нескольких точек

23.02.2014, 00:33. Просмотров 1058. Ответов 2
Метки нет (Все метки)

Нужна помощь в понимании того, каким образом можно построить такие фигуры, как на картинке. Известны только координаты точек, их количество может быть разнообразным: как 2 точки, так и 3 или 4.
0
Миниатюры
Рисование ломанной фигуры вокруг нескольких точек  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 00:33
Ответы с готовыми решениями:

Посчитать площадь вокруг облака точек (с учётом области влияния точек)
Есть набор точек на плоскости. Каждая точка имеет известную область влияния,...

Аппроксимация ломанной кривой используя дуги окружностей
Доброго времени суток. Перехожу сразу к описанию поставленной задачи....

Поиск минимального расстояния от точки до ломанной на сфере. Язык Си
Здравствуйте! Задача заключается в следующем: дано количество точек n, по...

Рисование фигуры из точек в файле
Добрый день ! На досуге решил написать программу которая рисует фигуру в...

Разворот объекта вокруг нескольких точек в C++/DirectX
Возникла проблема. Суть такова: некоторый объект (их много) необходимо ...

2
Mysterious Light
Эксперт по математике/физике
4079 / 1993 / 404
Регистрация: 19.07.2009
Сообщений: 3,009
Записей в блоге: 21
23.02.2014, 15:03 2
Лучший ответ Сообщение было отмечено Demon071 как решение

Решение

Допустим, задан граф матрицей смежности, т.е. a[i,j] может рассматриваться как истинное булевое утверждение, если i и j соединены, и ложно в противном случае. Также заданы радиус-векторы всех точек r[i] и радиус закругления R.

Очевидно, что около каждой точки можно начертить окружность R, но не вся она будет видна (напр., в центре на нижнем рисунке). Для того, чтобы узнать, какой сектор не виден, а какой нужно рисовать, определим точки соприкосновения окружности с прямыми участками.

Рассмотрим задачу двух соединенных точек. Очевидно, фигура представляет два отрезка и два полукруга.
Координаты точек: http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{r_1}(x_1,y_1), \quad \vec{r_2}(x_2,y_2)
Перпендикуляр к отрезку: http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{a}(a_x,a_y) = (y_1-y_2, x_2-x_1), \quad\quad\quad \vec{a}\bot\vec{r_1}-\vec{r_2}
Нормированный перпендикуляр:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{a'} = \frac{\vec{a}}{\sqrt{a_x^2+a_y^2}}
Точки перехода прямого участка в округлый:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\vec{b^\pm_{1,2}} = \vec{r_{1,2}}\pm R\vec{a'}
Если кривую обходить против часовой стрелки, то
1. проводится полуокружность от http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{+} до http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{-} с центром в r1 и радиусом R.
2. проводится отрезок от http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{-} до http://www.cyberforum.ru/cgi-bin/latex.cgi?b_2^{-}.
3. проводится окружность от http://www.cyberforum.ru/cgi-bin/latex.cgi?b_2^{-} до http://www.cyberforum.ru/cgi-bin/latex.cgi?b_2^{+}.
4. проводится замыкающий отрезок от http://www.cyberforum.ru/cgi-bin/latex.cgi?b_2^{+} до http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{+}
Итак, при вершине r1 участок окружности от http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{-} до http://www.cyberforum.ru/cgi-bin/latex.cgi?b_1^{+} против часовой стрелки не отображается, потому что лежит внутри.
Для удобства можно задавать секторы круга и дуги окружности не по начальной и конечной точкам, как было выше, а по начальному и конечному углу относительно выделенной оси (абсцисс). Для этого нужно перейти в полярным координатам относительно точки r1 и r2 соотв.:
http://www.cyberforum.ru/cgi-bin/latex.cgi?\operatorname{tg}\varphi^\pm_{1,2} = \frac{\pm R a_y}{a_x}, \quad\quad\quad \varphi^\pm_{1,2} = \operatorname{atan2}(a_x,\pm R a_y)
atan2 — http://javascript.ru/Math.atan2, например.

Рассмотрим случай нескольких точек. Каждая точка с другими смежными связана фигурой, описанной выше. Однако, все внутренние точки не отображаются? только внешние. Внутренними точками на окружности около вершины будут точки из объединения всех невидимых полуокружностей, внешние — из пересечения всех видимых областей. Это означает, что по процедуре выше получатся набор интервалов вида http://www.cyberforum.ru/cgi-bin/latex.cgi?(\varphi^-,\varphi^+), которые нужно объеденить в прямом порядке (от - к + против часовой) или пересечь в обратном (от + к - против часовой). Если искать пересечение, то в результате получится один интервал, поэтому лучше искать именно это. Здесь есть подводный камень, связанный с тем, что http://www.cyberforum.ru/cgi-bin/latex.cgi?\theta и http://www.cyberforum.ru/cgi-bin/latex.cgi?2\pi+\theta на окружности не различимы.

Допустим, Вы смогли определить все видимые дуги. Можно из нарисовать. Кстати, по началу и концу дуги можно определить, к какому прямому участку эта дуга присоединена.
Далее, определяем видимые участки отрезков. Отрезок может заканчиваться либо переходом в дугу по касательной, либо другим отрезком, как на нижней картинке. Для этого можно попарно проверить все отрезки на факт взаимопересечения и в этом случае "укоротить" отрезок до точки пересечения. Это означает, что отрезок переходит в другой отрезок. При множественном пересечении отрезок будет переходить в тот отрезок, который пересекает ближе к середине.

Вроде всё.
1
Demon071
0 / 0 / 0
Регистрация: 07.01.2011
Сообщений: 6
23.02.2014, 16:00  [ТС] 3
Спасибо, буду пробовать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 16:00

Рисование ломанной
Здравствуйте, пользователи форума. Имеется форма с компонентой PictureBox....

Рисование ломанной линии и фиксирование её клавишей
Есть такая задачка: Рисуется ломаная линия. Фиксирование первых и очередных...

Рисование ломанной линии по точкам которые ставит пользователь
Преподаватель попросил выполнить данное задание "Пользователь ставит точки на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru