в наличии:Я правильно понимаю, что у тебя есть массив AcDbFace, каждый элемент которого соответствует одной из граней поверхности (ну или массив структур, содержащих по три точки)? Если да, то задача совсем простая (если её решать в лоб):
1. триангулированая 3д поверхность, созданная по 3д точкам.
2. полилиния над этой поверхностью.
(хотя это наверно не очень важно ибо его можно разбить на AcDbFaceИменно так. Так что считай, что у тебя есть массив AcDbFace.
Так вот, если мы возьмем полилинию из 2 точек например, то проверяя только эти вершины у нас получится прямая (в 3д пространстве),Тогда проецируй на плоскость X0Y и саму свою полилинию и все AcDbFace, находи точки пересечения проекции полилинии с проекциями всех AcDbFace и восстанавливай координату Z для этих точек по исходным AcDbFace.
а на самом деле должна быть ломаная, потому что под линией будут перепады высоты.
Может все таки по полилинии идти шагомТы таким образом можешь пропустить место стыковки двух треугольников, образующих профиль, так что категорически не советую.
А пользовательские координаты конечно нужно будет приводить к мировым.Причем здесь пользовательская система координат? Ты имеешь дело с примитивами AutoCAD, так что всё будет в мировой системе координат. А вот если у полилинии будут дуги (маловероятно на профиле), то их нужно аппроксимировать линейными сегментами. Иначе в качестве проекции ты получишь эллиптические дуги, которые потом тоже придётся аппроксимировать.
Александр, а разве для LWPOLYLINE координаты хранятся в мировой системе, а не в OCS?1) OCS (или ECS) - это не UCS (ПСК). Это система координат объекта.
This function sets pt to the 3D location of the vertex index in World Coordinates.
взял пример и переписал на ObjectARX.Кстати, не слишком удачный алгоритм. Ограничение в 32K вершин чревато последствиями...
http://through-the-interface.typepad.com/through_the_interface/2009/04/triangulating-an-autocad-polyface-mesh-from-a-set-of-points-using-net.html
Кстати, не слишком удачный алгоритм. Ограничение в 32K вершин чревато последствиями...Что касается количества вершин, меня это вполне устраивает.
По-моему, дуга при проецировании ее на плоскую поверхность (которая не параллельная и не перпендикулярна плоскости дуги) даст в результате как минимум часть эллипса.
Что касается количества вершин, меня это вполне устраивает."Никогда не говори никогда". 32K пикетов - это всего лишь сетка приблизительно 180 x 180.
чертежи для построения это топографические планы с пикетами, вряд ли кто-то больше на измеряет.
вопрос остается лишь в том что делать в случае поворота полилинии посередине AcDbFace, т.е. вершина линии будет внутри треугольника.Я как-то забыл упомянуть, что кроме пересечений проекции полилинии со всеми гранями проекций AcDbFace необходимо добавить еще все вершины проекции полилинии. Думал что это само-собой разумеется.
чертежи для построения это топографические планы с пикетами, вряд ли кто-то больше на измеряет.не хочется огорчать, но если человеку на спину повесить GPS ранец и отправить гулять на пару часиков по карьеру для съемки бровок ))), то точек будет значительно больше чем 32К.
Данных алгоритм периодически либо не захватывает все предложенные вершины, либо строит модель с пересекающимися ребрами.значит в помощь википендия ))) там есть основные алгоритмы, правда нет реализации ))). хотя скорей всего просто что-то недопереводил с C#, т.к. там реализация простейшего алгоритма, который плохо работает только при большом перепаде Z. в любом случае реализаций триангуляций куча в сети и на разных языках.
а вот сам алгоритм взял первый который нашел, т.к. про триангуляцию ничего не знаю.:o а вот это уже настораживает. как можно найти правильное решение в вопросе, о котором ничего не знаешь? если в задаче стоит построить сетку и найти путь по ней используя плановую проекцию, то "что такое триангуляция" - придется выучить. правда, если сетку дают уже готовую, то голову можно и не забивать.
а вот сам алгоритм взял первый который нашел, т.к. про триангуляцию ничего не знаю.Я когда-то использовал этот алгоритм: http://paulbourke.net/papers/triangulate/cpp.zip
Может есть варианты по практичней? Данных алгоритм периодически либо не захватывает все предложенные вершины, либо строит модель с пересекающимися ребрами.