Тема: Пересечение объектов в UCS и ECS

Может мне кто - нибудь объяснит как реализовать обрезание объектов подобно команде trim с опциями Project
Описание нахождения точек пересечения
UCS. Задается по умолчанию. Объекты проецируются  на плоскость XY текущей ПСК. Поэтому если координаты двух линий по оси Z отличны, то одну из них можно обрезать и продолжить до другой линии, несмотря на то, что они в действительности не пересекаются.
View. Объекты проецируется параллельно текущему  виду и подрезаются или продолжаются в соответствии с тем, как они выглядят на экране. Они не обязательно должны пересекаться на экране.
Я программирую на библиотеке DWGDirect, которая очень похожа на ObjectArx
Пока я хочу реализовать это только для объектов:
-линий
-дуг
-окружности
-полилинии
-эллипсы
Найти точки пересечения в 3d пространстве могу.
Посмотрев help по ObjectArx в DWGDirect примерно тоже самое
Матрица для преобразования к eye
getWorldToEyeTransform(matrixW2E)
Матрица для преобразования к ucs
AcDbUCSTableRecord *pUCS;
AcGePoint3d origin = pUCS->origin();
AcGeVector3d xDirection = pUCS->xAxis(),
yDirection = pUCS->yAxis(),
zDirection = xDirection.crossProduct(yDirection);
pUCS->close();
AcGeMatrix3d matrix;
matrix.setCoordSystem(origin, xDirection, yDirection, zDirection);
Я думаю что нужно выполнить следующую последовательноть действий для решения задачи:
1 Преобразовать объекты через ручки редактирования к одной из координатных систем например к UCS (а для View это будет ECS), то есть каждую ручку которая есть AcGePoint3d(в ObjectArx) преобразовать через transformBy(соотв матрица) к соотв системе координат. Или у сразу преобразовать  AcDbEntity через transformBy(соотв матрица).
2 Преобразовать обратно фугуры из UCS или ECS в WCS.
Вопросы:
1 Как найти точки пересечения как написано в "Описание нахождения точек пересечения" средствами ObjectArx, мне нужно конечно для DWgDirect, но мне инетересно услышать идеи как это можно выполнить в ObjectArx и вообще было бы замечательно увидеть исходный код.
2 Правильно ли я описал последовательность действий для решения своей задачи?
3 Могут ли объекты лежать друг на друге но не пересекаться после преобразование в eye или ecs?

Re: Пересечение объектов в UCS и ECS

Все указанные тобой примитивы производные от AcDbCurve. Попробуй воспользоваться методом AcDbCurve::getOrthoProjectedCurve() для получения проекций линий на заданную плоскость. После этого можно будет найти точки пересечения (если они конечно есть). Так что главное - это построить плоскость (AcGePlane).
Объекты могут лежать друг на друге и не пересекаться.

Re: Пересечение объектов в UCS и ECS

Спасибо за подсказку Александр

Re: Пересечение объектов в UCS и ECS

Теперь у меня новая проблема Я спроецировал объекты на плоскости UCS и ECS нашел точки пересечения. Но не могу догадаться как теперь  спроецировать точки пересечения из UCS и WCS  на объекты которые в WCS.

Re: Пересечение объектов в UCS и ECS

//Дублирую пред пост с исправлением WCS на ECS//
Теперь у меня новая проблема Я спроецировал объекты на плоскости UCS и ECS нашел точки пересечения. Но не могу догадаться как теперь спроецировать точки пересечения из UCS и ECS на объекты которые в WCS.

Re: Пересечение объектов в UCS и ECS

У тебя есть плоскость (AcGePlane) - соотвественно есть вектор нормали (AcGeVector3d) к этой плоскости. По точке пересечения на плоскости и вектору ты можешь построить прямую и найти ее пересечение с исходными кривыми.

Re: Пересечение объектов в UCS и ECS

Да хороше решение спасибо

Re: Пересечение объектов в UCS и ECS

В UCS вроде точки пересечения на ходятся праильно, а вот в ECS нет
у меня предположение что я не правильно определяю ECS plane (AcGePlane)
Подскажите пож как правильно определить Ecs plane в ObjectArx

Re: Пересечение объектов в UCS и ECS

А при чем здесь ECS (Entity Coordinat System)? Может все-таки DCS (Display Coordinat System)?

Re: Пересечение объектов в UCS и ECS

есть в DWGDirect класс OdGsBaseVectorizeView
альтернативы ему в ObjectArx не нашел
Из него можно взять:
-положение камеры и цели для камеры по этим точкам построить вектор z
-вектор по y, который вращаем против часовой стрелки по вектору z и получаем вектор x
точку origin я из него не нашел как взять поэто му вместо нее взял точку цель для камеры
и подставляем это все в
AcGePlane(
const AcGePoint3d& or,
const AcGeVector3d& uAxis,
const AcGeVector3d& vAxis);

Re: Пересечение объектов в UCS и ECS

Александр расскажите пож чем отличается DCS и ECS и зачем они нужны

Re: Пересечение объектов в UCS и ECS

А еще shedever задавал вопрос про Device CS и Display CS. Может быть Device CS и Display CS это просто разная трактовка? В одних runtime Device CS в других Display CS а на самом деле это одно и тоже.

Re: Пересечение объектов в UCS и ECS

Я почемутто думал что ECS это eye coordinate system а не entity coordinate system

Re: Пересечение объектов в UCS и ECS

> DenisCadPorgrammer
DCS - это система координат "вида" (т.е. определяется вектором "взгляда" VIEWDIR и центром экрана VIEWCTR), а ECS - это система координат примитива (имеет смысл только для плоских примитивов - CIRCLE,ARC,LWPOLYLINE,...) - определяется вектором нормали к плоскости примитива.

Re: Пересечение объектов в UCS и ECS

Да я понял что ObjectArx это именно так.
А в DwgDirect ECS это именно eye coordinate system. Тогда я меня вопрос) Как получить в ObjectArx DCS plane?

Re: Пересечение объектов в UCS и ECS

Но еще в DwgDirect есть DeviceCoordinateSystem это для меня пока что вот и непонятно как EYE COORDINATE SYSTEM связана c DEVICE COORDINATE SYSTEM.

Re: Пересечение объектов в UCS и ECS

Как получить в ObjectArx DCS plane?

Я же написал - по глобальным переменным VIEWDIR (это вектор) и VIEWCTR (это точка).

Re: Пересечение объектов в UCS и ECS

Ok я сразу не понял)

Re: Пересечение объектов в UCS и ECS

У меня новая проблема:
В DWgDirect не реализована функция getOrthoProjectedCurve. Точнее она есть как чисто витуальная функция и на конкретных объектах выбрасывает исключение "пока не реализовано".
Думаю задачу обрезки объектов можно решить след способом:
1 Построить ортогональную проекцию использованием каких нибудь матриц преобразования. Сейчас я сам строю проекции. Примерно таким способом. Линии паралельно преобразую на плоскость в линии. Окружности/арки паралельно на плоскость эллипсы. Полилинии это вообще страшная весчь, каждый сегмент отдельно строится проекция, так как в полилинии нет эллипсов, и ищется точки пересечения. Сосплайнами это мега жесть берем сампел поинтыс (набор точек ) на проекции и ищем точки пересечения работает мега долго. Какие матрицы для построения ортогональной проекции нужно использовать? Объясните на примере ObjectArx а я постараюсь разобраться.
2 Найти точки пересечения в проекций на плоскостях UCS или DCS. Вопрос 2 Я знаяю как найти точки пересечения на объектах, но параллельные проекции это искаженные объекты то есть окружность превращается в эллипс например. Думаю что здесь нужно тоже использовать какие -то матрицы, чтобы сначало получить нормальные объекты найти на нормальных не . Но какте не знаю.
3 Получить точки пересечения на объектах в WCS. Но это единственное что у меня получилось сделать хорошо.

Re: Пересечение объектов в UCS и ECS

Про intersectWith в DWGDirect это вообще песня)

Re: Пересечение объектов в UCS и ECS

Исправленный пункт 2
2 Найти точки пересечения в проекций на плоскостях UCS или DCS. Вопрос 2. Я знаяю как найти точки пересечения на объектах, но параллельные проекции, это искаженные объекты, то есть окружность превращается в эллипс например. Думаю что здесь нужно тоже использовать какие -то матрицы, чтобы сначало получить нормальные объекты найти на нормальных использовать мои алгоритм, потом точки пересечения преобразовать к проекциям. Но как это сделать я тоже пока не тогадался.

Re: Пересечение объектов в UCS и ECS

> DenisCadPorgrammer
Ответ сразу на три вопроса - никаким матричным преобразованием нельзя в общем случае получить ортогональную проекцию. Все матричные преобразования сохраняют тип примитива, а тут окружность->эллипс и т.д. Я не в курсе есть ли в DWGdirect классы/функции аналогичные AcGe в ObjectARX. Если есть, то можно преобразовывать AcDb в AcGe, затем AcGeCurve3d::orthoProject и обратное преобразование AcGe в AcDb.

Re: Пересечение объектов в UCS и ECS

Да спосибо такой метод есть. По пробую использовать.