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 #include "g-map-vertex.hh"
00026 #include "geometry.hh"
00027 using namespace GMap3d;
00028
00029 CDart * CGMapVertex::prolongPolyline(CDart * ADart, const CVertex & AVertex)
00030 {
00031 CDart * dart = CGMapGeneric::prolongPolyline(ADart);
00032 setVertex(dart, AVertex);
00033 return dart;
00034 }
00035
00036 bool CGMapVertex::isPlanarPolyline(CDart * ADart)
00037 {
00038 assert(ADart!=NULL);
00039
00040 CVertex s1, v1, vect;
00041 int treated = getNewMark();
00042 bool ok = true;
00043
00044 CDynamicCoverage01 it(this, ADart);
00045
00046 s1 = *findVertex(ADart);
00047
00048 setMark( *it , treated);
00049 setMark(alpha1(*it), treated);
00050
00051 for (; it.cont() && ok; ++it)
00052 if (!isMarked(*it, treated))
00053 {
00054 if (v1.isNull())
00055 {
00056 v1 = *findVertex(*it) - s1;
00057
00058 if (!v1.isNull())
00059 v1 /= v1.norm();
00060 }
00061 else
00062 if (vect.isNull())
00063 {
00064 CVertex v2 = *findVertex(*it) - s1;
00065
00066 if (!v2.isNull())
00067 v2 /= v2.norm();
00068
00069 vect = CGeometry::getNormalVector(v1,v2);
00070 }
00071 else
00072 {
00073 CVertex v2 = *findVertex(*it) - s1;
00074
00075 if (!v2.isNull())
00076 v2 /= v2.norm();
00077
00078 ok = CGeometry::areColinear(vect,
00079 CGeometry::getNormalVector(v1,v2));
00080 }
00081
00082 setMark( *it , treated);
00083 setMark(alpha1(*it), treated);
00084 }
00085
00086 unmarkOrbit(ADart, ORBIT_01, treated);
00087 freeMark(treated);
00088
00089 return ok;
00090 }
00091
00092 bool CGMapVertex::markNonPlanarPolylines(int AMarkNumber)
00093 {
00094 int treated = getNewMark();
00095 bool found = false;
00096
00097 CDynamicCoverageAll it(this);
00098
00099 for (; it.cont(); ++it)
00100 if (!isMarked(*it, treated))
00101 {
00102 if (!isPlanarPolyline(*it))
00103 {
00104 markOrbit(*it,ORBIT_FACE, AMarkNumber);
00105 found = true;
00106 }
00107
00108 markOrbit(*it,ORBIT_FACE, treated);
00109 }
00110
00111 negateMaskMark(treated);
00112 freeMark(treated);
00113
00114 return found;
00115 }
00116