Skip to content

Commit 0cd89c4

Browse files
authored
Merge pull request #2571 from efifogel/MS_2-reduced_conv_collision_detection-efif
Minkovski_sum_2: reduced conv collision detection
2 parents b655d0c + eedebc5 commit 0cd89c4

File tree

16 files changed

+3616
-4
lines changed

16 files changed

+3616
-4
lines changed

Minkowski_sum_2/include/CGAL/Minkowski_sum_2/AABB_collision_detector_2.h

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,18 +79,44 @@ class AABB_collision_detector_2
7979

8080
// If t_q is inside of P, or t_p is inside of Q, one polygon is completely
8181
// inside of the other.
82-
Point_2 t_q = *m_q.outer_boundary().vertices_begin() + Vector_2(ORIGIN, t);
83-
Point_2 t_p = *m_p.outer_boundary().vertices_begin() - Vector_2(ORIGIN, t);
82+
Point_2 t_q = *m_q.outer_boundary().vertices_begin() - Vector_2(ORIGIN, t);
83+
Point_2 t_p = *m_p.outer_boundary().vertices_begin() + Vector_2(ORIGIN, t);
8484

8585
// Use bounded_side_2() instead of on_bounded_side() because the latter
8686
// checks vor simplicity every time.
87-
return
87+
bool in_mp =
8888
bounded_side_2(m_p.outer_boundary().vertices_begin(),
8989
m_p.outer_boundary().vertices_end(), t_q,
90-
m_p.outer_boundary().traits_member()) == ON_BOUNDED_SIDE ||
90+
m_p.outer_boundary().traits_member()) == ON_BOUNDED_SIDE;
91+
if (m_p.number_of_holes() == 0) {
92+
if (in_mp) return true;
93+
}
94+
bool in_mq =
9195
bounded_side_2(m_q.outer_boundary().vertices_begin(),
9296
m_q.outer_boundary().vertices_end(), t_p,
9397
m_q.outer_boundary().traits_member()) == ON_BOUNDED_SIDE;
98+
if (m_q.number_of_holes() == 0) {
99+
if (in_mq) return true;
100+
}
101+
if (!in_mq && !in_mp) return false;
102+
if (in_mp) {
103+
for (typename Polygon_with_holes_2::Hole_const_iterator it =
104+
m_p.holes_begin(); it != m_p.holes_end(); ++it)
105+
{
106+
if (bounded_side_2(it->vertices_begin(), it->vertices_end(), t_q,
107+
it->traits_member()) == ON_BOUNDED_SIDE)
108+
return false;
109+
}
110+
return true;
111+
}
112+
for (typename Polygon_with_holes_2::Hole_const_iterator it =
113+
m_q.holes_begin(); it != m_q.holes_end(); ++it)
114+
{
115+
if (bounded_side_2(it->vertices_begin(), it->vertices_end(), t_p,
116+
it->traits_member()) == ON_BOUNDED_SIDE)
117+
return false;
118+
}
119+
return true;
94120
}
95121

