Тема: Площадь пересечения

Есть две замкнутые пересекающиеся полилинии.
Можно ли используя AcDbMPolygon или что-то другое получить их площадь пересечения?

Re: Площадь пересечения

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));
     }
  }
}

Re: Площадь пересечения

Спасибо большое за ответ.

Re: Площадь пересечения

А расшифруйте пожалуйста, что это за конструкция AcDbObjectPointer<AcDbCurve>  ?

Re: Площадь пересечения

> supremum
Это "интеллектуальный указатель", в конструкторе которого открывается объект, а в деструкторе закрывается. Не поленись и посмотри в Help'е и в файле dbobjptr.h

Re: Площадь пересечения

такой вопрос, а как получить полилинию, построенную на пересечении двух других пересекающихся и замкнутых?

Re: Площадь пересечения

> Shedever
Расчленить полученный в предыдущем примере регион. Только может получится не одна полилиния если пересечение могут образовывать несколько замкнутых областей.