28 #pragma warning(disable:4786) // identifier was truncated to '255' 66 int num_iterations = 0;
67 int num_irregularities = 0;
75 for (
int i = 0, bit = 1; i < 4; ++i, bit <<=1)
80 for (
int j = 0, sj = 1; j < 4; ++j, sj <<= 1) {
85 for (
int k = 0, sk = 1; k < j; ++k, sk <<= 1) {
88 det[s3][k] =
det[s2][j] * (dp[j][j] - dp[j][k]) +
93 det[sk|sj][j] * (dp[j][k] - dp[j][
last]);
99 det[15][0] =
det[14][1] * (dp[1][1] - dp[1][0]) +
100 det[14][2] * (dp[2][1] - dp[2][0]) +
101 det[14][3] * (dp[3][1] - dp[3][0]);
102 det[15][1] =
det[13][0] * (dp[0][0] - dp[0][1]) +
103 det[13][2] * (dp[2][0] - dp[2][1]) +
104 det[13][3] * (dp[3][0] - dp[3][1]);
105 det[15][2] =
det[11][0] * (dp[0][0] - dp[0][2]) +
106 det[11][1] * (dp[1][0] - dp[1][2]) +
107 det[11][3] * (dp[3][0] - dp[3][2]);
108 det[15][3] =
det[7][0] * (dp[0][0] - dp[0][3]) +
109 det[7][1] * (dp[1][0] - dp[1][3]) +
110 det[7][2] * (dp[2][0] - dp[2][3]);
115 for (
int i = 0, bit = 1; i < 4; ++i, bit <<= 1) {
117 if (s & bit) {
if (
det[s][i] <= 0)
return false; }
118 else if (
det[s|bit][i] > 0)
return false;
127 for (
int i = 0, bit = 1; i < 4; ++i, bit <<= 1) {
140 for (
int i = 0, bit = 1; i < 4; ++i, bit <<= 1) {
152 #ifdef USE_BACKUP_PROCEDURE 154 inline bool proper(
int s) {
155 for (
int i = 0, bit = 1; i < 4; ++i, bit <<= 1)
156 if ((s & bit) &&
det[s][i] <= 0)
return false;
164 for (
int s =
bits; s; --s) {
165 if ((s &
bits) == s) {
180 #ifdef USE_BACKUP_PROCEDURE 189 if (dist2 < min_dist2) {
207 for (
int i = 0, bit = 1; i < 4; ++i, bit <<= 1)
208 if ((
all_bits & bit) &&
y[i] == w)
return true;
230 if (
dot(v, w) > 0)
return false;
233 ++num_irregularities;
244 ++num_irregularities;
269 if (
dot(v, w) > 0)
return false;
272 ++num_irregularities;
283 ++num_irregularities;
315 if (
dot(v, w) > 0)
return false;
318 ++num_irregularities;
329 ++num_irregularities;
357 if (
dot(v, w) > 0)
return false;
360 ++num_irregularities;
371 ++num_irregularities;
389 static Vector zero(0, 0, 0);
412 if (dist - mu <= dist *
rel_error)
break;
415 ++num_irregularities;
423 if (num_iterations > 1000) catch_me();
427 ++num_irregularities;
void closest_points(const Convex &a, const Convex &b, const Transform &a2w, const Transform &b2w, Point &pa, Point &pb)
Scalar max(Scalar x, Scalar y)
virtual Point support(const Vector &v) const =0
void setValue(const float v[3])
Scalar dot(const Quaternion &q1, const Quaternion &q2)
void compute_vector(int bits, Vector &v)
bool approxZero(const Quaternion &q)
bool degenerate(const Vector &w)
void set_max(Scalar &x, Scalar y)
virtual BBox bbox(const Transform &t) const
Scalar min(Scalar x, Scalar y)
bool common_point(const Convex &a, const Convex &b, const Transform &a2w, const Transform &b2w, Vector &v, Point &pa, Point &pb)
void compute_points(int bits, Point &p1, Point &p2)
bool intersect(const Convex &a, const Convex &b, const Transform &a2w, const Transform &b2w, Vector &v)