96122
private:
Lines changed: 296 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,296 @@
1+
<?xml version="1.0"?>
2+
<!DOCTYPE ipe SYSTEM "ipe.dtd">
3+
<ipe version="70206" creator="Ipe 7.2.7">
4+
<info created="D:20171101122951" modified="D:20171101122951"/>
5+
<ipestyle name="basic">
6+
<symbol name="arrow/arc(spx)">
7+
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
8+
0 0 m
9+
-1 0.333 l
10+
-1 -0.333 l
11+
h
12+
</path>
13+
</symbol>
14+
<symbol name="arrow/farc(spx)">
15+
<path stroke="sym-stroke" fill="white" pen="sym-pen">
16+
0 0 m
17+
-1 0.333 l
18+
-1 -0.333 l
19+
h
20+
</path>
21+
</symbol>
22+
<symbol name="arrow/ptarc(spx)">
23+
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
24+
0 0 m
25+
-1 0.333 l
26+
-0.8 0 l
27+
-1 -0.333 l
28+
h
29+
</path>
30+
</symbol>
31+
<symbol name="arrow/fptarc(spx)">
32+
<path stroke="sym-stroke" fill="white" pen="sym-pen">
33+
0 0 m
34+
-1 0.333 l
35+
-0.8 0 l
36+
-1 -0.333 l
37+
h
38+
</path>
39+
</symbol>
40+
<symbol name="mark/circle(sx)" transformations="translations">
41+
<path fill="sym-stroke">
42+
0.6 0 0 0.6 0 0 e
43+
0.4 0 0 0.4 0 0 e
44+
</path>
45+
</symbol>
46+
<symbol name="mark/disk(sx)" transformations="translations">
47+
<path fill="sym-stroke">
48+
0.6 0 0 0.6 0 0 e
49+
</path>
50+
</symbol>
51+
<symbol name="mark/fdisk(sfx)" transformations="translations">
52+
<group>
53+
<path fill="sym-fill">
54+
0.5 0 0 0.5 0 0 e
55+
</path>
56+
<path fill="sym-stroke" fillrule="eofill">
57+
0.6 0 0 0.6 0 0 e
58+
0.4 0 0 0.4 0 0 e
59+
</path>
60+
</group>
61+
</symbol>
62+
<symbol name="mark/box(sx)" transformations="translations">
63+
<path fill="sym-stroke" fillrule="eofill">
64+
-0.6 -0.6 m
65+
0.6 -0.6 l
66+
0.6 0.6 l
67+
-0.6 0.6 l
68+
h
69+
-0.4 -0.4 m
70+
0.4 -0.4 l
71+
0.4 0.4 l
72+
-0.4 0.4 l
73+
h
74+
</path>
75+
</symbol>
76+
<symbol name="mark/square(sx)" transformations="translations">
77+
<path fill="sym-stroke">
78+
-0.6 -0.6 m
79+
0.6 -0.6 l
80+
0.6 0.6 l
81+
-0.6 0.6 l
82+
h
83+
</path>
84+
</symbol>
85+
<symbol name="mark/fsquare(sfx)" transformations="translations">
86+
<group>
87+
<path fill="sym-fill">
88+
-0.5 -0.5 m
89+
0.5 -0.5 l
90+
0.5 0.5 l
91+
-0.5 0.5 l
92+
h
93+
</path>
94+
<path fill="sym-stroke" fillrule="eofill">
95+
-0.6 -0.6 m
96+
0.6 -0.6 l
97+
0.6 0.6 l
98+
-0.6 0.6 l
99+
h
100+
-0.4 -0.4 m
101+
0.4 -0.4 l
102+
0.4 0.4 l
103+
-0.4 0.4 l
104+
h
105+
</path>
106+
</group>
107+
</symbol>
108+
<symbol name="mark/cross(sx)" transformations="translations">
109+
<group>
110+
<path fill="sym-stroke">
111+
-0.43 -0.57 m
112+
0.57 0.43 l
113+
0.43 0.57 l
114+
-0.57 -0.43 l
115+
h
116+
</path>
117+
<path fill="sym-stroke">
118+
-0.43 0.57 m
119+
0.57 -0.43 l
120+
0.43 -0.57 l
121+
-0.57 0.43 l
122+
h
123+
</path>
124+
</group>
125+
</symbol>
126+
<symbol name="arrow/fnormal(spx)">
127+
<path stroke="sym-stroke" fill="white" pen="sym-pen">
128+
0 0 m
129+
-1 0.333 l
130+
-1 -0.333 l
131+
h
132+
</path>
133+
</symbol>
134+
<symbol name="arrow/pointed(spx)">
135+
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
136+
0 0 m
137+
-1 0.333 l
138+
-0.8 0 l
139+
-1 -0.333 l
140+
h
141+
</path>
142+
</symbol>
143+
<symbol name="arrow/fpointed(spx)">
144+
<path stroke="sym-stroke" fill="white" pen="sym-pen">
145+
0 0 m
146+
-1 0.333 l
147+
-0.8 0 l
148+
-1 -0.333 l
149+
h
150+
</path>
151+
</symbol>
152+
<symbol name="arrow/linear(spx)">
153+
<path stroke="sym-stroke" pen="sym-pen">
154+
-1 0.333 m
155+
0 0 l
156+
-1 -0.333 l
157+
</path>
158+
</symbol>
159+
<symbol name="arrow/fdouble(spx)">
160+
<path stroke="sym-stroke" fill="white" pen="sym-pen">
161+
0 0 m
162+
-1 0.333 l
163+
-1 -0.333 l
164+
h
165+
-1 0 m
166+
-2 0.333 l
167+
-2 -0.333 l
168+
h
169+
</path>
170+
</symbol>
171+
<symbol name="arrow/double(spx)">
172+
<path stroke="sym-stroke" fill="sym-stroke" pen="sym-pen">
173+
0 0 m
174+
-1 0.333 l
175+
-1 -0.333 l
176+
h
177+
-1 0 m
178+
-2 0.333 l
179+
-2 -0.333 l
180+
h
181+
</path>
182+
</symbol>
183+
<pen name="heavier" value="0.8"/>
184+
<pen name="fat" value="1.2"/>
185+
<pen name="ultrafat" value="2"/>
186+
<symbolsize name="large" value="5"/>
187+
<symbolsize name="small" value="2"/>
188+
<symbolsize name="tiny" value="1.1"/>
189+
<arrowsize name="large" value="10"/>
190+
<arrowsize name="small" value="5"/>
191+
<arrowsize name="tiny" value="3"/>
192+
<color name="red" value="1 0 0"/>
193+
<color name="green" value="0 1 0"/>
194+
<color name="blue" value="0 0 1"/>
195+
<color name="yellow" value="1 1 0"/>
196+
<color name="orange" value="1 0.647 0"/>
197+
<color name="gold" value="1 0.843 0"/>
198+
<color name="purple" value="0.627 0.125 0.941"/>
199+
<color name="gray" value="0.745"/>
200+
<color name="brown" value="0.647 0.165 0.165"/>
201+
<color name="navy" value="0 0 0.502"/>
202+
<color name="pink" value="1 0.753 0.796"/>
203+
<color name="seagreen" value="0.18 0.545 0.341"/>
204+
<color name="turquoise" value="0.251 0.878 0.816"/>
205+
<color name="violet" value="0.933 0.51 0.933"/>
206+
<color name="darkblue" value="0 0 0.545"/>
207+
<color name="darkcyan" value="0 0.545 0.545"/>
208+
<color name="darkgray" value="0.663"/>
209+
<color name="darkgreen" value="0 0.392 0"/>
210+
<color name="darkmagenta" value="0.545 0 0.545"/>
211+
<color name="darkorange" value="1 0.549 0"/>
212+
<color name="darkred" value="0.545 0 0"/>
213+
<color name="lightblue" value="0.678 0.847 0.902"/>
214+
<color name="lightcyan" value="0.878 1 1"/>
215+
<color name="lightgray" value="0.827"/>
216+
<color name="lightgreen" value="0.565 0.933 0.565"/>
217+
<color name="lightyellow" value="1 1 0.878"/>
218+
<dashstyle name="dashed" value="[4] 0"/>
219+
<dashstyle name="dotted" value="[1 3] 0"/>
220+
<dashstyle name="dash dotted" value="[4 2 1 2] 0"/>
221+
<dashstyle name="dash dot dotted" value="[4 2 1 2 1 2] 0"/>
222+
<textsize name="large" value="\large"/>
223+
<textsize name="Large" value="\Large"/>
224+
<textsize name="LARGE" value="\LARGE"/>
225+
<textsize name="huge" value="\huge"/>
226+
<textsize name="Huge" value="\Huge"/>
227+
<textsize name="small" value="\small"/>
228+
<textsize name="footnote" value="\footnotesize"/>
229+
<textsize name="tiny" value="\tiny"/>
230+
<textstyle name="center" begin="\begin{center}" end="\end{center}"/>
231+
<textstyle name="itemize" begin="\begin{itemize}" end="\end{itemize}"/>
232+
<textstyle name="item" begin="\begin{itemize}\item{}" end="\end{itemize}"/>
233+
<gridsize name="4 pts" value="4"/>
234+
<gridsize name="8 pts (~3 mm)" value="8"/>
235+
<gridsize name="16 pts (~6 mm)" value="16"/>
236+
<gridsize name="32 pts (~12 mm)" value="32"/>
237+
<gridsize name="10 pts (~3.5 mm)" value="10"/>
238+
<gridsize name="20 pts (~7 mm)" value="20"/>
239+
<gridsize name="14 pts (~5 mm)" value="14"/>
240+
<gridsize name="28 pts (~10 mm)" value="28"/>
241+
<gridsize name="56 pts (~20 mm)" value="56"/>
242+
<anglesize name="90 deg" value="90"/>
243+
<anglesize name="60 deg" value="60"/>
244+
<anglesize name="45 deg" value="45"/>
245+
<anglesize name="30 deg" value="30"/>
246+
<anglesize name="22.5 deg" value="22.5"/>
247+
<opacity name="10%" value="0.1"/>
248+
<opacity name="30%" value="0.3"/>
249+
<opacity name="50%" value="0.5"/>
250+
<opacity name="75%" value="0.75"/>
251+
<tiling name="falling" angle="-60" step="4" width="1"/>
252+
<tiling name="rising" angle="30" step="4" width="1"/>
253+
</ipestyle>
254+
<page>
255+
<layer name="alpha"/>
256+
<view layers="alpha" active="alpha"/>
257+
<path layer="alpha" stroke="red" pen="fat">
258+
0 0 m
259+
300 0 l
260+
300 300 l
261+
0 300 l
262+
h
263+
</path>
264+
<path stroke="black">
265+
0 0 m
266+
0 0 l
267+
0 0 l
268+
h
269+
</path>
270+
<path stroke="black">
271+
0 0 m
272+
0 0 l
273+
0 0 l
274+
h
275+
</path>
276+
<path stroke="red" pen="fat">
277+
100 100 m
278+
100 200 l
279+
200 200 l
280+
200 100 l
281+
h
282+
</path>
283+
<text matrix="1 0 0 1 -12.675 -27.4625" transformations="translations" pos="16.8062 36.7" stroke="red" type="label" width="51.164" height="18.564" depth="6.18" valign="baseline" size="Huge" style="math">(0,0)</text>
284+
<text matrix="1 0 0 1 229.206 240.825" transformations="translations" pos="16.8062 36.7" stroke="red" type="label" width="51.164" height="18.564" depth="6.18" valign="baseline" size="Huge" style="math">(3,3)</text>
285+
<text matrix="1 0 0 1 30.6313 41.1938" transformations="translations" pos="16.8062 36.7" stroke="red" type="label" width="51.164" height="18.564" depth="6.18" valign="baseline" size="Huge" style="math">(1,1)</text>
286+
<text matrix="1 0 0 1 184.844 167.944" transformations="translations" pos="16.8062 36.7" stroke="red" type="label" width="51.164" height="18.564" depth="6.18" valign="baseline" size="Huge" style="math">(2,2)</text>
287+
<use name="mark/disk(sx)" pos="200 200" size="large" stroke="blue"/>
288+
<use name="mark/disk(sx)" pos="100 100" size="large" stroke="blue"/>
289+
<use name="mark/disk(sx)" pos="100 200" size="large" stroke="blue"/>
290+
<use name="mark/disk(sx)" pos="200 100" size="large" stroke="blue"/>
291+
<use name="mark/disk(sx)" size="large" stroke="blue"/>
292+
<use name="mark/disk(sx)" pos="0 300" size="large" stroke="blue"/>
293+
<use name="mark/disk(sx)" pos="300 0" size="large" stroke="blue"/>
294+
<use name="mark/disk(sx)" pos="300 300" size="large" stroke="blue"/>
295+
</page>
296+
</ipe>

0 commit comments

Comments
 (0)