CGAL::range_search in Delaunay-Triangulation

Gast #3154501
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...
Gast #3154544
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
Gast #3154790
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.
Persönliche Seite #3154828
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?
Gast #3154880
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.
Gast #3154889
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.
Gast #3155422
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren