Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.07.2014, 18:15

boost::geometry::intersects Problem

Guten Abend,
ich habe ein Problem mit boost::geometry::intersects.
Ich nutze diese Funktion in 2 Varianten, einmal um den Schnittpunkt zwischen 2 Geraden und um zwischen Rechteck und Gerade zu bestimmen.

Ich nutze eine eigene Point Klasse, die ich über folgendes Makro registriere.

C-/C++-Quelltext

1
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(Point<double>, double, cs::cartesian, x, y, setX, setY);

Wie ich templates nutzbar mache, weiß ich leider noch nicht, vll hat da ja auch jemand eine Idee, ist aber nicht das eigentliche Problem.

Hier mal die Funktion für 2 Geraden, welche sich auch compilieren lässt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
template <class T>
    static bool intersects(const Line<T>& first, const Line<T>& other)
    {
        typedef boost::geometry::model::segment<Point<double>> Segment;
        Segment l1(point_cast<double>(first.getStartPoint()), point_cast<double>(first.getEndPoint()));
        Segment l2(point_cast<double>(other.getStartPoint()), point_cast<double>(other.getEndPoint()));

        return boost::geometry::intersection(l1, l2, result);
    }


Daraufhin habe ich mir die Funktion für Rect/Line geschrieben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
template <class T>
    static bool intersects(const Rect<T>& rect, const Line<T>& line, std::vector<DoublePoint>& result)
    {
        typedef boost::geometry::model::segment<DoublePoint> Segment;
        typedef boost::geometry::model::box<DoublePoint> Box;
        Box box(point_cast<double>(rect.getTopLeft()), point_cast<double>(rect.getBottomRight()));
        Segment segment(point_cast<double>(line.getStartPoint()), point_cast<double>(line.getEndPoint()));
        return boost::geometry::intersects(rect, segment);
    }


Jetzt kommen wir zum Problem. Ich bekomme nun eine große Zahl an compile errors, bei denen ich nicht mehr weiter weiß, wie ich das nun lösen soll. Ich hatte auch schon versucht, mein Rect zu nutzen (mit einem ähnlichen boost Makro), hat aber auch einige Fehler verursacht.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
1>c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_type.hpp(46): error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : Konvertierung von Argument 1 von 'boost::mpl::failed ************(__thiscall boost::geometry::traits::coordinate_type<int,void>::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::* ***********)(boost::mpl::assert_::types<Point,boost::mpl::na,boost::mpl::na,boost::mpl::na>)' in 'boost::mpl::assert<false>::type' nicht möglich
1>          with
1>          [
1>              Point=int
1>          ]
1>          Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_type.hpp(70): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::traits::coordinate_type<int,void>".
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_type.hpp(61): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::core_dispatch::coordinate_type<boost::geometry::point_tag,int>".
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_type.hpp(92): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::core_dispatch::coordinate_type<boost::geometry::box_tag,Rect<int32>>".
1>          c:\sdks\boost_1_55_0\boost\geometry\geometries\concepts\box_concept.hpp(98): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::coordinate_type<Geometry>".
1>          with
1>          [
1>              Geometry=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\concept\detail\has_constraints.hpp(42): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::concept::ConstBox<Geometry>".
1>          with
1>          [
1>              Geometry=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\concept\detail\msvc.hpp(53): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::concepts::not_satisfied<Model>".
1>          with
1>          [
1>              Model=boost::geometry::concept::ConstBox<const Rect<int32>>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\geometries\concepts\check.hpp(48): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::concepts::require<Concept>".
1>          with
1>          [
1>              Concept=boost::geometry::concept::ConstBox<const Rect<int32>>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\geometries\concepts\check.hpp(120): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::detail::concept_check::check<boost::geometry::concept::ConstBox<Geometry>>".
1>          with
1>          [
1>              Geometry=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\geometries\concepts\check.hpp(158): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::dispatch::check<Geometry,boost::geometry::box_tag,true>".
1>          with
1>          [
1>              Geometry=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\geometries\concepts\check.hpp(180): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::concept::detail::checker<Geometry>".
1>          with
1>          [
1>              Geometry=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\algorithms\intersects.hpp(96): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void boost::geometry::concept::check<const Geometry1>(void)".
1>          with
1>          [
1>              Geometry1=Rect<int32>
1>          ]
1>          c:\users\anti-freak\documents\visual studio 2013\projects\simplelib\include\geometry\algorithm.h(116): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool boost::geometry::intersects<Rect<int32>,Segment>(const Geometry1 &,const Geometry2 &)".
1>          with
1>          [
1>              Geometry1=Rect<int32>
1>  ,            Geometry2=Segment
1>          ]
1>          c:\users\anti-freak\documents\visual studio 2013\projects\simplelib-test\simplelib-test\simplelib-test.cpp(15): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool GEOMETRY::intersects<int32>(const Rect<int32> &,const Line<int32> &,std::vector<DoublePoint,std::allocator<_Ty>> &)".
1>          with
1>          [
1>              _Ty=DoublePoint
1>          ]
1>c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_type.hpp(70): error C2039: 'type': Ist kein Element von 'boost::geometry::traits::coordinate_type<int,void>'
1>c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_dimension.hpp(47): error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : Konvertierung von Argument 1 von 'boost::mpl::failed ************(__thiscall boost::geometry::traits::dimension<int,void>::NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE::* ***********)(boost::mpl::assert_::types<Point,boost::mpl::na,boost::mpl::na,boost::mpl::na>)' in 'boost::mpl::assert<false>::type' nicht möglich
1>          with
1>          [
1>              Point=int
1>          ]
1>          Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_dimension.hpp(61): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::traits::dimension<int,void>".
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_dimension.hpp(58): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::core_dispatch::dimension<boost::geometry::point_tag,int>".
1>          c:\sdks\boost_1_55_0\boost\geometry\core\coordinate_dimension.hpp(80): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::core_dispatch::dimension<boost::geometry::box_tag,Rect<int32>>".
1>          c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(234): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "boost::geometry::dimension<Geometry1>".
1>          with
1>          [
1>              Geometry1=Rect<int32>
1>          ]
1>          c:\sdks\boost_1_55_0\boost\geometry\algorithms\intersects.hpp(99): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "bool boost::geometry::disjoint<Geometry1,Geometry2>(const Geometry1 &,const Geometry2 &)".
1>          with
1>          [
1>              Geometry1=Rect<int32>
1>  ,            Geometry2=Segment
1>          ]
1>c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(234): error C3083: "type": Das Symbol links neben "::" muss ein Typ sein.
1>c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(344): error C2039: 'value': Ist kein Element von 'boost::geometry::dimension<Geometry1>'
1>          with
1>          [
1>              Geometry1=Rect<int32>
1>          ]
1>c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(344): error C2065: 'value': nichtdeklarierter Bezeichner
1>c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(344): error C2975: "DimensionCount": Ungültiges Vorlagenargument für "boost::geometry::dispatch::disjoint", konstanter Kompilierzeitausdruck erwartet.
1>          c:\sdks\boost_1_55_0\boost\geometry\algorithms\disjoint.hpp(234): Siehe Deklaration von 'DimensionCount'


Hat hier jemand damit Erfahrungen? Am liebsten wäre es mir, wenn ich mein Rect und den Point registrieren könnte und diese auch als Template nutzen könnte.

mfg