Forum: PC-Programmierung CGAL::range_search in Delaunay-Triangulation


von Stefan (Gast)


Lesenswert?

Versteht das hier irgendwer Ansatzweise?

http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Point_set_2_ref/Function_range_search.html#Cross_link_anchor_1686

Ich wollte mein Ruby-Interface zu CGAL::Delaunay-Triangulation, das ich 
vor einigen Momaten gemacht hatte, um einen Range-Search erweitern. Aber 
leider bekomme ich wie befürchtet einen Haufen Fehlermeldungen durch
1
res = CGAL::range_search<CDT, Circle_2, Vertices>(CDT(*t), circ, res);

Na ja, wenn ich mich wirklich mit C++ auskennen würde...

von Stefan (Gast)


Lesenswert?

Ich habe mal alles unnötige rausgestrichen, so dass man es auch ohne 
Ruby kompilieren kann

cgal_create_CMakeLists -s executable
cmake .
make
1
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
2
#include <CGAL/Triangulation_face_base_with_info_2.h>
3
#include <CGAL/Triangulation_vertex_base_with_info_2.h>
4
#include <CGAL/Constrained_Delaunay_triangulation_2.h>
5
#include <CGAL/range_search_delaunay_2.h>
6
#include <vector>
7
8
struct MyInfo
9
{
10
  void *rvertex;
11
  void *parent;
12
  MyInfo():
13
    rvertex(NULL),
14
    parent(NULL)
15
  {}
16
};
17
18
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
19
typedef CGAL::Triangulation_vertex_base_with_info_2<MyInfo, K>   Vb;
20
typedef CGAL::Constrained_triangulation_face_base_2<K>           Fb;
21
typedef CGAL::Triangulation_data_structure_2<Vb, Fb>             TDS;
22
typedef CGAL::Exact_predicates_tag                               Itag;
23
typedef CGAL::Constrained_Delaunay_triangulation_2<K, TDS, Itag> CDT;
24
typedef CDT::Point          Point;
25
26
typedef std::vector<typename CDT::Vertex_handle> Vertices;
27
typedef CGAL::Circle_2<K>          Circle_2;
28
29
extern "C" void cdt_range_search(void)
30
{
31
  CDT *t;
32
  Circle_2 circ(Point(0.0, 0.0), Point(0.0, 0.0), Point(0.0, 0.0));
33
  Vertices res;
34
  res = CGAL::range_search<CDT, Circle_2, Vertices>(CDT(*t), circ, res);
35
}
1
/home/stefan/egaltest/test/rcgal_cdt.cpp: In function ‘void cdt_range_search()’:
2
/home/stefan/egaltest/test/rcgal_cdt.cpp:36:71: error: no matching function for call to ‘range_search(CDT, Circle_2&, Vertices&)’
3
/home/stefan/egaltest/test/rcgal_cdt.cpp:36:71: note: candidates are:
4
In file included from /home/stefan/egaltest/test/rcgal_cdt.cpp:7:0:
5
/usr/include/CGAL/range_search_delaunay_2.h:155:16: note: template<class Dt, class Circle, class OutputIterator> OutputIterator CGAL::range_search(Dt&, const Circle&, OutputIterator)
6
/usr/include/CGAL/range_search_delaunay_2.h:155:16: note:   template argument deduction/substitution failed:
7
/home/stefan/egaltest/test/rcgal_cdt.cpp:36:71: note:   cannot convert

von Salewski (Gast)


Lesenswert?

Hab jetzt eine andere Schreibweise gefunden

http://cgal-discuss.949826.n4.nabble.com/range-search-problem-td953126.html

das frisst er so
1
extern "C" void cdt_range_search(void)
2
{
3
  CDT cdt;
4
  std::list<CDT::Vertex_handle> LV;
5
6
  Circle_2 circ(Point(0.0, 0.0), Point(0.0, 0.0), Point(0.0, 0.0));
7
  Vertices res;
8
  //#Circle circle( Point(mouse_x , mouse_y) , range_square );    
9
  range_search(cdt, circ, std::back_inserter(LV));
10
  //#res = CGAL::range_search<CDT, Circle_2, Vertices>(CDT(*t), circ, res);
11
}
Ich meinte gelesen zu haben, dass man bei einer Funktion mit Template 
das Template vor den Aufruf schreiben soll? Und warum geht nun 
alternativ
1
  CDT *cdt;
