geom_utils.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "geom_utils.h"
00031 #include "arr.h"
00032
00033 using namespace std;
00034
00035 namespace {
00036
00037 void get_circle (const arr<vec3> &point, tsize q1, tsize q2, vec3 ¢er,
00038 double &cosrad)
00039 {
00040 center = (point[q1]+point[q2]).Norm();
00041 cosrad = dotprod(point[q1],center);
00042 for (tsize i=0; i<q1; ++i)
00043 if (dotprod(point[i],center)<cosrad)
00044 {
00045 center=crossprod(point[q1]-point[i],point[q2]-point[i]).Norm();
00046 cosrad=dotprod(point[i],center);
00047 if (cosrad<0)
00048 { center.Flip(); cosrad=-cosrad; }
00049 }
00050 }
00051 void get_circle (const arr<vec3> &point, tsize q, vec3 ¢er,
00052 double &cosrad)
00053 {
00054 center = (point[0]+point[q]).Norm();
00055 cosrad = dotprod(point[0],center);
00056 for (tsize i=1; i<q; ++i)
00057 if (dotprod(point[i],center)<cosrad)
00058 get_circle(point,i,q,center,cosrad);
00059 }
00060
00061 }
00062
00063 void find_enclosing_circle (const arr<vec3> &point, vec3 ¢er,
00064 double &cosrad)
00065 {
00066 tsize np=point.size();
00067 planck_assert(np>=2,"too few points");
00068 center = (point[0]+point[1]).Norm();
00069 cosrad = dotprod(point[0],center);
00070 for (tsize i=2; i<np; ++i)
00071 if (dotprod(point[i],center)<cosrad)
00072 get_circle(point,i,center,cosrad);
00073 }