| 484 | } |
| 485 | |
| 486 | bool 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; |
nothing calls this directly
no outgoing calls
no test coverage detected