1

C++「クリッパー ライブラリ」( http://www.angusj.com/delphi/clipper.php ) を使用しようとしていますが、関数からクリッパー ライブラリのオブジェクトの 1 つを返そうとすると、 nullになるか、何らかの形で変更されます

ここに私が書いた関数があります。関連する行は最後の 3 行だけです。

ClipperLib::PolyTree MeshHandler::trianglesToPolyTreeUnion(std::vector<Triangle> triangles)
{
    // Make all of the triangles CW
    for (auto& triangle : triangles)
    {
        triangle.makeClockwise();
    }
    // Set up the Clipper
    ClipperLib::Clipper clipper;
    // To take a union, add all the paths as "subject" paths
    for (auto& triangle : triangles)
    {
        ClipperLib::Path triContour(3);
        triContour[0] = convertGLMToClipperPoint(triangle.getVertex(0));
        triContour[1] = convertGLMToClipperPoint(triangle.getVertex(1));
        triContour[2] = convertGLMToClipperPoint(triangle.getVertex(2));
        clipper.AddPath(triContour, ClipperLib::PolyType::ptSubject, true);
    }
    // Now get the PolyTree representing the contours
    ClipperLib::PolyTree tree;
    clipper.Execute(ClipperLib::ClipType::ctUnion, tree);
    return tree;
}

clipper.execute を呼び出すと、ツリー構造に輪郭情報が書き込まれます。それは正しい情報を書いており、私はそれが正しいことをテストしました。しかし、ツリーを返すと、何もコピーしていないようで、この関数の結果の PolyTree は空です。

ライブラリに問題はなく、ここで初心者の C++ の間違いを犯しているだけだと確信しています。うまくいけば、誰かがそれが何であるかについての考えを持っています.

ありがとう!

編集: 参考までに、ポリツリーのドキュメント ページを次に示します ( http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm )

編集: クリッパー ライブラリはオープン ソースではないと思っていましたが、そうです。ここにコードがあります

typedef std::vector< IntPoint > Path;
typedef std::vector< Path > Paths;
class PolyNode;
typedef std::vector< PolyNode* > PolyNodes;

class PolyNode 
{ 
public:
    PolyNode();
    Path Contour;
    PolyNodes Childs;
    PolyNode* Parent;
    PolyNode* GetNext() const;
    bool IsHole() const;
    bool IsOpen() const;
    int ChildCount() const;
private:
    unsigned Index; //node index in Parent.Childs
    bool m_IsOpen;
    JoinType m_jointype;
    EndType m_endtype;
    PolyNode* GetNextSiblingUp() const;
    void AddChild(PolyNode& child);
    friend class Clipper; //to access Index
    friend class ClipperOffset; 
};

class PolyTree: public PolyNode
{ 
public:
    ~PolyTree(){Clear();};
    PolyNode* GetFirst() const;
    void Clear();
    int Total() const;
private:
    PolyNodes AllNodes;
    friend class Clipper; //to access AllNodes
};
4

5 に答える 5

3

何かを行う前に、次のプログラムが正しく動作することを確認してください。

int main()
{
   PolyTree p1;
   // fill PolyTree with some values that make sense (please add code to do this)
   //...
   PolyTree p2 = p1; 
   PolyTree p3;
   p3 = p1;
}

それが基本的に私たちがテストしたいものです。このコードを機能させることができれば (関連するヘッダーと必要な初期化を追加して)、機能に集中することができます。上記のコードが機能しない場合は、答えがあります。

正しいコピー セマンティクスを生成するには、上記のコードを取得する必要があります。さらに重要なのは、main() が終了したときに、p1、p2、および p3 の破棄時にメモリの破損が発生しないことです。

したがって、安全にコピーできるようにクラスを修正するか、それを忘れて、限られた状況で非常に慎重に処理する必要があるクラスと一緒に暮らすことができます (つまり、現在行っているように確実にコピーを返すことはできません)。

于 2014-04-03T15:46:20.917 に答える
0

この問題の解決策は既にありますか? 私は同じ問題に取り組んでいます。まだ運がありません。polytree はメモリ アドレスのみを出力します。

使用する場合: qDebug()<< "child id " << polynode->Childs;

2 つの子がある場合、端末の出力は次のようになります: std::vector(0x55f30d2a91b0, 0x55f30d258480)

誰かがこれを解決する方法を知っていることを願っています..

于 2019-11-20T18:31:52.053 に答える
-1

問題は、trianglesToPolyTreeUnion の下から 3 行目にあります。作成しているツリーはスタック上に作成され、関数内のスコープ内にのみあります。

メモリを動的に割り当ててツリーへのポインターを返すか、ツリー オブジェクトをクラス メンバーにして、関数が戻ってもスコープ内にあるようにする必要があります。

于 2014-04-03T15:40:01.850 に答える