闭合曲线查找算法:传入无序曲线组,将能构成闭环的曲线返回
struct LineData
{
Point3d start;
Point3d end;
tag_t curve_tag;
LineData(const Point3d& startPoint, const Point3d& endPoint, const tag_t& lineTag)
: start(startPoint), end(endPoint), curve_tag(lineTag)
{
}
};
bool IsSamePoint(const Point3d& a, const Point3d& b)
{
const double tolerance = 1e-6;
return (std::abs(a.X - b.X) < tolerance && std::abs(a.Y - b.Y) < tolerance && std::abs(a.Z - b.Z) < tolerance);
}
std::vector<std::vector<LineData>> FindClosedCurves(std::vector<LineData>& lines)
{
std::vector<std::vector<LineData>> closedCurves;
std::vector<bool> used(lines.size(), false);
for (size_t i = 0; i < lines.size(); ++i) {
if (used[i]) continue;
std::vector<LineData> currentCurve;
currentCurve.push_back(lines[i]);
used[i] = true;
bool curveClosed = false;
while (!curveClosed) {
curveClosed = true;
for (size_t j = 0; j < lines.size(); ++j) {
if (!used[j]) {
if (IsSamePoint(currentCurve.back().end, lines[j].start)) {
currentCurve.push_back(lines[j]);
used[j] = true;
curveClosed = false;
break;
}
else if (IsSamePoint(currentCurve.back().end, lines[j].end))
{
LineData reversedLine = lines[j];
std::swap(reversedLine.start, reversedLine.end);
currentCurve.push_back(reversedLine);
used[j] = true;
curveClosed = false;
break;
}
}
}
}
if (currentCurve.size()>2 && IsSamePoint(currentCurve.back().end, currentCurve.front().start))
{
closedCurves.push_back(currentCurve);
}
}
return closedCurves;
}
return connectedGroups;
}
LineData getVerOfCurve(tag_t curveTag)
{
double point[3] = { 0 };
double target[3] = { 0 };
double pnorm[3] = { 0 };
double bnorm[3] = { 0 };
double a, b;
double sta = 0;
double end = 1;
double stratP[3] = { 0 };
double endP[3] = { 0 };
UF_MODL_ask_curve_props(curveTag, sta, stratP, target, pnorm, bnorm, &a, &b);
UF_MODL_ask_curve_props(curveTag, end, endP, target, pnorm, bnorm, &a, &b);
return LineData(Point3d(stratP[0], stratP[1], stratP[2]), Point3d(endP[0], endP[1], endP[2]), curveTag);
}
int main()
{
vector<tag_t>tempVec = getViewSilhouette(allBody[i]);
for (int j = 0; j < tempVec.size(); j++)
{
LineData data = getVerOfCurve(tempVec[j]);
allCurveVec.push_back(data);
}
vector<vector<tag_t>> curveGroupVec = findConnectedGroups(allCurveVec,0.1);
}