Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
H
hpp-fcl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Guilhem Saurel
hpp-fcl
Commits
dbf93557
Commit
dbf93557
authored
5 years ago
by
Joseph Mirabel
Browse files
Options
Downloads
Patches
Plain Diff
[GJK] Improve GJK::projectTetrahedraOrigin
parent
8b0f94aa
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
doc/gjk.py
+24
-12
24 additions, 12 deletions
doc/gjk.py
src/narrowphase/gjk.cpp
+126
-220
126 additions, 220 deletions
src/narrowphase/gjk.cpp
with
150 additions
and
232 deletions
doc/gjk.py
+
24
−
12
View file @
dbf93557
...
@@ -95,9 +95,14 @@ implications = [
...
@@ -95,9 +95,14 @@ implications = [
[
[
-
8
,
9
,
12
,],
[
-
10
]
],
[
[
-
8
,
9
,
12
,],
[
-
10
]
],
[
[
8
,
-
9
,
-
12
,],
[
10
]
],
[
[
8
,
-
9
,
-
12
,],
[
10
]
],
[
[
-
4
,
9
,
-
10
,],
[
-
11
,
-
12
]
],
[
[
10
,
3
,
9
,
-
12
,
4
,
-
5
],
[
1
]
],
[
[
-
6
,
5
,
-
11
,],
[
-
12
,
-
10
]
],
[
[
10
,
-
3
,
1
,
-
4
],
[
9
]
],
[
[
-
8
,
7
,
-
12
,],
[
-
10
,
-
11
]
],
[
[
10
,
-
3
,
-
1
,
2
,
-
6
,
11
],
[
5
]
],
[
[
-
10
,
11
,
2
,
-
12
,
-
5
,
-
1
],
[
6
]
],
[
[
-
10
,
11
,
-
2
,
1
,
5
],
[
-
6
]
],
[
[
-
10
,
-
11
,
12
,
1
,
-
7
,
-
2
,
4
],[
-
5
]],
[
[
-
10
,
-
11
,
12
,
-
3
,
2
,
7
],[
-
8
]],
[
[
-
10
,
-
11
,
12
,
-
3
,
-
2
],[
-
1
]],
]
]
def
set_test_values
(
current_tests
,
test_values
,
itest
,
value
):
def
set_test_values
(
current_tests
,
test_values
,
itest
,
value
):
...
@@ -128,6 +133,11 @@ def set_test_values (current_tests, test_values, itest, value):
...
@@ -128,6 +133,11 @@ def set_test_values (current_tests, test_values, itest, value):
raise
ValueError
(
"
Absurd case
"
)
raise
ValueError
(
"
Absurd case
"
)
return
remaining_tests
,
next_test_values
return
remaining_tests
,
next_test_values
def
set_tests_values
(
current_tests
,
test_values
,
itests
,
values
):
for
itest
,
value
in
zip
(
itests
,
values
):
current_tests
,
test_values
=
set_test_values
(
current_tests
,
test_values
,
itest
,
value
)
return
current_tests
,
test_values
def
apply_test_values
(
cases
,
test_values
):
def
apply_test_values
(
cases
,
test_values
):
def
canSatisfy
(
values
,
indices
):
def
canSatisfy
(
values
,
indices
):
for
k
in
indices
:
for
k
in
indices
:
...
@@ -229,7 +239,7 @@ def printComments (order, indent, file):
...
@@ -229,7 +239,7 @@ def printComments (order, indent, file):
for
comment
in
order
[
'
comments
'
]:
for
comment
in
order
[
'
comments
'
]:
print
(
indent
+
"
//
"
+
comment
,
file
=
file
)
print
(
indent
+
"
//
"
+
comment
,
file
=
file
)
def
printOrder
(
order
,
indent
=
""
,
start
=
True
,
file
=
sys
.
stdout
):
def
printOrder
(
order
,
indent
=
""
,
start
=
True
,
file
=
sys
.
stdout
,
curTests
=
[]
):
if
start
:
if
start
:
print
(
"
bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
"
,
file
=
file
)
print
(
"
bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
"
,
file
=
file
)
print
(
"
{
"
,
file
=
file
)
print
(
"
{
"
,
file
=
file
)
...
@@ -301,20 +311,22 @@ def printOrder (order, indent = "", start=True,file=sys.stdout):
...
@@ -301,20 +311,22 @@ def printOrder (order, indent = "", start=True,file=sys.stdout):
check
=
checks
[
order
[
'
test
'
]]
check
=
checks
[
order
[
'
test
'
]]
check_hr
=
checks_hr
[
order
[
'
test
'
]]
check_hr
=
checks_hr
[
order
[
'
test
'
]]
printComments
(
order
,
indent
,
file
)
printComments
(
order
,
indent
,
file
)
nextTests_t
=
curTests
+
[
"
a
"
+
str
(
order
[
'
test
'
]
+
1
),]
nextTests_f
=
curTests
+
[
"
!a
"
+
str
(
order
[
'
test
'
]
+
1
),]
if
order
[
'
true
'
]
is
None
:
if
order
[
'
true
'
]
is
None
:
if
order
[
'
false
'
]
is
None
:
if
order
[
'
false
'
]
is
None
:
print
(
indent
+
"""
assert(false &&
"
Case {} should never happen.
"
);
"""
.
format
(
check_hr
))
print
(
indent
+
"""
assert(false &&
"
Case {} should never happen.
"
);
"""
.
format
(
check_hr
))
else
:
else
:
print
(
indent
+
"
assert(!({} <= 0)); // Not {}
"
.
format
(
check
,
check_hr
),
file
=
file
)
print
(
indent
+
"
assert(!({} <= 0)); // Not
{} /
{}
"
.
format
(
check
,
check_hr
,
"
.
"
.
join
(
nextTests_f
)
),
file
=
file
)
printOrder
(
order
[
'
false
'
],
indent
=
indent
,
start
=
False
,
file
=
file
)
printOrder
(
order
[
'
false
'
],
indent
=
indent
,
start
=
False
,
file
=
file
,
curTests
=
nextTests_f
)
elif
order
[
'
false
'
]
is
None
:
elif
order
[
'
false
'
]
is
None
:
print
(
indent
+
"
assert({} <= 0); // {}
"
.
format
(
check
,
check_hr
),
file
=
file
)
print
(
indent
+
"
assert({} <= 0); //
{} /
{}
"
.
format
(
check
,
check_hr
,
"
.
"
.
join
(
nextTests_t
)
),
file
=
file
)
printOrder
(
order
[
'
true
'
],
indent
=
indent
,
start
=
False
,
file
=
file
)
printOrder
(
order
[
'
true
'
],
indent
=
indent
,
start
=
False
,
file
=
file
,
curTests
=
nextTests_t
)
else
:
else
:
print
(
indent
+
"
if ({} <= 0) {{ // if {}
"
.
format
(
check
,
check_hr
),
file
=
file
)
print
(
indent
+
"
if ({} <= 0) {{ // if
{} /
{}
"
.
format
(
check
,
check_hr
,
"
.
"
.
join
(
nextTests_t
)
),
file
=
file
)
printOrder
(
order
[
'
true
'
],
indent
=
indent
+
"
"
,
start
=
False
,
file
=
file
)
printOrder
(
order
[
'
true
'
],
indent
=
indent
+
"
"
,
start
=
False
,
file
=
file
,
curTests
=
nextTests_t
)
print
(
indent
+
"
}} else {{ // not {}
"
.
format
(
check_hr
),
file
=
file
)
print
(
indent
+
"
}} else {{ // not
{} /
{}
"
.
format
(
check_hr
,
"
.
"
.
join
(
nextTests_f
)
),
file
=
file
)
printOrder
(
order
[
'
false
'
],
indent
=
indent
+
"
"
,
start
=
False
,
file
=
file
)
printOrder
(
order
[
'
false
'
],
indent
=
indent
+
"
"
,
start
=
False
,
file
=
file
,
curTests
=
nextTests_f
)
print
(
indent
+
"
}} // end of {}
"
.
format
(
check_hr
),
file
=
file
)
print
(
indent
+
"
}} // end of {}
"
.
format
(
check_hr
),
file
=
file
)
if
start
:
if
start
:
...
...
This diff is collapsed.
Click to expand it.
src/narrowphase/gjk.cpp
+
126
−
220
View file @
dbf93557
...
@@ -746,76 +746,70 @@ bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
...
@@ -746,76 +746,70 @@ bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
next.rank=4; \
next.rank=4; \
return true;
return true;
if
(
ba_aa
<=
0
)
{
// if AB.AO >= 0
if
(
ba_aa
<=
0
)
{
// if AB.AO >= 0
/ a10
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0
/ a10.a3
if
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
)
{
// if (ADB ^ AB).AO >= 0
if
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
)
{
// if (ADB ^ AB).AO >= 0
/ a10.a3.a9
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0
/ a10.a3.a9.a12
assert
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
);
// (ADB ^ AD).AO >= 0
assert
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
);
// (ADB ^ AD).AO >= 0
/ a10.a3.a9.a12.a8
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
/ a10.a3.a9.a12.a8.a4
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not (ABC ^ AB).AO >= 0
}
else
{
// not (ABC ^ AB).AO >= 0
/ a10.a3.a9.a12.a8.!a4
// Region AB
// Region AB
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ABC ^ AB).AO >= 0
}
// end of (ABC ^ AB).AO >= 0
}
else
{
// not AD.AO >= 0
}
else
{
// not AD.AO >= 0
/ a10.a3.a9.!a12
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
/ a10.a3.a9.!a12.a4
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
/ a10.a3.a9.!a12.a4.a5
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ a10.a3.a9.!a12.a4.a5.a6
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
/ a10.a3.a9.!a12.a4.a5.!a6
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0 / a10.a3.a9.!a12.a4.!a5
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not ABC.AO >= 0
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of ABC.AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AB).AO >= 0
}
else
{
// not (ABC ^ AB).AO >= 0
/ a10.a3.a9.!a12.!a4
// Region AB
// Region AB
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ABC ^ AB).AO >= 0
}
// end of (ABC ^ AB).AO >= 0
}
// end of AD.AO >= 0
}
// end of AD.AO >= 0
}
else
{
// not (ADB ^ AB).AO >= 0
}
else
{
// not (ADB ^ AB).AO >= 0
/ a10.a3.!a9
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
/ a10.a3.!a9.a8
// Region ADB
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
}
else
{
// not (ADB ^ AD).AO >= 0
/ a10.a3.!a9.!a8
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ a10.a3.!a9.!a8.a6
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
/ a10.a3.!a9.!a8.a6.a7
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
/ a10.a3.!a9.!a8.a6.!a7
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of (ACD ^ AD).AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
/ a10.a3.!a9.!a8.!a6
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
/ a10.a3.!a9.!a8.!a6.a7
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
/ a10.a3.!a9.!a8.!a6.!a7
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
...
@@ -824,296 +818,208 @@ bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
...
@@ -824,296 +818,208 @@ bool GJK::projectTetrahedraOrigin(const Simplex& current, Simplex& next)
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ADB ^ AD).AO >= 0
}
// end of (ADB ^ AD).AO >= 0
}
// end of (ADB ^ AB).AO >= 0
}
// end of (ADB ^ AB).AO >= 0
}
else
{
// not ADB.AO >= 0
}
else
{
// not ADB.AO >= 0
/ a10.!a3
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
/ a10.!a3.a1
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
/ a10.!a3.a1.a4
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
/ a10.!a3.a1.a4.a5
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ a10.!a3.a1.a4.a5.a6
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
/ a10.!a3.a1.a4.a5.!a6
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
/ a10.!a3.a1.a4.!a5
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AB).AO >= 0
}
else
{
// not (ABC ^ AB).AO >= 0 / a10.!a3.a1.!a4
if
(
ca_aa
<=
0
)
{
// if AC.AO >= 0
// Region AB
assert
(
!
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
));
// Not (ABC ^ AC).AO >= 0
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
if
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
)
{
// if (ADB ^ AB).AO >= 0
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
// Region AB
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not (ADB ^ AB).AO >= 0
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AB).AO >= 0
}
else
{
// not AC.AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
)
{
// if (ADB ^ AB).AO >= 0
// Region AB
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not (ADB ^ AB).AO >= 0
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AB).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
if
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
)
{
// if (ADB ^ AB).AO >= 0
// Region AB
originToSegment
(
current
,
a
,
b
,
A
,
B
,
B
-
A
,
-
ba_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not (ADB ^ AB).AO >= 0
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of (ADB ^ AB).AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
// end of AC.AO >= 0
}
// end of (ABC ^ AB).AO >= 0
}
// end of (ABC ^ AB).AO >= 0
}
else
{
// not ABC.AO >= 0
}
else
{
// not ABC.AO >= 0
/ a10.!a3.!a1
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
/ a10.!a3.!a1.a2
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ a10.!a3.!a1.a2.a6
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
/ a10.!a3.!a1.a2.a6.a7
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
/ a10.!a3.!a1.a2.a6.!a7
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of (ACD ^ AD).AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0 / a10.!a3.!a1.a2.!a6
if
(
ca_aa
<=
0
)
{
// if AC.AO >= 0
if
(
ca_aa
<=
0
)
{
// if AC.AO >= 0 / a10.!a3.!a1.a2.!a6.a11
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not AC.AO >= 0 / a10.!a3.!a1.a2.!a6.!a11
}
else
{
// not (ABC ^ AC).AO >= 0
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ABC ^ AC).AO >= 0
}
else
{
// not AC.AO >= 0
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of AC.AO >= 0
}
// end of AC.AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not ACD.AO >= 0
}
else
{
// not ACD.AO >= 0
/ a10.!a3.!a1.!a2
// Region Inside
// Region Inside
REGION_INSIDE
()
REGION_INSIDE
()
}
// end of ACD.AO >= 0
}
// end of ACD.AO >= 0
}
// end of ABC.AO >= 0
}
// end of ABC.AO >= 0
}
// end of ADB.AO >= 0
}
// end of ADB.AO >= 0
}
else
{
// not AB.AO >= 0
}
else
{
// not AB.AO >= 0
/ !a10
if
(
ca_aa
<=
0
)
{
// if AC.AO >= 0
if
(
ca_aa
<=
0
)
{
// if AC.AO >= 0
/ !a10.a11
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
/ !a10.a11.a2
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0
/ !a10.a11.a2.a12
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ !a10.a11.a2.a12.a6
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
/ !a10.a11.a2.a12.a6.a7
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
/ !a10.a11.a2.a12.a6.a7.a8
// Region ADB
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
}
else
{
// not (ADB ^ AD).AO >= 0
/ !a10.a11.a2.a12.a6.a7.!a8
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AD).AO >= 0
}
// end of (ADB ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
/ !a10.a11.a2.a12.a6.!a7
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of (ACD ^ AD).AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
/ !a10.a11.a2.a12.!a6
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0
/ !a10.a11.a2.a12.!a6.!a7
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
/ !a10.a11.a2.a12.!a6.!a7.a5
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
/ !a10.a11.a2.a12.!a6.!a7.!a5
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not AD.AO >= 0
}
else
{
// not AD.AO >= 0
/ !a10.a11.a2.!a12
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
/ !a10.a11.a2.!a12.a5
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
/ !a10.a11.a2.!a12.a5.a6
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0
/ !a10.a11.a2.!a12.a5.a6.!a7
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not (ACD ^ AC).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
/ !a10.a11.a2.!a12.a5.!a6
// Region AC
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ACD ^ AC).AO >= 0
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
/ !a10.a11.a2.!a12.!a5
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
/ !a10.a11.a2.!a12.!a5.a1
assert
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
);
// (ABC ^ AB).AO >= 0
assert
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
);
// (ABC ^ AB).AO >= 0
/ !a10.a11.a2.!a12.!a5.a1.a4
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
else
{
// not ABC.AO >= 0
}
else
{
// not ABC.AO >= 0 / !a10.a11.a2.!a12.!a5.!a1
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0 / !a10.a11.a2.!a12.!a5.!a1.!a7
assert
(
!
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
));
// Not (ACD ^ AD).AO >= 0
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not (ACD ^ AC).AO >= 0
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ACD ^ AC).AO >= 0
}
// end of ABC.AO >= 0
}
// end of ABC.AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
// end of AD.AO >= 0
}
// end of AD.AO >= 0
}
else
{
// not ACD.AO >= 0
}
else
{
// not ACD.AO >= 0 / !a10.a11.!a2
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0 / !a10.a11.!a2.a1
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0
if
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
)
{
// if (ABC ^ AC).AO >= 0 / !a10.a11.!a2.a1.a5
if
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
)
{
// if (ACD ^ AC).AO >= 0
// Region AC
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
// Region ADB
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ABC ^ AC).AO >= 0 / !a10.a11.!a2.a1.!a5
}
else
{
// not (ADB ^ AD).AO >= 0
assert
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
);
// (ABC ^ AB).AO >= 0 / !a10.a11.!a2.a1.!a5.a4
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AD).AO >= 0
}
else
{
// not (ACD ^ AC).AO >= 0
// Region AC
originToSegment
(
current
,
a
,
c
,
A
,
C
,
C
-
A
,
-
ca_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ACD ^ AC).AO >= 0
}
else
{
// not (ABC ^ AC).AO >= 0
assert
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
);
// (ABC ^ AB).AO >= 0
// Region ABC
// Region ABC
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
b
,
c
,
(
B
-
A
).
cross
(
C
-
A
),
-
C
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
free_v
[
nfree
++
]
=
current
.
vertex
[
d
];
}
// end of (ABC ^ AC).AO >= 0
}
// end of (ABC ^ AC).AO >= 0
}
else
{
// not ABC.AO >= 0
}
else
{
// not ABC.AO >= 0
/ !a10.a11.!a2.!a1
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0
/ !a10.a11.!a2.!a1.a3
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
/ !a10.a11.!a2.!a1.a3.a8
// Region ADB
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
}
else
{
// not (ADB ^ AD).AO >= 0
/ !a10.a11.!a2.!a1.a3.!a8
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AD).AO >= 0
}
// end of (ADB ^ AD).AO >= 0
}
else
{
// not ADB.AO >= 0
}
else
{
// not ADB.AO >= 0
/ !a10.a11.!a2.!a1.!a3
// Region Inside
// Region Inside
REGION_INSIDE
()
REGION_INSIDE
()
}
// end of ADB.AO >= 0
}
// end of ADB.AO >= 0
}
// end of ABC.AO >= 0
}
// end of ABC.AO >= 0
}
// end of ACD.AO >= 0
}
// end of ACD.AO >= 0
}
else
{
// not AC.AO >= 0
}
else
{
// not AC.AO >= 0 / !a10.!a11
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0
if
(
da_aa
<=
0
)
{
// if AD.AO >= 0 / !a10.!a11.a12
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0 / !a10.!a11.a12.a3
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0 / !a10.!a11.a12.a3.a7
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0 / !a10.!a11.a12.a3.a7.a8
assert
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
);
// (ABC ^ AC).AO >= 0
assert
(
!
(
ba
*
da_ba
+
bd
*
ba_aa
-
bb
*
da_aa
<=
0
));
// Not (ADB ^ AB).AO >= 0 / !a10.!a11.a12.a3.a7.a8.!a9
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0 / !a10.!a11.a12.a3.a7.!a8
// Region AD
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ABC ^ AB).AO >= 0
}
// end of (ADB ^ AD).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0 / !a10.!a11.a12.a3.!a7
// Region ADB
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0 / !a10.!a11.a12.a3.!a7.a2
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
assert
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
);
// (ACD ^ AC).AO >= 0 / !a10.!a11.a12.a3.!a7.a2.a6
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AD).AO >= 0
}
// end of (ABC ^ AB).AO >= 0
}
else
{
// not (ACD ^ AD).AO >= 0
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
assert
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
);
// (ACD ^ AC).AO >= 0
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not ACD.AO >= 0
}
else
{
// not ACD.AO >= 0 / !a10.!a11.a12.a3.!a7.!a2
if
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
)
{
// if (ABC ^ AB).AO >= 0
if
(
C
.
dot
(
a_cross_b
)
<=
0
)
{
// if ABC.AO >= 0 / !a10.!a11.a12.a3.!a7.!a2.a1
assert
(
ca
*
ba_ca
+
cb
*
ca_aa
-
cc
*
ba_aa
<=
0
);
// (ABC ^ AC).AO >= 0
assert
(
!
(
ba
*
ba_ca
+
bb
*
ca_aa
-
bc
*
ba_aa
<=
0
));
// Not (ABC ^ AB).AO >= 0 / !a10.!a11.a12.a3.!a7.!a2.a1.!a4
// There are no case corresponding to this set of tests.
// applied [True, False, None, True, True, None, False, None, None, False, False, True]
// to ABC, ADB
assert
(
false
);
}
else
{
// not (ABC ^ AB).AO >= 0
// Region ADB
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ABC ^ AB).AO >= 0
}
else
{
// not ABC.AO >= 0 / !a10.!a11.a12.a3.!a7.!a2.!a1
}
// end of ACD.AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
else
{
// not ABC.AO >= 0
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
// Region ADB
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
}
// end of ABC.AO >= 0
// Region AD
}
// end of ACD.AO >= 0
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
}
// end of (ACD ^ AD).AO >= 0
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
else
{
// not ADB.AO >= 0 / !a10.!a11.a12.!a3
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
if
(
D
.
dot
(
a_cross_c
)
<=
0
)
{
// if ACD.AO >= 0 / !a10.!a11.a12.!a3.a2
}
// end of (ADB ^ AD).AO >= 0
if
(
da
*
ca_da
+
dc
*
da_aa
-
dd
*
ca_aa
<=
0
)
{
// if (ACD ^ AD).AO >= 0 / !a10.!a11.a12.!a3.a2.a7
}
else
{
// not (ACD ^ AD).AO >= 0
// Region AD
assert
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
);
// (ACD ^ AC).AO >= 0
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ACD ^ AD).AO >= 0 / !a10.!a11.a12.!a3.a2.!a7
assert
(
ca
*
ca_da
+
cc
*
da_aa
-
cd
*
ca_aa
<=
0
);
// (ACD ^ AC).AO >= 0 / !a10.!a11.a12.!a3.a2.!a7.a6
// Region ACD
// Region ACD
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
originToTriangle
(
current
,
a
,
c
,
d
,
(
C
-
A
).
cross
(
D
-
A
),
-
D
.
dot
(
a_cross_c
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
}
// end of (ACD ^ AD).AO >= 0
}
// end of (ACD ^ AD).AO >= 0
}
else
{
// not ACD.AO >= 0
}
else
{
// not ACD.AO >= 0 / !a10.!a11.a12.!a3.!a2
if
(
-
D
.
dot
(
a_cross_b
)
<=
0
)
{
// if ADB.AO >= 0
// Region Inside
if
(
da
*
da_ba
+
dd
*
ba_aa
-
db
*
da_aa
<=
0
)
{
// if (ADB ^ AD).AO >= 0
REGION_INSIDE
()
// Region ADB
originToTriangle
(
current
,
a
,
d
,
b
,
(
D
-
A
).
cross
(
B
-
A
),
D
.
dot
(
a_cross_b
),
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
else
{
// not (ADB ^ AD).AO >= 0
// Region AD
originToSegment
(
current
,
a
,
d
,
A
,
D
,
D
-
A
,
-
da_aa
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
c
];
}
// end of (ADB ^ AD).AO >= 0
}
else
{
// not ADB.AO >= 0
// Region Inside
REGION_INSIDE
()
}
// end of ADB.AO >= 0
}
// end of ACD.AO >= 0
}
// end of ACD.AO >= 0
}
// end of AB
C
.AO >= 0
}
// end of A
D
B.AO >= 0
}
else
{
// not AD.AO >= 0
}
else
{
// not AD.AO >= 0
/ !a10.!a11.!a12
// Region A
// Region A
originToPoint
(
current
,
a
,
A
,
next
,
ray
);
originToPoint
(
current
,
a
,
A
,
next
,
ray
);
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
free_v
[
nfree
++
]
=
current
.
vertex
[
b
];
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment