MCPcopy Create free account
hub / github.com/BIMCoderLiang/LNLib / SplitAt

Method SplitAt

src/LNLib/Geometry/Volume/NurbsVolume.cpp:486–671  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

484}
485
486bool LNLib::NurbsVolume::SplitAt(const LN_NurbsVolume& volume, double parameter, VolumeDirection direction, LN_NurbsVolume& first, LN_NurbsVolume& second)
487{
488 int degreeU = volume.DegreeU;
489 int degreeV = volume.DegreeV;
490 int degreeW = volume.DegreeW;
491
492 std::vector<double> kvU = volume.KnotVectorU;
493 std::vector<double> kvV = volume.KnotVectorV;
494 std::vector<double> kvW = volume.KnotVectorW;
495
496 std::vector<std::vector<std::vector<LNLib::XYZW>>> controlPoints = volume.ControlPoints;
497
498 LN_NurbsVolume insertVolume;
499 int k, s, rr;
500
501 if (direction == VolumeDirection::U)
502 {
503 if (LNLib::MathUtils::IsAlmostEqualTo(parameter, kvU[0]) ||
504 LNLib::MathUtils::IsAlmostEqualTo(parameter, kvU[kvU.size() - 1]))
505 {
506 first = volume;
507 second = volume;
508 return true;
509 }
510
511 k = LNLib::Polynomials::GetKnotSpanIndex(degreeU, kvU, parameter);
512 s = LNLib::Polynomials::GetKnotMultiplicity(kvU, parameter);
513 rr = degreeU - s;
514
515 if (rr > 0)
516 {
517 InsertKnot(volume, parameter, rr, direction, insertVolume);
518
519 kvU = insertVolume.KnotVectorU;
520 kvV = insertVolume.KnotVectorV;
521 kvW = insertVolume.KnotVectorW;
522 controlPoints = insertVolume.ControlPoints;
523
524 k = LNLib::Polynomials::GetKnotSpanIndex(degreeU, kvU, parameter);
525 s = LNLib::Polynomials::GetKnotMultiplicity(kvU, parameter);
526 }
527
528 std::vector<double> kU_L = kvU;
529 kU_L.resize(k + 2);
530 kU_L.back() = parameter;
531
532 std::vector<double> kU_R;
533 kU_R.push_back(parameter);
534 kU_R.insert(kU_R.end(), kvU.begin() + (k - s + 1), kvU.end());
535
536 std::vector<std::vector<std::vector<LNLib::XYZW>>> cp_L(controlPoints.begin(), controlPoints.begin() + (k - s + 1));
537 std::vector<std::vector<std::vector<LNLib::XYZW>>> cp_R(controlPoints.begin() + (k - s), controlPoints.end());
538
539 first.DegreeU = degreeU; first.DegreeV = degreeV; first.DegreeW = degreeW;
540 first.KnotVectorU = kU_L; first.KnotVectorV = kvV; first.KnotVectorW = kvW;
541 first.ControlPoints = cp_L;
542
543 second.DegreeU = degreeU; second.DegreeV = degreeV; second.DegreeW = degreeW;

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected