本文整理汇总了C++中CCVector3::normalize方法的典型用法代码示例。如果您正苦于以下问题:C++ CCVector3::normalize方法的具体用法?C++ CCVector3::normalize怎么用?C++ CCVector3::normalize使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CCVector3
的用法示例。
在下文中一共展示了CCVector3::normalize方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetAngle_deg
//return angle between two vectors (in degrees)
//warning: vectors will be normalized by default
double GetAngle_deg(CCVector3& AB, CCVector3& AC)
{
AB.normalize();
AC.normalize();
double dotprod = AB.dot(AC);
if (dotprod<=-1.0)
return 180.0;
else if (dotprod>1.0)
return 0.0;
return 180.0*acos(dotprod)/M_PI;
}
示例2: GetAngle_deg
//return angle between two vectors (in degrees)
//warning: vectors will be normalized by default
static double GetAngle_deg(CCVector3 AB, CCVector3 AC)
{
AB.normalize();
AC.normalize();
double dotprod = AB.dot(AC);
//clamp value (just in case)
if (dotprod <= -1.0)
dotprod = -1.0;
else if (dotprod > 1.0)
dotprod = 1.0;
return acos(dotprod) * CC_RAD_TO_DEG;
}
示例3: ComputeBaseVectors
void CCMiscTools::ComputeBaseVectors(const CCVector3 &N, CCVector3& X, CCVector3& Y)
{
CCVector3 Nunit = N;
Nunit.normalize();
//we create a first vector orthogonal to the input one
X = Nunit.orthogonal(); //X is also normalized
//we deduce the orthogonal vector to the input one and X
Y = N.cross(X);
//Y.normalize(); //should already be normalized!
}
示例4: computePropagationConfidence
float ccFastMarchingForNormsDirection::computePropagationConfidence(DirectionCell* originCell, DirectionCell* destCell) const
{
//1) it depends on the angle between the current cell's orientation
// and its neighbor's orientation (symmetric)
//2) it depends on whether the neighbor's relative position is
// compatible with the current cell orientation (symmetric)
CCVector3 AB = destCell->C - originCell->C;
AB.normalize();
float psOri = fabs(static_cast<float>(AB.dot(originCell->N))); //ideal: 90 degrees
float psDest = fabs(static_cast<float>(AB.dot(destCell->N))); //ideal: 90 degrees
float oriConfidence = (psOri + psDest)/2; //between 0 and 1 (ideal: 0)
return 1.0f - oriConfidence;
}
示例5: computeTCoefApprox
float FastMarchingForFacetExtraction::computeTCoefApprox(CCLib::FastMarching::Cell* originCell, CCLib::FastMarching::Cell* destCell) const
{
PlanarCell* oCell = static_cast<PlanarCell*>(originCell);
PlanarCell* dCell = static_cast<PlanarCell*>(destCell);
//compute the 'confidence' relatively to the neighbor cell
//1) it depends on the angle between the current cell's orientation
// and its neighbor's orientation (symmetric)
//2) it depends on whether the neighbor's relative position is
// compatible with the current cell orientation (symmetric)
float orientationConfidence = 0;
{
CCVector3 AB = dCell->C - oCell->C;
AB.normalize();
float psOri = fabs(static_cast<float>(AB.dot(oCell->N))); //ideal: 90 degrees
float psDest = fabs(static_cast<float>(AB.dot(dCell->N))); //ideal: 90 degrees
orientationConfidence = (psOri + psDest)/2; //between 0 and 1 (ideal: 0)
}
//add reprojection error into balance
if (m_useRetroProjectionError && m_octree && oCell->N.norm2() != 0)
{
PointCoordinateType theLSQPlaneEquation[4];
theLSQPlaneEquation[0] = oCell->N.x;
theLSQPlaneEquation[1] = oCell->N.y;
theLSQPlaneEquation[2] = oCell->N.z;
theLSQPlaneEquation[3] = oCell->C.dot(oCell->N);
CCLib::ReferenceCloud Yk(m_octree->associatedCloud());
if (m_octree->getPointsInCell(oCell->cellCode,m_gridLevel,&Yk,true))
{
ScalarType reprojError = CCLib::DistanceComputationTools::ComputeCloud2PlaneDistance(&Yk,theLSQPlaneEquation,m_errorMeasure);
if (reprojError >= 0)
return (1.0f-orientationConfidence) * static_cast<float>(reprojError);
}
}
return (1.0f-orientationConfidence) /** oCell->planarError*/;
}
示例6:
void cc2DLabel::getLabelInfo3(LabelInfo3& info) const
{
info.cloud1 = info.cloud2 = info.cloud3 = 0;
if (m_points.size() != 3)
return;
//1st point
info.cloud1 = m_points[0].cloud;
info.point1Index = m_points[0].index;
const CCVector3* P1 = info.cloud1->getPointPersistentPtr(info.point1Index);
//2nd point
info.cloud2 = m_points[1].cloud;
info.point2Index = m_points[1].index;
const CCVector3* P2 = info.cloud2->getPointPersistentPtr(info.point2Index);
//3rd point
info.cloud3 = m_points[2].cloud;
info.point3Index = m_points[2].index;
const CCVector3* P3 = info.cloud3->getPointPersistentPtr(info.point3Index);
//area
CCVector3 P1P2 = *P2-*P1;
CCVector3 P1P3 = *P3-*P1;
CCVector3 P2P3 = *P3-*P2;
CCVector3 N = P1P2.cross(P1P3); //N = ABxAC
info.area = N.norm()/2;
//normal
N.normalize();
info.normal = N;
//edges length
info.edges.u[0] = P1P2.norm2d(); //edge 1-2
info.edges.u[1] = P2P3.norm2d(); //edge 2-3
info.edges.u[2] = P1P3.norm2d(); //edge 3-1
//angle
info.angles.u[0] = GetAngle_deg(P1P2,P1P3); //angleAtP1
info.angles.u[1] = GetAngle_deg(P2P3,-P1P2); //angleAtP2
info.angles.u[2] = GetAngle_deg(-P1P3,-P2P3); //angleAtP3 (should be equal to 180-a1-a2!)
}
示例7: getParameters
void ccGLMatrix::getParameters(float& alpha, CCVector3& axis3D, CCVector3& t3D) const
{
float trace = R11 + R22 + R33;
trace = 0.5f*(trace-1.0f);
if (fabs(trace)<1.0)
{
alpha = acos(trace);
if (alpha > (float)M_PI_2)
alpha -= (float)M_PI;
}
else
alpha = 0.0;
axis3D.x = (float)(R32-R23);
axis3D.y = (float)(R13-R31);
axis3D.z = (float)(R21-R12);
axis3D.normalize();
t3D.x = R14;
t3D.y = R24;
t3D.z = R34;
}
示例8: drawMeOnly
void ccPolyline::drawMeOnly(CC_DRAW_CONTEXT& context)
{
//no picking enabled on polylines
if (MACRO_DrawPointNames(context))
return;
unsigned vertCount = size();
if (vertCount < 2)
return;
bool draw = false;
if (MACRO_Draw3D(context))
{
draw = !m_mode2D;
}
else if (m_mode2D)
{
bool drawFG = MACRO_Foreground(context);
draw = ((drawFG && m_foreground) || (!drawFG && !m_foreground));
}
if (draw)
{
//standard case: list names pushing
bool pushName = MACRO_DrawEntityNames(context);
if (pushName)
glPushName(getUniqueIDForDisplay());
if (colorsShown())
ccGL::Color3v(m_rgbColor.rgb);
//display polyline
if (vertCount > 1)
{
if (m_width != 0)
{
glPushAttrib(GL_LINE_BIT);
glLineWidth(static_cast<GLfloat>(m_width));
}
//DGM: we do the 'GL_LINE_LOOP' manually as I have a strange bug
//on one on my graphic card with this mode!
//glBegin(m_isClosed ? GL_LINE_LOOP : GL_LINE_STRIP);
glBegin(GL_LINE_STRIP);
for (unsigned i=0; i<vertCount; ++i)
{
ccGL::Vertex3v(getPoint(i)->u);
}
if (m_isClosed)
{
ccGL::Vertex3v(getPoint(0)->u);
}
glEnd();
//display arrow
if (m_showArrow && m_arrowIndex < vertCount && (m_arrowIndex > 0 || m_isClosed))
{
const CCVector3* P0 = getPoint(m_arrowIndex == 0 ? vertCount-1 : m_arrowIndex-1);
const CCVector3* P1 = getPoint(m_arrowIndex);
//direction of the last polyline chunk
CCVector3 u = *P1 - *P0;
u.normalize();
if (m_mode2D)
{
u *= -m_arrowLength;
static const PointCoordinateType s_defaultArrowAngle = static_cast<PointCoordinateType>(15.0 * CC_DEG_TO_RAD);
static const PointCoordinateType cost = cos(s_defaultArrowAngle);
static const PointCoordinateType sint = sin(s_defaultArrowAngle);
CCVector3 A(cost * u.x - sint * u.y, sint * u.x + cost * u.y, 0);
CCVector3 B(cost * u.x + sint * u.y, -sint * u.x + cost * u.y, 0);
glBegin(GL_POLYGON);
ccGL::Vertex3v((A+*P1).u);
ccGL::Vertex3v((B+*P1).u);
ccGL::Vertex3v(( *P1).u);
glEnd();
}
else
{
if (!c_unitArrow)
{
c_unitArrow = QSharedPointer<ccCone>(new ccCone(0.5,0.0,1.0));
c_unitArrow->showColors(true);
c_unitArrow->showNormals(false);
c_unitArrow->setVisible(true);
c_unitArrow->setEnabled(true);
}
if (colorsShown())
c_unitArrow->setTempColor(m_rgbColor);
else
c_unitArrow->setTempColor(context.pointsDefaultCol);
//build-up unit arrow own 'context'
CC_DRAW_CONTEXT markerContext = context;
markerContext.flags &= (~CC_DRAW_ENTITY_NAMES); //we must remove the 'push name flag' so that the sphere doesn't push its own!
markerContext._win = 0;
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
ccGL::Translate(P1->x,P1->y,P1->z);
//.........这里部分代码省略.........
示例9: doAction
//.........这里部分代码省略.........
s_primEnabled[1] = rsdDlg.sphereCheckBox->isChecked();
s_primEnabled[2] = rsdDlg.cylinderCheckBox->isChecked();
s_primEnabled[3] = rsdDlg.coneCheckBox->isChecked();
s_primEnabled[4] = rsdDlg.torusCheckBox->isChecked();
}
//import parameters from dialog
RansacShapeDetector::Options ransacOptions;
{
ransacOptions.m_epsilon = rsdDlg.epsilonDoubleSpinBox->value();
ransacOptions.m_bitmapEpsilon = rsdDlg.bitmapEpsilonDoubleSpinBox->value();
ransacOptions.m_normalThresh = rsdDlg.normThreshDoubleSpinBox->value();
ransacOptions.m_minSupport = rsdDlg.supportPointsSpinBox->value();
ransacOptions.m_probability = rsdDlg.probaDoubleSpinBox->value();
}
//progress dialog
ccProgressDialog progressCb(false,m_app->getMainWindow());
progressCb.setRange(0,0);
if (!hasNorms)
{
progressCb.setInfo("Computing normals (please wait)");
progressCb.start();
QApplication::processEvents();
cloud.calcNormals(.01f * scale);
if (pc->reserveTheNormsTable())
{
for (size_t i=0; i<count; ++i)
{
CCVector3 N(cloud[i].normal);
N.normalize();
pc->addNorm(N.u);
}
pc->showNormals(true);
//currently selected entities appearance may have changed!
pc->prepareDisplayForRefresh_recursive();
}
else
{
m_app->dispToConsole("Not enough memory to compute normals!",ccMainAppInterface::ERR_CONSOLE_MESSAGE);
return;
}
}
// set which primitives are to be detected by adding the respective constructors
RansacShapeDetector detector(ransacOptions); // the detector object
if (rsdDlg.planeCheckBox->isChecked())
detector.Add(new PlanePrimitiveShapeConstructor());
if (rsdDlg.sphereCheckBox->isChecked())
detector.Add(new SpherePrimitiveShapeConstructor());
if (rsdDlg.cylinderCheckBox->isChecked())
detector.Add(new CylinderPrimitiveShapeConstructor());
if (rsdDlg.coneCheckBox->isChecked())
detector.Add(new ConePrimitiveShapeConstructor());
if (rsdDlg.torusCheckBox->isChecked())
detector.Add(new TorusPrimitiveShapeConstructor());
size_t remaining = count;
typedef std::pair< MiscLib::RefCountPtr< PrimitiveShape >, size_t > DetectedShape;
MiscLib::Vector< DetectedShape > shapes; // stores the detected shapes
示例10: QString
QStringList cc2DLabel::getLabelContent(int precision)
{
QStringList body;
switch(m_points.size())
{
case 1: //point
{
//init title
/*title = m_title;
//automatically elide the title
title = titleFontMetrics.elidedText(title,Qt::ElideRight,dx);
//*/
//coordinates
ccGenericPointCloud* cloud = m_points[0].cloud;
const unsigned& pointIndex = m_points[0].index;
const CCVector3* P = cloud->getPointPersistentPtr(pointIndex);
QString coordStr = QString("P#%0: (%1;%2;%3)").arg(pointIndex).arg(P->x,0,'f',precision).arg(P->y,0,'f',precision).arg(P->z,0,'f',precision);
body << coordStr;
//normal
if (cloud->hasNormals())
{
const PointCoordinateType* N = cloud->getPointNormal(pointIndex);
assert(N);
QString normStr = QString("Normal: (%1;%2;%3)").arg(N[0],0,'f',precision).arg(N[1],0,'f',precision).arg(N[2],0,'f',precision);
body << normStr;
}
//color
if (cloud->hasColors())
{
const colorType* C = cloud->getPointColor(pointIndex);
assert(C);
QString colorStr = QString("Color: (%1;%2;%3)").arg(C[0]).arg(C[1]).arg(C[2]);
body << colorStr;
}
//scalar field
if (cloud->hasDisplayedScalarField())
{
ScalarType D = cloud->getPointScalarValue(pointIndex);
QString sfStr = QString("Scalar: %1").arg(D,0,'f',precision);
body << sfStr;
}
}
break;
case 2: //vector
{
//1st point
ccGenericPointCloud* cloud1 = m_points[0].cloud;
const unsigned& pointIndex1 = m_points[0].index;
const CCVector3* P1 = cloud1->getPointPersistentPtr(pointIndex1);
//2nd point
ccGenericPointCloud* cloud2 = m_points[1].cloud;
const unsigned& pointIndex2 = m_points[1].index;
const CCVector3* P2 = cloud2->getPointPersistentPtr(pointIndex2);
PointCoordinateType d = (*P1-*P2).norm();
QString distStr = QString("Distance = %1").arg(d,0,'f',precision);
body << distStr;
QString coordStr1 = QString("P#%0: (%1;%2;%3)").arg(pointIndex1).arg(P1->x,0,'f',precision).arg(P1->y,0,'f',precision).arg(P1->z,0,'f',precision);
body << coordStr1;
QString coordStr2 = QString("P#%0: (%1;%2;%3)").arg(pointIndex2).arg(P2->x,0,'f',precision).arg(P2->y,0,'f',precision).arg(P2->z,0,'f',precision);
body << coordStr2;
}
break;
case 3: //triangle/plane
{
//1st point
ccGenericPointCloud* cloud1 = m_points[0].cloud;
const unsigned& pointIndex1 = m_points[0].index;
const CCVector3* P1 = cloud1->getPointPersistentPtr(pointIndex1);
//2nd point
ccGenericPointCloud* cloud2 = m_points[1].cloud;
const unsigned& pointIndex2 = m_points[1].index;
const CCVector3* P2 = cloud2->getPointPersistentPtr(pointIndex2);
//3rd point
ccGenericPointCloud* cloud3 = m_points[2].cloud;
const unsigned& pointIndex3 = m_points[2].index;
const CCVector3* P3 = cloud3->getPointPersistentPtr(pointIndex3);
//area
CCVector3 P1P2 = *P2-*P1;
CCVector3 P1P3 = *P3-*P1;
CCVector3 N = P1P2.cross(P1P3); //N=ABxAC
PointCoordinateType area = N.norm()*(PointCoordinateType)0.5;
QString areaStr = QString("Area = %1").arg(area,0,'f',precision);
body << areaStr;
//coordinates
QString coordStr1 = QString("A#%0: (%1;%2;%3)").arg(pointIndex1).arg(P1->x,0,'f',precision).arg(P1->y,0,'f',precision).arg(P1->z,0,'f',precision);
body << coordStr1;
QString coordStr2 = QString("B#%0: (%1;%2;%3)").arg(pointIndex2).arg(P2->x,0,'f',precision).arg(P2->y,0,'f',precision).arg(P2->z,0,'f',precision);
body << coordStr2;
QString coordStr3 = QString("C#%0: (%1;%2;%3)").arg(pointIndex3).arg(P3->x,0,'f',precision).arg(P3->y,0,'f',precision).arg(P3->z,0,'f',precision);
body << coordStr3;
//normal
N.normalize();
//.........这里部分代码省略.........
示例11: buildUp
bool ccCone::buildUp()
{
if (m_drawPrecision < MIN_DRAWING_PRECISION)
return false;
//invalid dimensions?
if (m_height < ZERO_TOLERANCE || m_bottomRadius + m_topRadius < ZERO_TOLERANCE)
return false;
//topology
bool singlePointBottom = (m_bottomRadius < ZERO_TOLERANCE);
bool singlePointTop = (m_topRadius < ZERO_TOLERANCE);
assert(!singlePointBottom || !singlePointTop);
unsigned steps = m_drawPrecision;
//vertices
unsigned vertCount = 2;
if (!singlePointBottom)
vertCount += steps;
if (!singlePointTop)
vertCount += steps;
//normals
unsigned faceNormCounts = steps+2;
//vertices
unsigned facesCount = steps;
if (!singlePointBottom)
facesCount += steps;
if (!singlePointTop)
facesCount += steps;
if (!singlePointBottom && !singlePointTop)
facesCount += steps;
//allocate (& clear) structures
if (!init(vertCount,false,facesCount,faceNormCounts))
{
ccLog::Error("[ccCone::buildUp] Not enough memory");
return false;
}
ccPointCloud* verts = vertices();
assert(verts);
assert(m_triNormals);
//2 first points: centers of the top & bottom surfaces
CCVector3 bottomCenter = CCVector3(m_xOff,m_yOff,-m_height)/2;
CCVector3 topCenter = CCVector3(-m_xOff,-m_yOff,m_height)/2;
{
//bottom center
verts->addPoint(bottomCenter);
CompressedNormType nIndex = ccNormalVectors::GetNormIndex(CCVector3(0,0,-1).u);
m_triNormals->addElement(nIndex);
//top center
verts->addPoint(topCenter);
nIndex = ccNormalVectors::GetNormIndex(CCVector3(0,0,1).u);
m_triNormals->addElement(nIndex);
}
//then, angular sweep for top and/or bottom surfaces
{
PointCoordinateType angle_rad_step = static_cast<PointCoordinateType>(2.0*M_PI)/static_cast<PointCoordinateType>(steps);
//bottom surface
if (!singlePointBottom)
{
for (unsigned i=0; i<steps; ++i)
{
CCVector3 P(bottomCenter.x + cos(angle_rad_step*i)*m_bottomRadius,
bottomCenter.y + sin(angle_rad_step*i)*m_bottomRadius,
bottomCenter.z);
verts->addPoint(P);
}
}
//top surface
if (!singlePointTop)
{
for (unsigned i=0; i<steps; ++i)
{
CCVector3 P(topCenter.x + cos(angle_rad_step*i)*m_topRadius,
topCenter.y + sin(angle_rad_step*i)*m_topRadius,
topCenter.z);
verts->addPoint(P);
}
}
//side normals
{
for (unsigned i=0; i<steps; ++i)
{
//slope
CCVector3 u(-sin(angle_rad_step*i),cos(angle_rad_step*i),0);
CCVector3 v(bottomCenter.x-topCenter.x + u.y*(m_bottomRadius-m_topRadius),
bottomCenter.y-topCenter.y - u.x*(m_bottomRadius-m_topRadius),
bottomCenter.z-topCenter.z);
CCVector3 N = v.cross(u);
N.normalize();
CompressedNormType nIndex = ccNormalVectors::GetNormIndex(N.u);
m_triNormals->addElement(nIndex);
}
}
}
//.........这里部分代码省略.........
示例12: if
//.........这里部分代码省略.........
}
for (unsigned i=0; i<addedVertCount; ++i)
{
if (vertIndexes[i] < 0)
{
vertIndexes[i] = static_cast<int>(vertCount++);
vertices->addPoint(P[i]);
}
}
}
//number of triangles to add
unsigned addTriCount = (addedVertCount == 3 ? 1 : 2);
//now add the corresponding face(s)
if (!m_faces->reserve(m_faces->size() + addTriCount))
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
m_faces->addTriangle(vertIndexes[0], vertIndexes[1], vertIndexes[2]);
if (addedVertCount == 4)
m_faces->addTriangle(vertIndexes[0], vertIndexes[2], vertIndexes[3]);
//add per-triangle normals
{
//normals table
NormsIndexesTableType* triNormsTable = m_faces->getTriNormsTable();
bool firstTime = false;
if (!triNormsTable)
{
triNormsTable = new NormsIndexesTableType();
m_faces->setTriNormsTable(triNormsTable);
m_faces->addChild(triNormsTable);
firstTime = true;
}
//add 1 or 2 new entries
unsigned triNormCount = triNormsTable->currentSize();
if (!triNormsTable->reserve(triNormsTable->currentSize() + addTriCount))
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
CCVector3 N = (P[1]-P[0]).cross(P[2]-P[0]);
N.normalize();
triNormsTable->addElement(ccNormalVectors::GetNormIndex(N.u));
if (addTriCount == 2)
{
N = (P[2]-P[0]).cross(P[3]-P[0]);
N.normalize();
triNormsTable->addElement(ccNormalVectors::GetNormIndex(N.u));
}
//per-triangle normals indexes
if (firstTime)
{
if (!m_faces->reservePerTriangleNormalIndexes())
{
ccLog::Error("[DxfImporter] Not enough memory!");
return;
}
m_faces->showNormals(true);
}
int n1 = static_cast<int>(triNormCount);
m_faces->addTriangleNormalIndexes(n1, n1, n1);
if (addTriCount == 2)
{
int n2 = static_cast<int>(triNormCount+1);
m_faces->addTriangleNormalIndexes(n2, n2, n2);
}
}
//and now for the color
if (faceCol)
{
//RGB field already instantiated?
if (vertices->hasColors())
{
for (unsigned i=0; i<createdVertCount; ++i)
vertices->addRGBColor(faceCol);
}
//otherwise, reserve memory and set all previous points to white by default
else if (vertices->setRGBColor(ccColor::white))
{
//then replace the last color(s) by the current one
for (unsigned i=0; i<createdVertCount; ++i)
vertices->setPointColor(vertCount-1-i,faceCol);
m_faces->showColors(true);
}
}
else if (vertices->hasColors())
{
//add default color if none is defined!
for (unsigned i=0; i<createdVertCount; ++i)
vertices->addRGBColor(ccColor::white);
}
}
示例13: saveToFile
//.........这里部分代码省略.........
double absc = 0.0;
CCVector3d Cd(0,0,0);
CCVector3d Ud(0,0,0);
while (true) //fake loop for easy break
{
upDir = poly->getMetaData(ccPolyline::MetaKeyUpDir()).toInt(&ok);
if (!ok) break;
absc = poly->getMetaData(ccPolyline::MetaKeyAbscissa()).toDouble(&ok);
if (!ok) break;
Cd.x = poly->getMetaData(ccPolyline::MetaKeyPrefixCenter()+".x").toDouble(&ok);
if (!ok) break;
Cd.y = poly->getMetaData(ccPolyline::MetaKeyPrefixCenter()+".y").toDouble(&ok);
if (!ok) break;
Cd.z = poly->getMetaData(ccPolyline::MetaKeyPrefixCenter()+".z").toDouble(&ok);
if (!ok) break;
Ud.x = poly->getMetaData(ccPolyline::MetaKeyPrefixDirection()+".x").toDouble(&ok);
if (!ok) break;
Ud.y = poly->getMetaData(ccPolyline::MetaKeyPrefixDirection()+".y").toDouble(&ok);
if (!ok) break;
Ud.z = poly->getMetaData(ccPolyline::MetaKeyPrefixDirection()+".z").toDouble(&ok);
break;
}
if (!ok)
{
ccLog::Warning(QString("[Mascaret] At least one of the meta-data entry of polyline '%1' is invalid?!").arg(poly->getName()));
continue;
}
QString profileName = poly->getName();
profileName = MakeMascaretName(profileName);
CCVector3 C = CCVector3::fromArray(Cd.u);
CCVector3 U = CCVector3::fromArray(Ud.u);
U.normalize();
//write header
outFile << "PROFIL " << biefName << " " << profileName << " " << absc;
#define SAVE_AS_GEO_MASCARET
#ifdef SAVE_AS_GEO_MASCARET
int xDir = upDir == 2 ? 0 : upDir+1;
int yDir = xDir == 2 ? 0 : xDir+1;
//for "geo"-mascaret, we add some more information:
// - first point
{
const CCVector3* firstP = poly->getPoint(0);
CCVector3d firstPg = poly->toGlobal3d(*firstP);
outFile << " ";
outFile << firstPg.u[xDir] << " " << firstPg.u[yDir];
}
// - last point
{
const CCVector3* lastP = poly->getPoint(vertCount-1);
CCVector3d lastPg = poly->toGlobal3d(*lastP);
outFile << " ";
outFile << lastPg.u[xDir] << " " << lastPg.u[yDir];
}
// - profile/path intersection point
{
outFile << " AXE ";
CCVector3d Cdg = poly->toGlobal3d(Cd);
outFile << Cdg.u[xDir] << " " << Cdg.u[yDir];
}
#endif
outFile << endl;
//check the abscissa values order (must be increasing!)