![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Слияние массивов [D7]
NickName © (2010-12-07 11:58:00)Доброго времени суток. Имеется два массива с точками окружности элипса, ну или другой произвольной фигуры, но для начала пока элипс. Необходимо слить эти два массива в один, при этом исключить все точки попавшие на плоскости совмещаемых элипсов.
Скриншот для полной понятности моей "хотелки":
http://s47.radikal.ru/i116/1012/3e/06b16d869909.jpg
Буду благодарен за любые объяснения ну или пинок в нужную сторону раскопок :)
NickName (2010-12-23 08:31:00) [1]Ну собсно я получил все, что хотел. Прошу прокоментировать алгоритм/код. Там немного...
Демка D7
http://ifolder.ru/20972059
NickName (2010-12-18 11:51:00) [2]Модифицировал.
Формируем один круг, получаем перпендикуляр, разворачиваем на 180 градусов - получаем вторую точку, переносим эти точки относительно второго конца отрезка - получаем вторые две точки. Итого есть касательные. Так же добавил закругление концов линии. Короче получил полноправный полигон, для заливки, например, построчным методом заполнения полигонов.
Теперь задача: избавиться от круга и соответственно перебора в поисках перпендикуляра.
Т.е имеем отрезок, одна из координат отрезка лежит в центре круга, имеем радиус круга, как математически получить точку из окружности, которая дает перепендикуляр на центр круга, относительно отрезка. Вещественые типы юзать можно.
NickName (2010-12-09 08:20:00) [3]Похоже линия получилась. Делал так:
На начальных и конечных координатах утолщамой линии формируем круги с центром на координатах линии, затем из окружности путем перебора точек выбираем ту точку которая дает самый точный перпендикуляр на центр круга, относительно линии. Затем разворачиваем эту точку на 180 градусов относительно центра круга и вуаля, получили четыре точки для пропроброса касательных на окружность кругов :)
юзал две функции из FastGeo, покрайне мере одну, вторая похоже какаята производная из них (нашел на просторах тернета)
Сергей М. (2010-12-08 00:26:00) [4]
> FastGeo
> ...
> ..интересная штука
Действительно - по уму сделана.
Кратко, изящно, понятно и достаточно эффективно.
NickName (2010-12-07 23:17:00) [5]
> Посмотрите FastGeo - там много чего есть.
Какая интересная штука, с удовольствием покавыряю.
Спасибо!
Jeer (2010-12-07 16:55:00) [6]Посмотрите FastGeo - там много чего есть.
NickName (2010-12-07 16:53:00) [7]Так бы проблем небыло...
NickName (2010-12-07 16:52:00) [8]Не, WinAPI нельзя юзать, только ручками. ибо кроссплатформ...
Юрий Зотов (2010-12-07 15:53:00) [9]
> NickName (07.12.10 13:18) [11]
> т.е. находить все точки плоскости (что собсно не проблема),
> например в массиве один и исключать из них окружность массива
> два, затем наоборот. Так?
Посмотрите в справке WinAPI раздел "region functions".
Создаем по точкам каждого массива регион. Потом, комбинируя эти 2 региона, создаем регион их общей области и из обоих массивов исключаем точки, попадающие в этот регион.
MBo (2010-12-07 15:08:00) [10]Это построение НЕвыпуклой оболочки множества точек.
Для выпуклых оболочек (convex hull) алгоритмы хорошо известны.
Для невыпуклых задачи могут быть решаемы в конкретных случаях (для выпуклой оболочки есть абсолютно четкие критерии, какие из точек должны принадлежать оболочек, а для невыпуклой они могут быть умозрительными ("некрасиво" и т.п.) ).
Собственно, проблема сводится к формализации критериев принадлежности.
NickName (2010-12-07 15:01:00) [11]
> - общие касательные не проще посчитать?
Врятли. Так как чтоб их провести нужно провести прямые параллельно "осевой", что опять нас приводит к рассчету гипотенузы, что в свою очередь возвращает опять к
> Через треугольники (есть такой алгоритм построения такой
> линии) - это, я как понял, недостижимо.
han_malign (2010-12-07 14:29:00) [12]на заре юношества, пытался определить принадлежность точки произвольному многоугольнику через круговой интеграл, но как, какие леммы применял, и получилось ли - не помню...
> затем эллипсы сливаем в единную кривую исключая лишние точки
- общие касательные не проще посчитать?
NickName (2010-12-07 13:33:00) [13]
> 12 © (07.12.10 13:03) [10]
> во.. http://zalil.ru/30093518Ивыкидываем точки с координатами
> из красного из обоих фигурили нет?
э не ;) расположив под другим углом очистятся нужные точки
NickName (2010-12-07 13:18:00) [14]
> Если планируется переход на произвоьные фигуры, то аналитика
> не прокатит - надо делать через регионы.
т.е. находить все точки плоскости (что собсно не проблема), например в массиве один и исключать из них окружность массива два, затем наоборот. Так?
Попробую дополнить сабж. На данном этапе я хочу получить регулируемую по толщине линию, одинаковую при любом градусе наклона. Через треугольники (есть такой алгоритм построения такой линии) - это, я как понял, недостижимо. Потому хочу попробовать через еллипсы. Т.Е. получаем посредством алгоритма Брезенхема прямую, на нее накладываем эллипсы, затем эллипсы сливаем в единную кривую исключая лишние точки, отрисовываем, заливаем. Где-то так.
Может можете посоветовать что-нить более оптимальное?
12 (2010-12-07 13:03:00) [15]во..
http://zalil.ru/30093518
И выкидываем точки с координатами из красного из обоих фигур
или нет?
Юрий Зотов (2010-12-07 12:59:00) [16]Если планируется переход на произвоьные фигуры, то аналитика не прокатит - надо делать через регионы.
NickName (2010-12-07 12:47:00) [17]отсюда
http://dxdy.ru/topic8441.html
NickName (2010-12-07 12:47:00) [18]
> 12 © (07.12.10 12:38) [6]
неее выньапи не пойдет
> Кщд (07.12.10 12:35) [4]
ща попробую прикинуть
пока проверяю эту формулу
http://dxdy.ru/math/5d2f2e51273cd661425efc7e1e566cde82.gif
12 (2010-12-07 12:38:00) [19]тупо
http://msdn.microsoft.com/en-us/library/dd162883%28VS.85%29.aspx
Кщд (2010-12-07 12:36:00) [20]поправка
п.2 читать как:
2. берем ближайшую к а1 слева(а0) и справа(а2), строим векторы A1(а1, а0), A2(а1, а2), B(а1, b);