Тема: Объединение многоугольников

Как попроще (в плане краткости кода и длительности выполнения кода) объеденить два многоугольника с общей гранню?

(изменено: Николай, 6 августа 2009г. 17:41:51)

Re: Объединение многоугольников

способ 1.
превратить их в области и провести операцию булевого объединения. потом найти контур

способ 2.
чистая математика.

способ 3.
через штриховку, тем более, что получение контура штриховки в предыдущей теме

Re: Объединение многоугольников

через штриховку, тем более, что получение контура штриховки в предыдущей теме

Вот именно! Дело в том, что очень нужно контур внешний и одновременно общий. Если объединение делать так:
1) выбросить все островки
2) найти общие точки
3) вставить в нушном месте в одну штриховку в нужном порядку другую штриховку
то в результате получается очень много кода =( и далеко не эффективного

чистая математика

Приспособиться к wykobi не очень получилось =( штриховка то может быть заковыристой формы. Или возможно не все комбинации методов wykobi рассмотрела. Может есть какие-нибудь идеи.

превратить их в области и провести операцию булевого объединения. потом найти контур

С регионов контур достать не могу

Re: Объединение многоугольников

это куда-то отдельно

Acad::ErrorStatus postToDB(AcDbEntity* pEnt,AcDbObjectId& idObj,std::wstring ModelPaperSpace=ACDB_MODEL_SPACE); // пишет в БД entity
AcDbRegion * createUnionRegion(AcDbObjectIdArray idArr);// создает из кучи полилиний один общий регион. передавать массив ObjectId-ов полилиний
AcDbRegion * createRegion(AcDbObjectId id);// создает из полилинии регион. передавать ObjectId полилинии

/////////////////////////////////////
AcDbRegion * createRegion(AcDbObjectId id)
{
    AcDbVoidPtrArray lines1; 
    AcDbVoidPtrArray regions1;
    AcDbCurve * pCurve;
    if(acdbOpenObject(pCurve, id, AcDb::kForRead)!= Acad::eOk) return NULL;
    pCurve->close();

    lines1.append(pCurve);
    AcDbRegion::createFromCurves(lines1, regions1);
    if (regions1.isEmpty())return NULL;
    AcDbRegion * pCurRegion = AcDbRegion::cast((AcRxObject*)regions1[0]);
    return pCurRegion;
}

AcDbRegion * createUnionRegion(AcDbObjectIdArray idArr)
{
    if (idArr.isEmpty()) return NULL;
    AcDbRegion * pCurRegion = createRegion(idArr.first());
    if (pCurRegion == NULL) return NULL;

    for (int i = 1; i < idArr.length(); i++)
    {
        AcDbRegion * pTmpRegion = createRegion(idArr.at(i));
        if (pTmpRegion != NULL)
            Acad::ErrorStatus es = pCurRegion->booleanOper(AcDb::kBoolUnite,pTmpRegion);
    }

    return pCurRegion;
}

Acad::ErrorStatus postToDB(AcDbEntity* pEnt,AcDbObjectId& idObj, std::wstring ModelPaperSpace)
{
    Acad::ErrorStatus es;
    AcDbBlockTable * pBlockTable;
    AcDbBlockTableRecord * pSpaceRecord;

    if (acdbCurDwg()==NULL) return Acad::eNoDatabase;
    if ((es = acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead))==Acad::eOk)
    {
        if ((es = pBlockTable->getAt(ModelPaperSpace.c_str(), pSpaceRecord, AcDb::kForWrite))==Acad::eOk)
        {
            if ((es = pSpaceRecord->appendAcDbEntity(idObj, pEnt))==Acad::eOk)pEnt->close();
            pSpaceRecord->close();
        }
        pBlockTable->close();
    }
    return es;
}

дальше в своей функции пишешь

// ObjIdArray - тут уже должны быть иды всех интересующих полилиний
AcDbObjectId iId;
AcDbRegion *pFullReg = createUnionRegion(ObjIdArray);
postToDB(pFullReg,iId/*, а тут если объект не в пространстве модели, а в пространстве листа, то нада вставить еще параметр*/);
// теперь у тебя в iId хранится общий регион
/*
дальше напрямую получить точки вроде как нельзя, по крайней мере у меня не получилось, 
НО эту ерунду можно передать на создание штриховки, т.к. Id уже есть, а из штриховки получить контурную полилинию. 
PS: этот способ надежней чем просто через штриховку, т.к. если у тебя контура будут пересекаться, то штриховка будет интересной :)
*/

кстати, код на работоспособность не проверял, вставлял кусками от себя, может че и пропустил.

Re: Объединение многоугольников

Спасибо, с меня мороженое =) Увидела свои ошибки :oops: А идеи были похожыми

Re: Объединение многоугольников

Николай пишет:

дальше напрямую получить точки вроде как нельзя, по крайней мере у меня не получилось

BREP тебе в руки.

Re: Объединение многоугольников

К сожалению не увидила способа получить с BREP точки контура =(

Re: Объединение многоугольников

Savka Antonina пишет:

К сожалению не увидила способа получить с BREP точки контура =(

Посмотри пример utils\brep\samples\brepsamp
Команда brdump позволит тебе получить координаты контура области (REGION). Пример:

Command: BRDUMP
Select No Validation vs. Full Validation: None/<Full>:
Enter Subent Type: Edge/Face/<Brep>:
Select Local Entity vs. Database Entity: Local/<Database>:
 Pick a solid

Select Traversal Direction for Brep Dump: Upwards/<Downwards>:
 *Complex No: 1
 **Shell No: 1
 This is the exterior shell
 ***Face No: 1
 ****Loop No: 1
 This is the exterior loop
 *****Edge No: 1
 ******Edge No. 1: Curve Orientation in Loop is Negative
 *****Edge No: 2
 ******Edge No. 2: Curve Orientation in Loop is Negative
 *****Edge No: 3
 ******Edge No. 3: Curve Orientation in Loop is Negative
 *****Edge No: 4
 ******Edge No. 4: Curve Orientation in Loop is Negative
 *****Edge No: 5
 *****Edge No: 6
 *****Edge No: 7
 *****Edge No: 8
 *****Loop No. 1 has 8 edges
 *****Vertex No: 1
Coordinate of loop vertex:
 Vertex Point is (1087.078481, 720.421638, 0.000000)
 *****Vertex No: 2
Coordinate of loop vertex:
 Vertex Point is (1217.505216, 720.421638, 0.000000)
 *****Vertex No: 3
Coordinate of loop vertex:
 Vertex Point is (1217.505216, 824.715567, 0.000000)
 *****Vertex No: 4
Coordinate of loop vertex:
 Vertex Point is (1054.188263, 824.715567, 0.000000)
 *****Vertex No: 5
Coordinate of loop vertex:
 Vertex Point is (1054.188263, 781.637640, 0.000000)
 *****Vertex No: 6
Coordinate of loop vertex:
 Vertex Point is (940.773707, 781.637640, 0.000000)
 *****Vertex No: 7
Coordinate of loop vertex:
 Vertex Point is (940.773707, 627.464007, 0.000000)
 *****Vertex No: 8
Coordinate of loop vertex:
 Vertex Point is (1087.078481, 627.464007, 0.000000)
 *****Loop No. 1 has 8 vertices
 ****Face No. 1 has 1 loops
 ***Shell No. 1 has 1 faces
 **Complex No. 1 has 1 shells
 *Brep has 1 complexes

Re: Объединение многоугольников

Спасибо, помогло =)