2

程序输出是:std::vector(0x55f164f79450)而不是Childs[one]:我在这里做错了什么?

任何帮助,将不胜感激 !

在线示例: http ://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm

我的测试代码:

#include <clipper/include/clipper.hpp>
#include <iterator>
#include <algorithm>

using namespace ClipperLib;
using namespace std;

area_partition::area_partition()
{
    //Paths
    Path one = {{10,10},{100,10},{100,100},{10,100}};
    Path two =  {{20,20},{20,90},{90,90},{90,20}};
    Path three = {{30,30},{50,30},{50,50},{30,50}};
    Path four = {{60,60},{80,60},{80,80},{60,80}};

    PolyTree array;

    //Setup output..
    ClipperLib::Clipper c;
    c.AddPath(one, ptSubject, true);
    c.AddPath(two, ptSubject, true);
    c.AddPath(three, ptSubject, true);
    c.AddPath(four, ptSubject, true);
    c.Execute(ctDifference,array);
    c.Clear();

    //call to Clipper.Execute method here which fills 'polytree'
    PolyNode *polynode = array.GetFirst();

    while (polynode)
    {
        //do stuff with polynode here
        qDebug()<< "parent : " << polynode->Parent;
        qDebug()<< "childs : " << polynode->Childs;
        qDebug()<< "isHole : " << polynode->IsHole();
        qDebug()<< "childcount : " << polynode->ChildCount();
        qDebug()<< " ";
        qDebug()<< " ";
        polynode = polynode->GetNext();
    }
}

我的终端输出:

parent :  0x7ffc246b6730
childs :  std::vector(0x55f164f79450)
isHole :  false
childcount :  1


parent :  0x55f164f793f0
childs :  std::vector(0x55f165763b40, 0x55f165763bf0)
isHole :  true
childcount :  2


parent :  0x55f164f79450
childs :  std::vector()
isHole :  false
childcount :  0


parent :  0x55f164f79450
childs :  std::vector()
isHole :  false
childcount :  0

在线示例的输出:

ChildCount = 1
Childs[0]: 
    Contour = ((10,10),(100,10),(100,100),(10,100))
    IsHole = False
    ChildCount = 1
    Childs[0]: 
        Contour = ((20,20),(20,90),(90,90),(90,20))
        IsHole = True
        ChildCount = 2
        Childs[0]: 
            Contour = ((30,30),(50,30),(50,50),(30,50))
            IsHole = False
            ChildCount = 0
        Childs[1]: 
            Contour = ((60,60),(80,60),(80,80),(60,80))
            IsHole = False
            ChildCount = 0
4

2 回答 2

3

您正在迭代一个PolyNode. 根据 Clipper 库文档:

  • Parent是一个指针PolyNode
  • Childs是一个std::vector指向PolyNodes的指针

当你试图输出一个指针时,operator<<通常会显示指针的值而不是指向的对象。这就是为什么你有 0x... 对于父母。

该类有forQDebug的重载,它输出向量的内容,即指针,所以这就是为什么你也为孩子获得 0x...。 operator<<std::vector

如果你想得到你期望的输出,你不需要输出父级。而且您需要使用索引遍历子项以一个接一个地输出它们(以便您可以输出"Child["<<i<<"]:"<<std::endl;),输出的不是指向内容的指针,而是内容本身 "<< *polynode->Childs[i]"

于 2019-11-17T22:44:46.997 回答
0

我找到了解决多树危机的另一种解决方案。

为了检索对象 ID,我使用了polynode->contour信息。

查看第一个 x,y 坐标,我能够识别所有对象。结果是 parent->child 显示为:

  1. -color red -> cw(顺时针),外轮廓

  2. -color yellow -> ccw(逆时针),内轮廓

注意:附加代码由我最小化并作为示例附加以帮助他人。

Path path;
Paths total;

path.push_back(IntPoint(x_start, y_start));
path.push_back(IntPoint(x_start, y_start));
path.push_back(IntPoint(x_start, y_start));
etc..
etc..

CleanPolygon(path, 1.415);
total.push_back(path);
path.clear();

PolyNode* polynode = array.GetFirst();
PolyTree array;
ClipperLib::Clipper c;
c.Clear();
c.AddPaths(total, ptSubject, true);
c.Execute(ctDifference,array);

PolyNode* polynode = array.GetFirst();

while (polynode)
{

    if(int(your_x_pos) == int(polynode->Contour.at(0).X) && int(your_y_pos) == int(polynode->Contour.at(0).Y)){
        //match found, now you know the polygon id..

        if(polynode->IsHole() == 0){
            //do something..
        }
        if(polynode->IsHole() == 1){
            //do something..
        }
    }
    polynode = polynode->GetNext();
}

//clean up memory..
path.clear();
path.shrink_to_fit();
total.clear();
total.shrink_to_fit();

在此处输入图像描述

于 2019-11-20T00:37:16.150 回答