Skip to content
Snippets Groups Projects
Commit dbf93557 authored by Joseph Mirabel's avatar Joseph Mirabel
Browse files

[GJK] Improve GJK::projectTetrahedraOrigin

parent 8b0f94aa
No related branches found
No related tags found
No related merge requests found
...@@ -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:
......
...@@ -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 ABC.AO >= 0 } // end of ADB.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];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment