Тема: Площадь пересечения
Есть две замкнутые пересекающиеся полилинии.
Можно ли используя AcDbMPolygon или что-то другое получить их площадь пересечения?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Площадь пересечения
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть две замкнутые пересекающиеся полилинии.
Можно ли используя AcDbMPolygon или что-то другое получить их площадь пересечения?
static void GetAreaOfIntersection(void) { ads_name en1,en2; ads_point p1,p2; Acad::ErrorStatus es; if (acedEntSel(_T("\nВыберите первую полилинию: "),en1,p1) == RTNORM && acedEntSel(_T("\nВыберите вторую полилинию: "),en2,p2) == RTNORM) { AcDbObjectId id1, id2; acdbGetObjectId(id1,en1); acdbGetObjectId(id2,en2); AcDbObjectPointer<AcDbCurve> pPline1(id1,AcDb::kForRead) ; AcDbObjectPointer<AcDbCurve> pPline2(id2,AcDb::kForRead) ; if (pPline1.openStatus() != Acad::eOk || pPline2.openStatus() != Acad::eOk) return; double area1 = 0; pPline1->getArea(area1); double area2 = 0; pPline2->getArea(area2); acutPrintf(_T("\nПлощадь первой полилинии: %g"),area1); acutPrintf(_T("\nПлощадь второй полилинии: %g"),area2); AcDbVoidPtrArray ar; ar.setLogicalLength(1); ar[0] = pPline1.object(); AcDbVoidPtrArray regions1; AcDbVoidPtrArray regions2; AcDbRegion::createFromCurves(ar,regions1); ar[0] = pPline2.object(); es = AcDbRegion::createFromCurves(ar,regions2); if (regions1.length() == 1 && regions1[0] && regions2.length() == 1 && regions2[0]) { AcDbRegion *reg = (AcDbRegion *)regions1[0]; es = reg->booleanOper(AcDb::kBoolIntersect,(AcDbRegion *)regions2[0]); if (es != Acad::eOk) { acutPrintf(_T("\nОшибка при проверке пересечения: %s"),acadErrorStatusText(es)); return; } double regarea = 0; es = reg->getArea(regarea); if (es != Acad::eOk) { acutPrintf(_T("\nОшибка при получении площади пересечения: %s"),acadErrorStatusText(es)); return; } acutPrintf(_T("\nПлощадь пересечения: %g"),regarea); } else { acutPrintf(_T("\nОшибка при создании AcDbRegion: %s"),acadErrorStatusText(es)); } } }
А расшифруйте пожалуйста, что это за конструкция AcDbObjectPointer<AcDbCurve> ?
> supremum
Это "интеллектуальный указатель", в конструкторе которого открывается объект, а в деструкторе закрывается. Не поленись и посмотри в Help'е и в файле dbobjptr.h
такой вопрос, а как получить полилинию, построенную на пересечении двух других пересекающихся и замкнутых?
> Shedever
Расчленить полученный в предыдущем примере регион. Только может получится не одна полилиния если пересечение могут образовывать несколько замкнутых областей.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Площадь пересечения
Форум работает на PunBB, при поддержке Informer Technologies, Inc