void CPointMesh::start() { if (m_ps->m_normal == NULL) { m_ps->computeNormal(10); m_ps->adjustNormal(10); } m_ps->constructKdTree(); m_links.clear(); m_faces.clear(); m_fontPoints.clear(); m_links.resize(m_ps->getPointSize()); size_t seed = getSeed(0); m_fontPoints.push_back(seed); size_t handand = 0; while (m_fontPoints.size() != 0) { seed = m_fontPoints.front(); m_fontPoints.pop_front(); externPoint(seed); handand ++; if (handand % 100 == 0) m_pView->draw(); } m_links.clear(); // cout<< m_faces.size()<<endl; }
int testLine() { int numErr = 0; logMessage(_T("TESTING - class GM_3dLine ...\n\n")); // Default constructor, line must be invalid GM_3dLine ln; if (ln.isValid()) { logMessage(_T("\tERROR - Default constructor creates valid line\n")); numErr++; } else { logMessage(_T("\tOK - Default constructor creates invalid line\n")); } // Get/Set line coordinates double xStart = getRandomDouble(); double yStart = getRandomDouble(); double zStart = getRandomDouble(); double xEnd = getRandomDouble(); double yEnd = getRandomDouble(); double zEnd = getRandomDouble(); ln.begin().x(xStart); ln.begin().y(yStart); ln.begin().z(zStart); ln.end().x(xEnd); ln.end().y(yEnd); ln.end().z(zEnd); if (!ln.isValid() || ln.begin().x() != xStart || ln.begin().y() != yStart || ln.begin().z() != zStart || ln.end().x() != xEnd || ln.end().y() != yEnd || ln.end().z() != zEnd) { logMessage(_T("\tERROR - Get/Set not working\n")); numErr++; } else { logMessage(_T("\tOK - Get/Set working\n")); } // Copy constructor GM_3dLine ln1(ln); if (ln1.isValid() != ln.isValid() || ln1.begin().x() != ln.begin().x() || ln1.begin().y() != ln.begin().y() || ln1.begin().z() != ln.begin().z() || ln1.end().x() != ln.end().x() || ln1.end().y() != ln.end().y() || ln1.end().z() != ln.end().z()) { logMessage(_T("\tERROR - Copy constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Copy constructor working\n")); } // Constructor (points) GM_3dPoint startPt(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dPoint endPt(getRandomDouble(), getRandomDouble(), getRandomDouble()); GM_3dLine ln2(startPt, endPt); if (!ln2.isValid() || ln2.begin().x() != startPt.x() || ln2.begin().y() != startPt.y() || ln2.begin().z() != startPt.z() || ln2.end().x() != endPt.x() || ln2.end().y() != endPt.y() || ln2.end().z() != endPt.z()) { logMessage(_T("\tERROR - Points constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Points constructor working\n")); } // Constructor (coordinates) xStart = getRandomDouble(); yStart = getRandomDouble(); zStart = getRandomDouble(); xEnd = getRandomDouble(); yEnd = getRandomDouble(); zEnd = getRandomDouble(); GM_3dLine ln3(xStart, yStart, zStart, xEnd, yEnd, zEnd); if (!ln3.isValid() || ln3.begin().x() != xStart || ln3.begin().y() != yStart || ln3.begin().z() != zStart || ln3.end().x() != xEnd || ln3.end().y() != yEnd || ln3.end().z() != zEnd) { logMessage(_T("\tERROR - Coordinate constructor not working\n")); numErr++; } else { logMessage(_T("\tOK - Coordinate constructor working\n")); } // dx, dy, dz double dx = ln2.dx(); double dy = ln2.dy(); double dz = ln2.dz(); if (dx != ln2.end().x()-ln2.begin().x() || dy != ln2.end().y()-ln2.begin().y() || dz != ln2.end().z()-ln2.begin().z()) { logMessage(_T("\tERROR - dx, dy or dz not working\n")); numErr++; } else { logMessage(_T("\tOK - dx, dy or dz working\n")); } // Dot product double dotProduct = ln2 * ln3; double dxLn2 = ln2.dx(); double dyLn2 = ln2.dy(); double dzLn2 = ln2.dz(); double dxLn3 = ln3.dx(); double dyLn3 = ln3.dy(); double dzLn3 = ln3.dz(); double checkDotProduct = dxLn2*dxLn3 + dyLn2*dyLn3 + dzLn2*dzLn3; if (dotProduct != checkDotProduct) { logMessage(_T("\tERROR - Dot product not working\n")); numErr++; } else { logMessage(_T("\tOK - Dot product working\n")); } // Cross product GM_3dLine crossProdLn = ln2 ^ ln3; double checkCrossProdX = ln2.begin().x() + (dyLn2*dzLn3 - dzLn2*dyLn3); double checkCrossProdY = ln2.begin().y() + (dzLn2*dxLn3 - dxLn2*dzLn3); double checkCrossProdZ = ln2.begin().z() + (dxLn2*dyLn3 - dyLn2*dxLn3); if (!crossProdLn.isValid() || crossProdLn.end().x() != checkCrossProdX || crossProdLn.end().y() != checkCrossProdY || crossProdLn.end().z() != checkCrossProdZ) { logMessage(_T("\tERROR - Cross product not working\n")); numErr++; } else { logMessage(_T("\tOK - Cross product working\n")); } // Center GM_3dPoint ln2Center = ln2.center(); if (!ln2Center.isValid() || ln2Center.x() != ln2.begin().x() + (ln2.end().x()-ln2.begin().x())/2.0 || ln2Center.y() != ln2.begin().y() + (ln2.end().y()-ln2.begin().y())/2.0 || ln2Center.z() != ln2.begin().z() + (ln2.end().z()-ln2.begin().z())/2.0) { logMessage(_T("\tERROR - Center point computation not working\n")); numErr++; } else { logMessage(_T("\tOK - Center point computation working\n")); } // Invert GM_3dLine ln2Copy(ln2); ln2.invert(); if (!ln2Copy.isValid() || ln2Copy.begin().x() != ln2.end().x() || ln2Copy.begin().y() != ln2.end().y() || ln2Copy.begin().z() != ln2.end().z() || ln2Copy.end().x() != ln2.begin().x() || ln2Copy.end().y() != ln2.begin().y() || ln2Copy.end().z() != ln2.begin().z()) { logMessage(_T("\tERROR - Inversion not working\n")); numErr++; } else { logMessage(_T("\tOK - Inversion working\n")); } // Length double checkLen = sqrt(ln2.dx()*ln2.dx() + ln2.dy()*ln2.dy() + ln2.dz()*ln2.dz()); if (ln2.length() != checkLen) { logMessage(_T("\tERROR - Length computation not working\n")); numErr++; } else { logMessage(_T("\tOK - Length computation working\n")); } // Null check GM_3dLine nullLn(0.0, 0.0, 0.0, 0.0, 0.0, 0.0); bool checkNull1 = nullLn.isNull(); nullLn.begin().x(10.0); bool checkNull2 = nullLn.isNull(); if (!nullLn.isValid() || !checkNull1 || checkNull2) { logMessage(_T("\tERROR - Null line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Null line check working\n")); } // Vertical line check double xCoord = getRandomDouble(); double yCoord = getRandomDouble(); GM_3dLine vertLn(xCoord, yCoord, getRandomDouble(), xCoord, yCoord, getRandomDouble()); bool checkVert1 = vertLn.isVertical(); vertLn.begin().x(vertLn.begin().x() + 10.0); bool checkVert2 = vertLn.isVertical(); if (!vertLn.isValid() || !checkVert1 || checkVert2) { logMessage(_T("\tERROR - Vertical line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Vertical line check working\n")); } // Horizontal line check double zCoord = getRandomDouble(); GM_3dLine horLn(getRandomDouble(), getRandomDouble(), zCoord, getRandomDouble(), getRandomDouble(), zCoord); bool checkHor1 = horLn.isHorizontal(); horLn.begin().z(horLn.begin().z() + 10.0); bool checkHor2 = horLn.isHorizontal(); if (!horLn.isValid() || !checkHor1 || checkVert2) { logMessage(_T("\tERROR - Horizontal line check not working\n")); numErr++; } else { logMessage(_T("\tOK - Horizontal line check working\n")); } // Z min/max double minZ = ln2.minZ(); double maxZ = ln2.maxZ(); double checkMin = ln2.begin().z() < ln2.end().z() ? ln2.begin().z() : ln2.end().z(); double checkMax = ln2.begin().z() > ln2.end().z() ? ln2.begin().z() : ln2.end().z(); if (minZ != checkMin || maxZ != checkMax) { logMessage(_T("\tERROR - min/max Z not working\n")); numErr++; } else { logMessage(_T("\tOK - min/max Z working\n")); } // Point on line at Z double sec = getRandom01Double(); double dX = ln2.dx(); double dY = ln2.dy(); double dZ = ln2.dz(); double xCheck = ln2.begin().x() + (sec * dX); double yCheck = ln2.begin().y() + (sec * dY); double zCheck = ln2.begin().z() + (sec * dZ); GM_3dPoint pointAtZ = ln2.pointAtZ(zCheck); if (!pointAtZ.isValid() || fabs(pointAtZ.x()-xCheck) > GM_NULL_TOLERANCE || fabs(pointAtZ.y()-yCheck) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point on line at Z not working\n")); numErr++; } else { logMessage(_T("\tOK - Point on line at Z working\n")); } // Nomal vector on XY GM_3dVector normalVectorR = ln2.normalXYVector(true); GM_3dVector normalVectorL = ln2.normalXYVector(false); GM_3dVector ln2Dir(ln2); double dotPR = normalVectorR * ln2Dir; double dotPL = normalVectorL * ln2Dir; bool RSide = ln2Dir.isAtLeftOnXY(normalVectorR); bool LSide = ln2Dir.isAtLeftOnXY(normalVectorL); if (!normalVectorR.isValid() || !normalVectorL.isValid() || fabs(dotPR) > GM_NULL_TOLERANCE || fabs(dotPL) > GM_NULL_TOLERANCE || !RSide || LSide) { logMessage(_T("\tERROR - XY normal vector computation not working\n")); numErr++; } else { logMessage(_T("\tOK - XY normal vector computation working\n")); } // Point from section double section = getRandom01Double(); GM_3dPoint sectionPoint = ln2.pointFromSection(section); double ln2Len = ln2.length(); double pointSectionLen = ln2.begin().distFrom(sectionPoint); if (fabs((pointSectionLen / ln2Len) - section) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point from section not working\n")); numErr++; } else { logMessage(_T("\tOK - Point from section working\n")); } // Section from point double checkSection = ln2.sectionFromPoint(sectionPoint); if (fabs(checkSection - section) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Section from point not working\n")); numErr++; } else { logMessage(_T("\tOK - Section from point working\n")); } // Point distance ln2Dir.normalize(); GM_3dVector ln2NormDir(ln2Dir); section = getRandom01Double(); sectionPoint = ln2.pointFromSection(section); if (fabs(ln2Dir.x()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.x(-(ln2Dir.y()*ln2NormDir.y() + ln2Dir.z()*ln2NormDir.z()) / ln2Dir.x()); } else if (fabs(ln2Dir.y()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.y(-(ln2Dir.x()*ln2NormDir.x() + ln2Dir.z()*ln2NormDir.z()) / ln2Dir.y()); } else if (fabs(ln2Dir.z()) > GM_NULL_TOLERANCE) { ln2NormDir.x(getRandomDouble()); ln2NormDir.y(getRandomDouble()); ln2NormDir.z(getRandomDouble()); ln2NormDir.normalize(); ln2NormDir.z(-(ln2Dir.x()*ln2NormDir.x() + ln2Dir.y()*ln2NormDir.y()) / ln2Dir.z()); } else { ln2NormDir.invalidate(); } double dist = 0.0; double checkDist = 0.0; GM_3dPoint pointOnLine; if (ln2NormDir.isValid()) { ln2NormDir.normalize(); double dotProd = ln2NormDir * ln2Dir; dist = fabs(getRandomDouble()); GM_3dPoint externPoint(sectionPoint); externPoint = (GM_3dVector)externPoint + (ln2NormDir * dist); checkDist = ln2.pointDistance(externPoint, pointOnLine); } if (!pointOnLine.isValid() || fabs(dist - checkDist) > GM_NULL_TOLERANCE) { logMessage(_T("\tERROR - Point distance not working\n")); numErr++; } else { logMessage(_T("\tOK - Point distance working\n")); } return numErr; }