2
  range_search(CDT(*cdt), circ, std::back_inserter(LV));

nicht? Da kommen haufenweise Fehlermeldungen. Das Problem ist ja, *cdt 
ist mein Funktiosparameter, den ich so von Ruby bekomme -- und dann 
sollte CDT(*cdt) doch die zugehörige Referenz sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Salewski schrieb:
> Ich meinte gelesen zu haben, dass man bei einer Funktion mit Template
> das Template vor den Aufruf schreiben soll?

Wo und wieso sollte das so sein?

> Das Problem ist ja, *cdt
> ist mein Funktiosparameter, den ich so von Ruby bekomme

Das Template will keinen Pointer sehen, sondern eine Referenz. Die 
bekommst Du, indem Du den Pointer dereferenzierst.

Wenn Du aber CDT(*cdt) schreibst, ist das was anderes; das ist der 
Aufruf eines Copy-Construktors, dem Du ein dereferenziertes Objekt 
übergibst.
Willst Du das?

von Salewski, Stefan (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
>       Salewski schrieb:
>> Ich meinte gelesen zu haben, dass man bei einer Funktion mit Template
>> das Template vor den Aufruf schreiben soll?
>
> Wo und wieso sollte das so sein?
>
Hab mich wohl getäuscht...

>> Das Problem ist ja, *cdt
>> ist mein Funktiosparameter, den ich so von Ruby bekomme
>
> Das Template will keinen Pointer sehen, sondern eine Referenz. Die
> bekommst Du, indem Du den Pointer dereferenzierst.
>
Ah ja, so frisst er es
1
extern "C" void cdt_range_search(void *t)
2
{
3
  std::list<CDT::Vertex_handle> LV;
4
  Circle_2 circ(Point(0.0, 0.0), Point(0.0, 0.0), Point(0.0, 0.0));
5
  Vertices res;
6
  CDT* h;
7
  h = (CDT*) t;
8
  range_search(*h, circ, std::back_inserter(LV));
9
}

> Wenn Du aber CDT(*cdt) schreibst, ist das was anderes; das ist der
> Aufruf eines Copy-Construktors, dem Du ein dereferenziertes Objekt
> übergibst.
> Willst Du das?

Wohl eher nicht.

Na dann bin ich ja schon mal weiter gekommen, als ich noch heute 
Nachmittag gehofft hatte. Morgen werde ich dann mal sehen, ob der Code 
auch das tut, was ich möchte.

Hast Du vileleicht noch eine Idee, wie man den Kreis mit Zentrums-Punkt 
und Radius erzeugen kann, also statt
Circle_2 circ(Point(0.0, 0.0), Point(0.0, 0.0), Point(0.0, 0.0));
etwas wie
Circle_2 circ(Point(0.0, 0.0), 10.0);
Nach obiger Dokumentation sehe ich das noch nicht -- aber sonst mache 
ich mir eben zunächst 3 Punkte.

von Salewski, Stefan (Gast)


Lesenswert?

Salewski, Stefan schrieb:
> Nach obiger Dokumentation sehe ich das noch nicht

Also was ich meinte:

http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Kernel_23_ref/Class_Circle_2.html#Cross_link_anchor_336

>Circle_2<Kernel> c ( Point_2<Kernel> const& center, Kernel::FT const& 
squared_radius,...

Kernel::FT sagt mir nicht viel, aber womöglich ist das einfach 
kompatibel mit float.

von Stefan (Gast)


Lesenswert?

Ja, funktioniert soweit.
Für range_search darf die Delaunay-Triangulation scheinbar keine zuvor 
eingefügten Constraints haben -- na ja, das ist ein Thema für die cgal 
mailing-liste.

Ihr könnt diesen Thread eigentlich auch löschen, meine Fragen waren doch 
recht trivial, eher schon dümmlich. Aufgrund der Fehlermeldungen des 
Compilers hatte ich die Probleme ganz wo anders vermutet, somit hat 
dieser Thread keinen Restwert mehr für wen auch immer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.