2016-04-04 5 views
0

Моей средой является CGAL 4.5 и QT5 на Ubuntu 14.04.Как правильно назвать эту функцию интерфейса QT CGAL?

Я изучаю, как использовать CGAL's Qt interface для визуализации геометрических объектов, похожих на точки, линии, сегменты. Там, кажется, нет примеров, использующих эту фреймворк онлайн, поэтому я боюсь в данный момент.

Я не могу заставить свой тестовый код работать. Он компилируется, но генерирует seg-fault.

Вот мой код из моего файла MainWindow.cpp в приложении QTwidgets, созданным через QtCreator.

#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); 

} 

Последняя строка, кажется, проблема. Мой код продолжает бросать segfault в этот момент. Сообщение

The inferior stopped because it received a signal from the operating system. 

Signal name : SIGSEGV 
Signal meaning : Segmentation fault 

Что я делаю неправильно в этом вызове функции? Я знаю, что мне нужно добавить очки в графическую сцену, но в данный момент это не важно.

В идеале, когда код запускается, он должен отображать две точки, одну в точке (1,1), а другую в (10,10), когда я добавляю эти точки в сцену.

Here является ссылкой на файл PointsGraphicsItem.h на Pastebin.

ответ

0

Вы должны создать графический элемент с новым и пустым вектором точек и вызвать scene.addItem(..). При наполнении вектора с точками, излучает сигнал после подключения его к PointsGraphicsItem::modelChanged()

Если бы я был вами, я бы существующим дем, такими как демо Polygon_2 и modifiy его понемногу.

Обратите внимание, что демонстрации не там, где мы прилагаем усилия, поскольку CGAL в основном относится к геометрическим структурам данных и алгоритмам.

0

Ну, теперь я вижу, где проблема вашего кода. Время жизни вектора pts - это только конструктор MainWindow::MainWindow(..). Когда метод рисования PointsGraphicsItem пытается нарисовать эти точки, их больше нет.

0
CGAL::Qt::PointsGraphicsItem< std::vector<Point_2> > graphical_points(&pts); 

В приведенной выше строке вы передаете адрес локальной переменной pts. Это недопустимо. Также не забудьте установить следующие флаги в файле проекта .pro.

LIBS += -lCGAL -lgmp 
QMAKE_CXXFLAGS += -frounding-math 
Смежные вопросы