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::allocCoordToDirectInfo(int AMarkNumber,
00029 int ADirectInfoIndex,
00030 TOrbit AOrbitUsed)
00031 {
00032 if (AOrbitUsed==ORBIT_NONE)
00033 {
00034 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00035 if (isMarked(*it, AMarkNumber))
00036 setDirectInfo(*it, ADirectInfoIndex, new TCoordinate);
00037 }
00038 else
00039 {
00040 assert(isOrbitUsed(AOrbitUsed));
00041 int treated = getNewMark();
00042
00043 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00044 if (!isMarked(*it, treated))
00045 {
00046 if (isMarked(*it, AMarkNumber))
00047 {
00048 CDart * owner = getEmbeddingOwner(*it, AOrbitUsed);
00049 assert(owner!=NULL);
00050
00051 setDirectInfo(owner, ADirectInfoIndex, new TCoordinate);
00052
00053 markOrbit(owner, AOrbitUsed, treated);
00054 }
00055 else
00056 setMark(*it, treated);
00057 }
00058
00059 negateMaskMark(treated);
00060 freeMark(treated);
00061 }
00062 }
00063
00064 void CGMapVertex::allocCoordToDirectInfo(CDart * ADart, TOrbit AOrbit,
00065 int ADirectInfoIndex,
00066 TOrbit AOrbitUsed)
00067 {
00068 assert(ADart!=NULL);
00069
00070 int mark = getNewMark();
00071
00072 markOrbit(ADart, AOrbit, mark);
00073 allocCoordToDirectInfo(mark, ADirectInfoIndex, AOrbitUsed);
00074 unmarkOrbit(ADart, AOrbit, mark);
00075
00076 freeMark(mark);
00077 }
00078
00079 void CGMapVertex::duplicateVertexToDirectInfo(int AMarkNumber,
00080 int ADirectInfoNumber)
00081 {
00082 int treated = getNewMark();
00083
00084 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00085 if (!isMarked(*it, treated))
00086 {
00087 if (isMarked(*it, AMarkNumber))
00088 for (CDynamicCoverageVertex cov(this, *it); cov.cont(); ++cov)
00089 {
00090 setMark(*cov, treated);
00091
00092 if (isOrbitUsed(*cov, ORBIT_VERTEX))
00093 (*cov)->setDirectInfo(ADirectInfoNumber,
00094 new CVertex(* getVertex(*cov)));
00095
00096 else
00097 (*cov)->setDirectInfo(ADirectInfoNumber, NULL);
00098 }
00099 else
00100 {
00101 setMark(*it, treated);
00102 (*it)->setDirectInfo(ADirectInfoNumber, NULL);
00103 }
00104 }
00105
00106 negateMaskMark(treated);
00107 freeMark(treated);
00108 }
00109
00110 void CGMapVertex::deleteDuplicatedVertex(int ADirectInfoNumber)
00111 {
00112 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00113 delete getDirectInfoAsVertex(*it, ADirectInfoNumber);
00114 }
00115
00116 void CGMapVertex::updateDirectInfoWithVertex(int ADirectInfoNumber)
00117 {
00118 CDynamicCoverageAll it(this);
00119
00120 for (; it.cont(); ++it)
00121 if ((*it)->getDirectInfo(ADirectInfoNumber) != NULL)
00122 * getDirectInfoAsVertex(*it, ADirectInfoNumber) = * getVertex(*it);
00123 }
00124
00125 void CGMapVertex::pointDirectInfoToAttributeVertex(int ADirectInfoIndex)
00126 {
00127 int treated= getNewMark();
00128
00129 for (CDynamicCoverageAll it(this); it.cont(); ++it)
00130 if (!isMarked(*it, treated))
00131 {
00132 CAttributeVertex* vertex = getVertex(*it);
00133
00134 if (vertex!=NULL)
00135 for (CDynamicCoverageVertex cov(this, *it); cov.cont(); ++cov)
00136 {
00137 setMark(*cov,treated);
00138 (*cov)->setDirectInfo(ADirectInfoIndex, vertex);
00139 }
00140 }
00141
00142 negateMaskMark(treated);
00143 freeMark(treated);
00144 }
00145
00146 void CGMapVertex::pointDirectInfoToAttributeVertex(int ADirectInfoIndex,
00147 CDart* ADart)
00148 {
00149 assert(ADart!=NULL);
00150
00151 CAttributeVertex* vertex = findVertex(ADart);
00152
00153 assert(vertex!=NULL);
00154
00155 for (CDynamicCoverageVertex cov(this, ADart); cov.cont(); ++cov)
00156 (*cov)->setDirectInfo(ADirectInfoIndex, vertex);
00157 }
00158
00159 void CGMapVertex::pointDirectInfoToAttributeVertex(int ADirectInfoIndex,
00160 CDart* ADart, TOrbit AOrbit)
00161 {
00162 int treated= getNewMark();
00163 TOrbit orbit= AND_ORBIT(AOrbit,ORBIT_VERTEX);
00164
00165 CCoverage* it=getDynamicCoverage(ADart,AOrbit);
00166
00167 for (; it->cont(); ++(*it))
00168 if (!isMarked(**it, treated))
00169 {
00170 CAttributeVertex* vertex = findVertex(**it);
00171
00172 if (vertex!=NULL)
00173 {
00174 CCoverage* it2 = getDynamicCoverage(**it, orbit);
00175 for (; it2->cont(); ++(*it2))
00176 {
00177 setMark(**it2,treated);
00178 (**it2)->setDirectInfo(ADirectInfoIndex, vertex);
00179 }
00180
00181 delete it2;
00182 }
00183 }
00184
00185 delete it;
00186
00187 unmarkOrbit(ADart, AOrbit, treated);
00188 freeMark(treated);
00189 }
00190