【发布时间】:2014-05-15 12:30:57
【问题描述】:
我正在尝试使用 C++“剪辑器库”(http://www.angusj.com/delphi/clipper.php),但是当我尝试从函数中返回剪辑器库中的一个对象时,它似乎变为空或以某种方式被更改
这是我写的函数。唯一相关的行应该是最后 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++ 错误。希望有人知道它可能是什么。
谢谢!
编辑:作为参考,这里是 polytree (http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm) 的文档页面
edit:我认为 Clipper 库不是开源的,但它是。这是代码
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
};
【问题讨论】:
-
如果没有 ClipperLib::PolyTree 的定义,我们只能猜测。但是请注意,您是按值返回的,因此将涉及一些复制构造函数(隐式或显式)。
-
@jsantander 如果执行了复制省略,则不会,对于此示例而言,这看起来很可能。 RVO 是
c++中的少数例外之一,当程序的可观察行为可以随着优化而改变时。不过可能是这样。我想知道 OP 是否尝试过摆弄优化标志。 -
不相关,但您也应该通过 const 引用传递
triangles:const std::vector<Triangle>& triangles -
@user3281410 - 请发布多树定义。一旦你这样做了,那么你会得到任何关于它的问题的答案。目前,我们不知道如果没有实现用户定义的复制构造函数和赋值运算符,它是否可以安全复制。
-
您可以粘贴未缩进的代码,选择它,然后单击“代码”按钮(看起来像大括号
{ }),它会将整个选择缩进4个空格。注意标签。他们把缩进弄脏了。
标签: c++ clipperlib