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 using namespace GMap3d;
00027
00028 void CGMapVertex::computeRegressionLine(int AMarkNumber,
00029 CVertex * ABarycenter,
00030 CVertex * ADirection)
00031 {
00032 assert(ABarycenter != NULL);
00033 assert(ADirection != NULL);
00034
00035 int N = 0;
00036
00037
00038 CVertex b = barycenter(AMarkNumber);
00039
00040
00041 TCoordinate vX = 0;
00042 TCoordinate vXY = 0;
00043 TCoordinate vXZ = 0;
00044
00045 int treated = getNewMark();
00046
00047 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00048 if (!isMarked(*it, treated))
00049 {
00050 if (isMarked(*it, AMarkNumber))
00051 {
00052 markOrbit(*it, ORBIT_VERTEX, treated);
00053 CVertex & v = * findVertex(*it);
00054
00055 ++N;
00056 vX += sqr(v.getX() - b.getX());
00057
00058 vXY += (v.getX() - b.getX()) * (v.getY() - b.getY());
00059 vXZ += (v.getX() - b.getX()) * (v.getZ() - b.getZ());
00060 }
00061 else
00062 setMark(*it, treated);
00063 }
00064
00065 negateMaskMark(treated);
00066 freeMark(treated);
00067
00068 if (N > 0)
00069 {
00070 vX /= N;
00071 vXY /= N;
00072 vXZ /= N;
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082 * ABarycenter = b;
00083 * ADirection = CVertex(vX, vXY, vXZ);
00084 }
00085
00086 void CGMapVertex::computeRegressionPlane(int AMarkNumber,
00087 TCoordinate * AA, TCoordinate * AB,
00088 TCoordinate * AC, TCoordinate * AD)
00089 {
00090 assert(AA != NULL);
00091 assert(AB != NULL);
00092 assert(AC != NULL);
00093 assert(AD != NULL);
00094
00095 int N = 0;
00096
00097
00098 CVertex b = barycenter(AMarkNumber);
00099
00100
00101 TCoordinate vX = 0;
00102 TCoordinate vY = 0;
00103 TCoordinate vXY = 0;
00104 TCoordinate vXZ = 0;
00105 TCoordinate vYZ = 0;
00106
00107 int treated = getNewMark();
00108
00109 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00110 if (!isMarked(*it, treated))
00111 {
00112 if (isMarked(*it, AMarkNumber))
00113 {
00114 markOrbit(*it, ORBIT_VERTEX, treated);
00115 CVertex & v = * findVertex(*it);
00116
00117 ++N;
00118 vX += sqr(v.getX() - b.getX());
00119 vY += sqr(v.getY() - b.getY());
00120
00121 vXY += (v.getX() - b.getX()) * (v.getY() - b.getY());
00122 vXZ += (v.getX() - b.getX()) * (v.getZ() - b.getZ());
00123 vYZ += (v.getY() - b.getY()) * (v.getZ() - b.getZ());
00124 }
00125 else
00126 setMark(*it, treated);
00127 }
00128
00129 negateMaskMark(treated);
00130 freeMark(treated);
00131
00132 if (N > 0)
00133 {
00134 vX /= N;
00135 vY /= N;
00136 vXY /= N;
00137 vXZ /= N;
00138 vYZ /= N;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 for (float i=-1; i<=+1; i += 0.1)
00157 for (float j=-1; j<=+1; j += 0.1)
00158 {
00159 TCoordinate x = b.getX() + i * vX ;
00160 TCoordinate y = b.getY() + j * vXY;
00161 TCoordinate z = b.getZ() + i * vXZ + j * vYZ;
00162
00163 addMapDart(CVertex(x,y,z));
00164 }
00165
00166 * AA = vY*vXZ;
00167 * AB = vX*vYZ;
00168 * AC = - vX*vY;
00169 * AD = - b.getX()* *AA - b.getY()* *AB - b.getZ()* *AC;
00170 }
00171