我的环境是Ubuntu 14.04上的CGAL 4.5和QT5。
我正在学习如何使用CGAL的Qt interface渲染几何对象,如点,线,段。似乎没有在网上使用这个框架的例子,所以我现在正在努力。
我似乎无法让我的测试代码工作。它编译但会抛出一个段错误。
以下是我通过QtCreator创建的QTwidgets应用程序中MainWindow.cpp
文件的代码。
#include <iostream>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Qt/PointsGraphicsItem.h>
#include <CGAL/Qt/SegmentsGraphicsItem.h>
#include <vector>
typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Segment_2 Segment_2;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
std::vector<Point_2> pts;
pts.push_back(Point_2(1,1));
pts.push_back(Point_2(10,10));
CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts);
}
最后一行似乎是问题。我的代码不断抛出段错误 在此刻。消息是
The inferior stopped because it received a signal from the operating system.
Signal name : SIGSEGV
Signal meaning : Segmentation fault
我在这个函数调用中做错了什么?我知道我必须将这些点添加到图形场景中,但这一点并不重要。
理想情况下,当代码运行时,它应该显示两个点,一个在(1,1),另一个在(10,10),一旦我将这些点添加到场景中。
Here是Pastebin上完整PointsGraphicsItem.h
文件的链接。
答案 0 :(得分:0)
您应该使用新的点向量创建图形项,然后调用scene.addItem(..)
。使用点填充矢量时,在将其连接到PointsGraphicsItem::modelChanged()
如果我是你,我会采用现有的演示,例如Polygon_2演示 并且一点一点地修改它。
请注意,演示不是我们付出努力的地方,因为CGAL主要是关于几何数据结构和算法。
答案 1 :(得分:0)
好吧,现在我看到你的代码问题出在哪里了。向量pts
的生命周期只是构造函数MainWindow::MainWindow(..)
。
当PointsGraphicsItem
的绘制方法试图绘制这些点时,它们就不再存在了。
答案 2 :(得分:0)
CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts);
在上面一行中,您传递的是局部变量pts
的地址。这是不允许的。另外,不要忘记在.pro
项目文件中设置以下标志。
LIBS += -lCGAL -lgmp
QMAKE_CXXFLAGS += -frounding-math