| 671 | } |
| 672 | |
| 673 | bool LNLib::NurbsVolume::Extract(const LN_NurbsVolume& volume, double parameter, VolumeDirection direction, LNLib::LN_NurbsSurface surface) |
| 674 | { |
| 675 | int degreeU = volume.DegreeU; |
| 676 | int degreeV = volume.DegreeV; |
| 677 | int degreeW = volume.DegreeW; |
| 678 | |
| 679 | std::vector<double> kvU = volume.KnotVectorU; |
| 680 | std::vector<double> kvV = volume.KnotVectorV; |
| 681 | std::vector<double> kvW = volume.KnotVectorW; |
| 682 | |
| 683 | std::vector<std::vector<std::vector<LNLib::XYZW>>> controlPoints = volume.ControlPoints; |
| 684 | std::vector<std::vector<LNLib::XYZW>> Pwc; |
| 685 | |
| 686 | LN_NurbsVolume insertVolume; |
| 687 | int k, s, rr; |
| 688 | |
| 689 | int newDegreeU, newDegreeV; |
| 690 | std::vector<double> newKvU, newKvV; |
| 691 | |
| 692 | if (direction == VolumeDirection::U) |
| 693 | { |
| 694 | if (LNLib::MathUtils::IsAlmostEqualTo(parameter, kvU[0])) |
| 695 | { |
| 696 | Pwc = controlPoints[0]; |
| 697 | } |
| 698 | else if (LNLib::MathUtils::IsAlmostEqualTo(parameter, kvU[kvU.size() - 1])) |
| 699 | { |
| 700 | Pwc = controlPoints[controlPoints.size() - 1]; |
| 701 | } |
| 702 | else |
| 703 | { |
| 704 | k = LNLib::Polynomials::GetKnotSpanIndex(degreeU, kvU, parameter); |
| 705 | s = LNLib::Polynomials::GetKnotMultiplicity(kvU, parameter); |
| 706 | rr = degreeU - s; |
| 707 | |
| 708 | if (rr > 0) |
| 709 | { |
| 710 | InsertKnot(volume, parameter, rr, direction, insertVolume); |
| 711 | |
| 712 | kvU = insertVolume.KnotVectorU; |
| 713 | kvV = insertVolume.KnotVectorV; |
| 714 | kvW = insertVolume.KnotVectorW; |
| 715 | controlPoints = insertVolume.ControlPoints; |
| 716 | |
| 717 | k = LNLib::Polynomials::GetKnotSpanIndex(degreeU, kvU, parameter); |
| 718 | s = LNLib::Polynomials::GetKnotMultiplicity(kvU, parameter); |
| 719 | } |
| 720 | Pwc = controlPoints[k - s]; |
| 721 | |
| 722 | newDegreeU = degreeV; |
| 723 | newDegreeV = degreeW; |
| 724 | newKvU = kvV; |
| 725 | newKvV = kvW; |
| 726 | } |
| 727 | } |
| 728 | else if (direction == VolumeDirection::V) |
| 729 | { |
| 730 | if (LNLib::MathUtils::IsAlmostEqualTo(parameter, kvV[0])) |
nothing calls this directly
no outgoing calls
no test coverage detected