7 v3d::v3d(
const double& x ,
const double& y ,
const double& z ) : x(x), y(y), z(z)
11 v3d::v3d(
const v3d& P ) : x(P.x), y(P.y), z(P.z)
15 v3d::v3d(
const v3d& A ,
const v3d& B ,
const asVector& v) : v3d(B.x-A.x, B.y-A.y, B.z-A.z)
20 v3d::v3d(
const v3d& A,
const v3d& B,
const asMiddle& v) : v3d((B.x + A.x)*0.5, (B.y + A.y)*0.5, (B.z + A.z)*0.5)
27 void v3d::Set(
const double& fValue )
31 void v3d::Set(
const double& x ,
const double& y ,
const double& z )
38 void v3d::Set(
const v3d& P )
45 void v3d::Set(
const v3d& A,
const v3d& B)
54 v3d& v3d::operator =(
const v3d& V )
64 v3d& v3d::operator =(
const double& V )
81 v3d operator + (
const v3d& U ,
const v3d& V )
83 return v3d(U.x + V.x, U.y + V.y, U.z + V.z);
87 v3d operator - (
const v3d& U ,
const v3d& V )
89 return v3d(U.x - V.x, U.y - V.y, U.z - V.z);
93 v3d& v3d::operator += (
const v3d& V )
101 v3d& v3d::operator -= (
const v3d& V )
111 v3d operator - (
const v3d& V )
113 return v3d(-V.x, -V.y, -V.z);
122 v3d operator * (
const double& fValue ,
const v3d& V )
124 return v3d(fValue * V.x, fValue * V.y, fValue * V.z);
127 v3d operator * (
const v3d& V ,
const double& fValue )
129 return v3d(V.x * fValue, V.y * fValue, V.z * fValue);
132 v3d operator * ( v3d V ,
const v3d& W )
138 v3d operator / (
const double& fValue ,
const v3d& V )
140 return v3d(fValue / V.x, fValue / V.y, fValue / V.z);
143 v3d operator / (
const v3d& V ,
const double& fValue )
145 return v3d(V.x / fValue, V.y / fValue, V.z / fValue);
148 v3d operator / ( v3d V ,
const v3d& W )
156 v3d& v3d::operator *= (
const double& fValue )
165 v3d& v3d::operator /= (
const double& fValue )
167 const double invfValue = 1.0 / fValue;
176 v3d& v3d::operator *= (
const v3d& p )
184 v3d& v3d::operator /= (
const v3d& p )
193 v3d Hadamard(v3d a,
const v3d& b)
205 double Norm(
const v3d& P )
207 return sqrt( sqr(P.x) + sqr(P.y) + sqr(P.z) );
210 double NormSquare(
const v3d& P )
212 return sqr(P.x) + sqr(P.y) + sqr(P.z);
215 double Dist(
const v3d& P1,
const v3d& P2 )
217 const double dx = P2.x - P1.x;
218 const double dy = P2.y - P1.y;
219 const double dz = P2.z - P1.z;
220 return sqrt(sqr(dx) + sqr(dy) + sqr(dz));
223 double DistSquare(
const v3d& P1,
const v3d& P2 )
225 const double dx = P2.x - P1.x;
226 const double dy = P2.y - P1.y;
227 const double dz = P2.z - P1.z;
228 return sqr(dx) + sqr(dy) + sqr(dz);
231 #define SMALL_NUM 0.001
233 double SegmentDist(
const v3d& Pt1,
const v3d& Pt2,
const v3d& Pt3,
const v3d& Pt4)
243 double D = a*c - b*b;
244 double sc, sN, sD = D;
245 double tc, tN, tD = D;
248 if (D < (SMALL_NUM)) {
284 if ((-d + b) < (0.0))
286 else if ((-d + b) > a)
294 sc = (std::abs(sN) < SMALL_NUM ? 0.0 : sN / sD);
295 tc = (std::abs(tN) < SMALL_NUM ? 0.0 : tN / tD);
298 v3d dP = w + (sc * u) - (tc * v);
304 double PointToSegmentDist(
const v3d& Pt,
const v3d& Pt1,
const v3d& Pt2,v3d& nearest,
bool& insideSegment)
309 double c1 = Dot(w,v);
314 return Dist(Pt, Pt1);
317 double c2 = Dot(v,v);
321 return Dist(Pt, Pt2);
326 v3d Pb = Pt1 + (v3d)((
double)b * v);
336 v3d Mid(
const v3d& P ,
const v3d& Q )
338 return v3d( (P.x + Q.x) * (0.5),
340 (P.z + Q.z) * (0.5) );
343 v3d Bary(
const double& a ,
const v3d& P ,
const double& b ,
const v3d& Q )
345 return v3d( ((a * P.x) + (b * Q.x)) ,
346 ((a * P.y) + (b * Q.y)) ,
347 ((a * P.z) + (b * Q.z)) );
355 void v3d::Normalize(
void )
357 double tmp = Norm( *
this );
367 inline v3d v3d::Normalized(
void )
const
376 inline v3d Lerp(
const v3d& P ,
const v3d& Q,
const double& t )
378 double s = (1.0) - t;
379 return v3d( (s * P.x) + (t * Q.x),
380 (s * P.y) + (t * Q.y),
381 (s * P.z) + (t * Q.z) );
385 inline v3d ProjectOnPlane(v3d q, v3d o, v3d n)
387 return q - (v3d)(Dot(q-o, n)*n);
393 bool operator<(
const v3d& U ,
const v3d& V )
395 return (U.x < V.x && U.y < V.y && U.z < V.z);
398 bool operator<=(
const v3d& U ,
const v3d& V )
400 return (U.x <= V.x && U.y <= V.y && U.z <= V.z);
403 bool operator>(
const v3d& U ,
const v3d& V )
405 return (U.x > V.x && U.y > V.y && U.z > V.z);
408 bool operator>=(
const v3d& U ,
const v3d& V )
410 return (U.x >= V.x && U.y >= V.y && U.z >= V.z);
413 bool operator==(
const v3d& U ,
const v3d& V )
415 return (U.x == V.x && U.y == V.y && U.z == V.z);
418 bool operator!=(
const v3d& U ,
const v3d& V )
420 return (U.x != V.x || U.y != V.y || U.z != V.z);
430 const double& v3d::operator[](Int i)
const
436 double& v3d::operator[](Int i)
443 void v3d::ClampMax(
const double v)
453 void v3d::ClampMin(
const double v)
471 v3d operator ^ (
const v3d& U ,
const v3d& V )
473 return v3d((U.y * V.z) - (U.z * V.y),
474 (U.z * V.x) - (U.x * V.z),
475 (U.x * V.y) - (U.y * V.x));
479 const v3d& v3d::operator ^= (
const v3d& V )
481 double _x = x, _y = y;
482 x = (_y * V.z) - (z * V.y);
483 y = (z * V.x) - (_x * V.z);
484 z = (_x * V.y) - (_y * V.x);
489 void v3d::CrossProduct(
const v3d& V,
const v3d& W )
491 x = (V.y * W.z) - (V.z * W.y);
492 y = (V.z * W.x) - (V.x * W.z);
493 z = (V.x * W.y) - (V.y * W.x);
500 double Dot(
const v3d& U ,
const v3d& V )
502 return ((U.x * V.x) + (U.y * V.y) + (U.z * V.z));