#include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier #include "Path.h" ClipSet clipSet; BranchPointSet branchPointSet; P dirP(P &A) { P B; B.x = A.dx; B.y = A.dy; B.z = A.dz; return B; } Path::Path() { dia = 0; } // 返回path中点的数量 int Path::size() { assert(inOut.size() == points.size()); return points.size(); } void Path::markPoint() { for (int i = 0; i < points.size(); i++) { P &tp = points[i]; if (tp.type == 1 || tp.type == 2) { BranchPoint *pb = branchPointSet.getBranchPointPointer(tp.ref); pb->used = true; pb->pc1->used = true; pb->pc2->used = true; } else if (tp.type == 0) { clipSet.c[tp.ref].used = true; } } } // 固定所有经过的分支点 void Path::fixBranchPoint() { for (int i = 0; i < points.size(); i++) { P &tp = points[i]; if (tp.type == 1) { BranchPoint *pb = branchPointSet.getBranchPointPointer(tp.ref); pb->fix(); } } } // 检查路径合法性 void Path::illegalCheck() { map vis; for (int i = 0; i < points.size(); i++) { assert(vis[points[i]] == 0); vis[points[i]] = 1; if (i == 0 || i == points.size() - 1) { assert(points[i].type == 3); } if (points[i].type != 0) { assert(inOut[i] < 0); } } } // 将路径中的点翻转成正常反向,并生成inOut数组 void Path::processDir() { for (int j = 0; j < points.size(); j++) { if (points[j].type != 0) { inOut.push_back(-1); continue; } double reverse = 0; P dir = dirP(points[j]); if (j != 0) { reverse += pi / 2 - Angle(points[j] - points[j - 1], dir); } if (j != points.size() - 1) { reverse += pi / 2 - Angle(points[j + 1] - points[j], dir); } if (reverse < 0) { // points[j].reverse(); inOut.push_back(1); } else inOut.push_back(0); } } // 在路径确定后,处理一些能在pass层面处理的信息 void Path::postProcess() { this->fixBranchPoint(); // this->processDir(); this->markPoint(); } // 翻转整条路径 void Path::reverse() { std::reverse(points.begin(), points.end()); assert(inOut.size() == points.size()); for (int i = 0; i < points.size(); i++) { if (inOut[i] != -1) { inOut[i] = inOut[i] ^ 1; points[i].reverse(); } } }