complex.cpp
00001 #include <algorithms/complex.h>
00002
00003 namespace vvcomplex
00004 {
00005 bool FindWallMin(Point3d &v, const Point3d& v1, const Point3d& v2, double mw, double *displacement)
00006 {
00007
00008 if(mw == 0)
00009 {
00010 if(displacement) *displacement = 0;
00011 return true;
00012 }
00013
00014 Point3d v1v2 = v2 - v1;
00015 double v1v2l = norm(v1v2);
00016 v1v2 /= v1v2l;
00017
00018 if(v1v2l < (2+VVE_REL_EPSILON)*mw)
00019 {
00020 v = (v1+v2)/2;
00021 return false;
00022 }
00023
00024 double len = (v - v1) * v1v2;
00025 if(len < mw)
00026 {
00027 v = v1 + v1v2 * mw;
00028 if(displacement) *displacement = mw-len;
00029 }
00030 else if(len > v1v2l - mw)
00031 {
00032 v = v2 - v1v2 * mw;
00033 if(displacement) *displacement = len - v1v2l - mw;
00034 }
00035 else
00036 if(displacement) *displacement = 0;
00037 return true;
00038 }
00039 }