【问题标题】:How to call this CGAL's QT interface function correctly?如何正确调用这个CGAL的QT接口函数?
【发布时间】:2016-04-04 19:36:57
【问题描述】:

我的环境是 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 文件的链接。

【问题讨论】:

    标签: c++ qt cgal


    【解决方案1】:

    您应该使用新的空点向量创建图形项,并调用scene.addItem(..)。当用点填充向量时,在连接到PointsGraphicsItem::modelChanged()后发出一个信号

    如果我是你,我会使用现有的演示,例如 Polygon_2 演示 一点一点的修改。

    请注意,演示并不是我们努力的地方,因为 CGAL 主要是关于几何数据结构和算法。

    【讨论】:

      【解决方案2】:

      好吧,现在我知道您的代码问题出在哪里了。向量pts 的生命周期只是构造函数MainWindow::MainWindow(..)。 当PointsGraphicsItem 的paint 方法尝试绘制这些点时,它们不再存在。

      【讨论】:

        【解决方案3】:
        CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts);
        

        在上面的行中,您传递了局部变量pts 的地址。这是不允许的。另外不要忘记在您的 .pro 项目文件中设置以下标志。

        LIBS += -lCGAL -lgmp
        QMAKE_CXXFLAGS += -frounding-math
        

        【讨论】:

          猜你喜欢
          • 2013-06-28
          • 2022-07-21
          • 1970-01-01
          • 2019-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-27
          • 2021-07-14
          相关资源
          最近更新 更多