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 "controler-gmap-types.hh"
00026 #include "precompile-sew.hh"
00027 #include "parameter-gmap-vertex.hh"
00028 #include "parameter-sew.hh"
00029 #include <cassert>
00030 using namespace GMap3d;
00031
00032 CPrecompileSew::CPrecompileSew(CParameterGMapVertex * AParameterGMapV,
00033 CParameterSew * AParameterSew) :
00034 FParameterGMapV (AParameterGMapV),
00035 FParameterSew (AParameterSew)
00036 {
00037 assert(FParameterGMapV!=NULL && FParameterSew!=NULL);
00038
00039 FParameterGMapV->addPrecompileToUpdate(this);
00040 FParameterSew->addPrecompileToUpdate(this);
00041 }
00042
00043 CPrecompileSew::CPrecompileSew(const CPrecompileSew & APrecompile) :
00044 CPrecompile (APrecompile),
00045 FParameterGMapV (APrecompile.FParameterGMapV),
00046 FParameterSew (static_cast<CParameterSew*>
00047 (APrecompile.FParameterSew->copy()))
00048 {
00049 assert(FParameterGMapV!=NULL && FParameterSew!=NULL);
00050
00051 FParameterGMapV->addPrecompileToUpdate(this);
00052 FParameterSew->addPrecompileToUpdate(this);
00053 }
00054
00055 CPrecompileSew::~CPrecompileSew()
00056 {
00057 FParameterGMapV->removePrecompileToUpdate(this);
00058 FParameterSew->removePrecompileToUpdate(this);
00059 }
00060
00061 CPrecompile * CPrecompileSew::copy() const
00062 { return new CPrecompileSew(*this); }
00063
00064 void CPrecompileSew::setParameter(CParameter * AParameter)
00065 {
00066 switch (AParameter->getType())
00067 {
00068 case PARAMETER_GMAP_VERTEX:
00069 setGMapVertex(static_cast<CParameterGMapVertex *>(AParameter));
00070 break;
00071 case PARAMETER_SEW: setSew(static_cast<CParameterSew *>(AParameter));
00072 break;
00073 }
00074 }
00075
00076 CParameter* CPrecompileSew::getParameter() const
00077 { return FParameterSew; }
00078
00079 void CPrecompileSew::setGMapVertex(CParameterGMapVertex* AParameterGMapV)
00080 {
00081 assert(AParameterGMapV != NULL);
00082 AParameterGMapV->addPrecompileToUpdate(this);
00083 FParameterGMapV->removePrecompileToUpdate(this);
00084 FParameterGMapV = AParameterGMapV;
00085 setToUpdate();
00086 }
00087
00088 void CPrecompileSew::setSew(CParameterSew* ASew)
00089 {
00090 assert(ASew != NULL);
00091 ASew->addPrecompileToUpdate(this);
00092 FParameterSew->removePrecompileToUpdate(this);
00093 FParameterSew = ASew;
00094 setToUpdate();
00095 }
00096
00097 TPrecompile CPrecompileSew::getType() const
00098 { return PRECOMPILE_SEW; }
00099
00100 #define WEIGHTING(k, v1,v2) ( (1-(k)) * (v1) + (k) * (v2) )
00101
00102 void CPrecompileSew::drawSewsI(int AIndice, int AMark)
00103 {
00104 assert(0<=AIndice && AIndice<=3);
00105
00106 CDynamicCoverageAll it(FParameterGMapV->getMap());
00107 CDart *dart, *darti;
00108 CVertex e,m;
00109
00110 float kw; kw= FParameterSew->getSewPosCoef(AIndice);
00111
00112 for (; it.cont(); ++it)
00113 {
00114 dart= *it;
00115 if (!FParameterGMapV->getMap()->isMarked(dart,AMark))
00116 {
00117 FParameterGMapV->getMap()->setMark(dart , AMark);
00118
00119 if (!FParameterGMapV->getMap()->isFree(dart,AIndice))
00120 {
00121 darti= FParameterGMapV->getMap()->alpha(dart,AIndice);
00122 FParameterGMapV->getMap()->setMark(darti, AMark);
00123 if (AIndice==0)
00124 {
00125 m= (FParameterGMapV->getMap()->getBurstVertex(dart) +
00126 FParameterGMapV->getMap()->getBurstVertex(darti))/2;
00127
00128 e= WEIGHTING(kw, m, FParameterGMapV->getMap()->
00129 computeBurstExtremity(dart ));
00130 PLOT(&e);
00131 e= WEIGHTING(kw, m, FParameterGMapV->getMap()->
00132 computeBurstExtremity(darti));
00133 PLOT(&e);
00134 }
00135 else
00136 {
00137 e= WEIGHTING(kw,
00138 FParameterGMapV->getMap()->getBurstVertex(dart ),
00139 FParameterGMapV->getMap()->
00140 computeBurstExtremity(dart ));
00141 PLOT(&e);
00142 e= WEIGHTING(kw,
00143 FParameterGMapV->getMap()->getBurstVertex(darti),
00144 FParameterGMapV->getMap()->
00145 computeBurstExtremity(darti));
00146 PLOT(&e);
00147 }
00148 }
00149 }
00150 }
00151 }
00152
00153 void CPrecompileSew::drawModel()
00154 {
00155 int mark = FParameterGMapV->getMap()->getNewMark();
00156
00157 for (int i=0; i<=3; ++i)
00158 if (FParameterSew->getDisplayAlpha(i))
00159 {
00160 glColor3fv (FParameterSew->getCLSew(i));
00161 glLineWidth(FParameterSew->getLWSew(i));
00162 glBegin(GL_LINES);
00163 drawSewsI(i,mark);
00164 glEnd();
00165 FParameterGMapV->getMap()->negateMaskMark(mark);
00166 }
00167
00168 glEnd();
00169
00170 FParameterGMapV->getMap()->freeMark(mark);
00171 }
00172
00173 #undef WEIGHTING
00174