QStringList cc2DLabel::getLabelContent(int precision) { QStringList body; switch(m_points.size()) { case 0: //can happen if the associated cloud(s) has(ve) been deleted! body << "Deprecated"; break; case 1: //point { LabelInfo1 info; getLabelInfo1(info); if (!info.cloud) break; //coordinates AddPointCoordinates(body,info.pointIndex,info.cloud,precision); //normal if (info.hasNormal) { QString normStr = QString("Normal: (%1;%2;%3)").arg(info.normal.x,0,'f',precision).arg(info.normal.y,0,'f',precision).arg(info.normal.z,0,'f',precision); body << normStr; } //color if (info.hasRGB) { QString colorStr = QString("Color: (%1;%2;%3)").arg(info.rgb[0]).arg(info.rgb[1]).arg(info.rgb[2]); body << colorStr; } //scalar field if (info.hasSF) { QString sfVal = GetSFValueAsString(info, precision); QString sfStr = QString("%1 = %2").arg(info.sfName).arg(sfVal); body << sfStr; } } break; case 2: //vector { LabelInfo2 info; getLabelInfo2(info); if (!info.cloud1 || !info.cloud2) break; //distance is now the default label title //PointCoordinateType dist = info.diff.norm(); //QString distStr = QString("Distance = %1").arg(dist,0,'f',precision); //body << distStr; QString vecStr = MathSymbolDelta + QString("X: %1\t").arg(info.diff.x,0,'f',precision) + MathSymbolDelta + QString("Y: %1\t").arg(info.diff.y,0,'f',precision) + MathSymbolDelta + QString("Z: %1" ).arg(info.diff.z,0,'f',precision); body << vecStr; PointCoordinateType dXY = sqrt(info.diff.x*info.diff.x + info.diff.y*info.diff.y); PointCoordinateType dXZ = sqrt(info.diff.x*info.diff.x + info.diff.z*info.diff.z); PointCoordinateType dZY = sqrt(info.diff.z*info.diff.z + info.diff.y*info.diff.y); vecStr = MathSymbolDelta + QString("XY: %1\t").arg(dXY,0,'f',precision) + MathSymbolDelta + QString("XZ: %1\t").arg(dXZ,0,'f',precision) + MathSymbolDelta + QString("ZY: %1" ).arg(dZY,0,'f',precision); body << vecStr; AddPointCoordinates(body,info.point1Index,info.cloud1,precision); AddPointCoordinates(body,info.point2Index,info.cloud2,precision); } break; case 3: //triangle/plane { LabelInfo3 info; getLabelInfo3(info); //area QString areaStr = QString("Area = %1").arg(info.area,0,'f',precision); body << areaStr; //coordinates AddPointCoordinates(body,info.point1Index,info.cloud1,precision,"A"); AddPointCoordinates(body,info.point2Index,info.cloud2,precision,"B"); AddPointCoordinates(body,info.point3Index,info.cloud3,precision,"C"); //normal QString normStr = QString("Normal: (%1;%2;%3)").arg(info.normal.x,0,'f',precision).arg(info.normal.y,0,'f',precision).arg(info.normal.z,0,'f',precision); body << normStr; //angles QString angleStr = QString("Angles: A=%1 - B=%2 - C=%3 deg.") .arg(info.angles.u[0],0,'f',precision) .arg(info.angles.u[1],0,'f',precision) .arg(info.angles.u[2],0,'f',precision); body << angleStr; //edges QString edgesStr = QString("Edges: AB=%1 - BC=%2 - CA=%3") .arg(info.edges.u[0],0,'f',precision) .arg(info.edges.u[1],0,'f',precision) .arg(info.edges.u[2],0,'f',precision); body << edgesStr; } break; default: assert(false); break; } return body; }
QStringList cc2DLabel::getLabelContent(int precision) { QStringList body; switch(m_points.size()) { case 0: //can happen if the associated cloud(s) has(ve) been deleted! body << "Deprecated"; break; 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; AddPointCoordinates(body,pointIndex,cloud,precision); //normal if (cloud->hasNormals()) { const CCVector3& N = cloud->getPointNormal(pointIndex); QString normStr = QString("Normal: (%1;%2;%3)").arg(N.x,0,'f',precision).arg(N.y,0,'f',precision).arg(N.z,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; AddPointCoordinates(body,pointIndex1,cloud1,precision); AddPointCoordinates(body,pointIndex2,cloud2,precision); } 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 AddPointCoordinates(body,pointIndex1,cloud1,precision); AddPointCoordinates(body,pointIndex2,cloud2,precision); AddPointCoordinates(body,pointIndex3,cloud3,precision); //normal N.normalize(); QString normStr = QString("Normal: (%1;%2;%3)").arg(N.x,0,'f',precision).arg(N.y,0,'f',precision).arg(N.z,0,'f',precision); body << normStr; //angle CCVector3 P2P3 = *P3-*P2; //negatives CCVector3 _P1P2 = -P1P2; CCVector3 _P1P3 = -P1P3; CCVector3 _P2P3 = -P2P3; double angleAtP1 = GetAngle_deg(P1P2,P1P3); double angleAtP2 = GetAngle_deg(P2P3,_P1P2); double angleAtP3 = GetAngle_deg(_P1P3,_P2P3); //should be equal to 180-a1-a2! QString angleStr = QString("Angles: A=%1 - B=%3 - C=%5 deg.").arg(angleAtP1,0,'f',precision).arg(angleAtP2,0,'f',precision).arg(angleAtP3,0,'f',precision); body << angleStr; } break; default: assert(false); break; } return body; }