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
00031
00032
00033 #ifndef _SFCVINTERSECTOR_H
00034 #define _SFCVINTERSECTOR_H
00035
00036
00037 #include "Intersector2Obj.h"
00038
00039
00040 namespace Go {
00043
00044
00045
00048
00049 class SfCvIntersector : public Intersector2Obj {
00050 public:
00051
00068 SfCvIntersector(boost::shared_ptr<ParamGeomInt> obj1,
00069 boost::shared_ptr<ParamGeomInt> obj2,
00070 double epsge,
00071 Intersector* prev = 0,
00072 int eliminated_parameter = -1,
00073 double eliminated_value = 0);
00074
00091 SfCvIntersector(boost::shared_ptr<ParamGeomInt> obj1,
00092 boost::shared_ptr<ParamGeomInt> obj2,
00093 boost::shared_ptr<GeoTol> epsge,
00094 Intersector* prev = 0,
00095 int eliminated_parameter = -1,
00096 double eliminated_value = 0);
00097
00099 virtual ~SfCvIntersector();
00100
00101
00102
00103
00106 virtual int numParams() const
00107 { return 3; }
00108
00109 void postIterateBd();
00110
00111 protected:
00112
00113
00114 virtual boost::shared_ptr<Intersector>
00115 lowerOrderIntersector(boost::shared_ptr<ParamGeomInt> obj1,
00116 boost::shared_ptr<ParamGeomInt> obj2,
00117 Intersector* prev = 0,
00118 int eliminated_parameter = -1,
00119 double eliminated_value = 0);
00120
00121 virtual int performRotatedBoxTest(double eps1, double eps2);
00122
00123 virtual bool foundIntersectionNearBoundary();
00124
00125 virtual int simpleCase();
00126
00127 virtual int simpleCase2(Point& axis1, Point& axis2);
00128
00129 virtual int checkCoincidence();
00130
00131 virtual void microCase();
00132
00133 virtual int updateIntersections();
00134
00135 virtual int repairIntersections()
00136 { return 0; }
00137
00138 virtual int linearCase();
00139
00140 virtual int doSubdivide();
00141
00142 virtual void postIterate(int nmb_orig, int dir=-1, bool keep_endpt=true);
00143
00144 private:
00145
00146 int cv_idx_, sf_idx_;
00147
00148
00149 void doIterate(double par[], double& dist, double *guess=0);
00150
00151 void doIterate2(double par[], double& dist, double guess[]);
00152
00153 double distInCandidatePar(double par, int dir, const double* seed);
00154
00155 int sortParameterDirections(int perm[]);
00156
00157 SubdivisionClassification getSubdivisionParameter(int dir, double& par);
00158
00159 };
00160
00161
00163 }
00164
00165
00166 #endif // _CVCVINTERSECTOR_H
00167