2016-04-04 1 views
0

Mon environnement est CGAL 4.5 et QT5 sous Ubuntu 14.04. J'apprenais à utiliser le Qt interface de CGAL pour rendre des objets géométriques comme des points, des lignes, des segments. Il ne semble pas y avoir d'exemples d'utilisation de ce cadre en ligne, donc je me bats pour le moment. Je n'arrive pas à faire fonctionner mon code de test. Il compile mais lance une erreur de segmentation.Comment appeler cette fonction d'interface QT du CGAL correctement?

Voici mon code de mon fichier MainWindow.cpp dans mon application QTwidgets créée via 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); 

} 

La dernière ligne semble être la ligne de problème. Mon code continue de lancer une erreur de segmentation à ce stade. Le message étant

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

Signal name : SIGSEGV 
Signal meaning : Segmentation fault 

Qu'est-ce que je fais de mal dans cet appel de fonction? Je sais que je dois ajouter les points à la scène graphique, mais ce n'est pas important pour le moment.

Idéalement, lorsque le code, s'exécute, il devrait afficher deux points, un à (1,1) et l'autre à (10,10) une fois que j'ajoute ces points à la scène.

Here est le lien vers le fichier complet PointsGraphicsItem.h sur Pastebin.

Répondre

0

Vous devez créer l'élément graphique avec un vecteur de points nouveau et vide, et appeler le scene.addItem(..). Lorsque peuplant le vecteur avec des points, émettre un signal après avoir connecté à PointsGraphicsItem::modelChanged()

Si je vous, je prendrais une démo existante telle que la démo Polygon_2 et modifiy peu à peu.

Notez que les démos ne sont pas là où nous mettons l'effort, car CGAL est principalement sur les structures de données géométriques et les algorithmes.

0

Eh bien, maintenant je vois où est le problème de votre code. La durée de vie du vecteur pts est juste le constructeur MainWindow::MainWindow(..). Lorsque la méthode de peinture du PointsGraphicsItem essaie de dessiner ces points, ils ne sont plus là.

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

Dans la ligne ci-dessus, vous transmettez l'adresse de la variable locale pts. Ce qui n'est pas autorisé. N'oubliez pas non plus de définir les indicateurs suivants dans votre fichier de projet .pro.

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