#include <zone_edge.h>
Nevrax France
Definition at line 55 of file zone_edge.h.
Public Member Functions | |
bool | build (const std::vector< NLMISC::CVector > &theEdge, const std::vector< uint32 > &theId, uint rotation, sint32 offsetX, sint32 offsetY, const CLigoConfig &config, CLigoError &errors) |
Build a edge zone. | |
void | buildMatrix (NLMISC::CMatrix &mat, const CLigoConfig &config) const |
Return the matrix. | |
uint | getNumVertex () const |
Return the vertex count. | |
sint32 | getOffsetX () const |
sint32 | getOffsetY () const |
uint32 | getRotation () const |
Get values. | |
const NLMISC::CVector & | getVertex (uint id) const |
Return the vertex. | |
void | invert (const CLigoConfig &config) |
Invert the edge. | |
bool | isSymetrical (const CLigoConfig &config, CLigoError &errors) const |
Is symetrical ? | |
bool | isTheSame (const CZoneEdge &other, const CLigoConfig &config, CLigoError &errors) const |
Is the same edge ? | |
void | serial (NLMISC::IStream &s) |
Serial. | |
Private Attributes | |
std::vector< uint32 > | _Id |
Id of the vertices. | |
sint32 | _OffsetX |
X an Y offset of the edge. the position of the i-th vertex is rotate (_Rotation) * (theEdge[i], 0, 0) + (_OffsetX, _OffsetY, 0). | |
sint32 | _OffsetY |
uint32 | _Rotation |
Rotation of the edge. Must be 0, 1, 2, 3. The rotation angle is Pi/2 * (double)_Rotation in CCW. | |
std::vector< NLMISC::CVector > | _TheEdge |
The vector of position for this edge. |
|
Build a edge zone.
Definition at line 41 of file zone_edge.cpp. References _Id, _OffsetX, _OffsetY, _Rotation, _TheEdge, NLLIGO::CLigoConfig::CellSize, NLLIGO::CLigoError::clear(), nlassert, NLLIGO::CLigoError::pushVertexError(), sint32, NLLIGO::CLigoConfig::Snap, uint, x, and y.
00043 { 00044 // Some checks 00045 nlassert (rotation>=0); 00046 nlassert (rotation<=3); 00047 nlassert (theEdge.size() == theId.size()); 00048 00049 // Cancels errors 00050 errors.clear (); 00051 00052 // Errors ? 00053 bool ok = true; 00054 00055 // Check first position 00056 CVector toCheck (theEdge[0].x, theEdge[0].y, 0); 00057 if ((float)fabs (toCheck.norm())>config.Snap) 00058 { 00059 // Vertex error 00060 errors.pushVertexError (CLigoError::UnknownError, 0); 00061 ok = false; 00062 } 00063 00064 // Check last position 00065 uint lastIndex = theEdge.size()-1; 00066 toCheck = CVector (theEdge[lastIndex].x, theEdge[lastIndex].y, 0); 00067 if (((toCheck-CVector (config.CellSize, 0, 0)).norm())>config.Snap) 00068 { 00069 // Vertex error 00070 errors.pushVertexError (CLigoError::UnknownError, 0); 00071 ok = false; 00072 } 00073 00074 // No error ? Build! 00075 if (ok) 00076 { 00077 _TheEdge = theEdge; 00078 _Rotation = rotation; 00079 _OffsetX = offsetX; 00080 _OffsetY = offsetY; 00081 _Id = theId; 00082 } 00083 00084 return ok; 00085 } |
|
Return the matrix.
Definition at line 212 of file zone_edge.cpp. References _OffsetX, _OffsetY, _Rotation, NLLIGO::CLigoConfig::CellSize, NLMISC::CMatrix::identity(), NLMISC::Pi, NLMISC::CMatrix::rotateZ(), and NLMISC::CMatrix::setPos().
|
|
Return the vertex count.
Definition at line 76 of file zone_edge.h. References _TheEdge, and uint.
00076 { return _TheEdge.size(); } |
|
Definition at line 86 of file zone_edge.h. References _OffsetX, and sint32.
00086 { return _OffsetX; } |
|
Definition at line 87 of file zone_edge.h. References _OffsetY, and sint32.
00087 { return _OffsetY; } |
|
Get values.
Definition at line 85 of file zone_edge.h. References _Rotation, and uint32.
00085 { return _Rotation; } |
|
Return the vertex.
Definition at line 79 of file zone_edge.h. References _TheEdge, and uint.
00079 { return _TheEdge[id]; } |
|
Invert the edge.
Definition at line 195 of file zone_edge.cpp. References _TheEdge, NLLIGO::CLigoConfig::CellSize, and uint. Referenced by NLLIGO::CTransition::build(), and NLLIGO::CTransition::check().
00196 { 00197 // Copy the array 00198 const std::vector<NLMISC::CVector> copy = _TheEdge; 00199 00200 // For each internal vertices 00201 uint vert; 00202 for (vert=0; vert<_TheEdge.size(); vert++) 00203 { 00204 // Invert 00205 const CVector &pos = copy[_TheEdge.size()-vert-1]; 00206 _TheEdge[vert] = CVector (config.CellSize - pos.x, pos.y, pos.z); 00207 } 00208 } |
|
Is symetrical ?
Definition at line 89 of file zone_edge.cpp. References _Id, _TheEdge, NLLIGO::CLigoConfig::CellSize, NLLIGO::CLigoError::clear(), NLLIGO::CLigoError::MainError, NLLIGO::CLigoError::pushVertexError(), NLLIGO::CLigoConfig::Snap, and uint.
00090 { 00091 // Cancels errors 00092 errors.clear (); 00093 00094 // Errors ? 00095 bool ok = true; 00096 00097 // For each internal vertices 00098 uint vert; 00099 for (vert=0; vert<_TheEdge.size(); vert++) 00100 { 00101 // Symmetrical value 00102 CVector sym = CVector (config.CellSize-_TheEdge[vert].x, _TheEdge[vert].y, _TheEdge[vert].z); 00103 00104 // Others vertices 00105 uint vert2; 00106 for (vert2=0; vert2<_TheEdge.size(); vert2++) 00107 { 00108 // Not the same ? 00109 if (vert != vert2) 00110 { 00111 // Snapped ? 00112 if ((_TheEdge[vert2]-sym).norm() <= config.Snap) 00113 { 00114 // Good, next one 00115 break; 00116 } 00117 } 00118 } 00119 00120 // Not found ? 00121 if (vert2>=_TheEdge.size()) 00122 { 00123 // Error 00124 ok = false; 00125 00126 // Push error message 00127 errors.pushVertexError (CLigoError::NotSymetrical, _Id[vert]); 00128 errors.MainError = CLigoError::NotSymetrical; 00129 } 00130 } 00131 00132 // Return error code 00133 return ok; 00134 } |
|
Is the same edge ?
Definition at line 138 of file zone_edge.cpp. References _Id, _TheEdge, NLLIGO::CLigoError::MainError, NLLIGO::CLigoError::pushVertexError(), NLLIGO::CLigoConfig::Snap, and uint. Referenced by NLLIGO::CTransition::build(), and NLLIGO::CTransition::check().
00139 { 00140 // Same vertex count ? 00141 if (_TheEdge.size() != other._TheEdge.size()) 00142 { 00143 // Error 00144 errors.MainError = CLigoError::NotSameVerticesNumber; 00145 return false; 00146 } 00147 00148 // Errors ? 00149 bool ok = true; 00150 00151 // For each internal vertices 00152 uint vert; 00153 for (vert=0; vert<_TheEdge.size(); vert++) 00154 { 00155 // The same ? 00156 const CVector &pos0 = _TheEdge[vert]; 00157 const CVector &pos1 = other._TheEdge[vert]; 00158 if ((pos0-pos1).norm() > config.Snap) 00159 { 00160 // Error 00161 ok = false; 00162 00163 // Push error message 00164 errors.pushVertexError (CLigoError::NotSameVertex, other._Id[vert]); 00165 errors.MainError = CLigoError::NotSameVertex; 00166 } 00167 } 00168 00169 // Return error code 00170 return ok; 00171 } |
|
Serial.
Definition at line 175 of file zone_edge.cpp. References _Id, _OffsetX, _OffsetY, _Rotation, _TheEdge, and s.
00176 { 00177 // Serial the version 00178 /*sint ver =*/ s.serialVersion (0); 00179 00180 s.xmlPush ("VERTICES"); 00181 s.serialCont (_TheEdge); 00182 s.xmlPop (); 00183 00184 s.xmlPush ("VERTICES_ID"); 00185 s.serialCont (_Id); 00186 s.xmlPop (); 00187 00188 s.xmlSerial (_Rotation, "ROTATION"); 00189 00190 s.xmlSerial (_OffsetX, _OffsetY, "OFFSET"); 00191 } |
|
Id of the vertices.
Definition at line 95 of file zone_edge.h. Referenced by build(), isSymetrical(), isTheSame(), and serial(). |
|
X an Y offset of the edge. the position of the i-th vertex is rotate (_Rotation) * (theEdge[i], 0, 0) + (_OffsetX, _OffsetY, 0).
Definition at line 101 of file zone_edge.h. Referenced by build(), buildMatrix(), getOffsetX(), and serial(). |
|
Definition at line 102 of file zone_edge.h. Referenced by build(), buildMatrix(), getOffsetY(), and serial(). |
|
Rotation of the edge. Must be 0, 1, 2, 3. The rotation angle is Pi/2 * (double)_Rotation in CCW.
Definition at line 98 of file zone_edge.h. Referenced by build(), buildMatrix(), getRotation(), and serial(). |
|
The vector of position for this edge.
Definition at line 92 of file zone_edge.h. Referenced by build(), getNumVertex(), getVertex(), invert(), isSymetrical(), isTheSame(), and serial(). |