2016-04-04 10 views
0

私の環境は、Ubuntu 14.04のCGAL 4.5とQT5です。このCGALのQTインタフェース関数を正しく呼び出す方法は?

私はCGALのQt interfaceを使用して幾何学的なオブジェクトの点、線、セグメントをレンダリングする方法を学習しています。このフレームワークをオンラインで使っている例はありませんので、現時点では苦労しています。

テストコードが機能しないようです。それはコンパイルされますが、seg-faultがスローされます。

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 

この関数呼び出しではどうしたのですか?グラフィックス・シーンにポイントを追加する必要があることは分かっていますが、現時点では重要ではありません。

理想的には、コードを実行すると、シーンにこれらのポイントを追加すると、2つのポイントが表示されます(1つは1,1、もう1つは10,10)。

Hereは、ペーストビンのフルPointsGraphicsItem.hファイルへのリンクです。

答えて

0

新しいアイテムと空のポイントベクトルを使用してグラフィックアイテムを作成し、scene.addItem(..)を呼び出す必要があります。ベクトルをポイントでポピュレートすると、それを接続した後に信号を送信しますPointsGraphicsItem::modelChanged()

私があなただったら、Polygon_2デモ のような既存のデモを少しずつ修正します。

デモは、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 
関連する問題