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

Method Check

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

Source from the content-addressed store, hash-verified

1648}
1649
1650bool LNLib::NurbsVolume::Check(const LN_NurbsVolume& volume)
1651{
1652 std::vector<double> kvU = volume.KnotVectorU;
1653 std::vector<double> kvV = volume.KnotVectorV;
1654 std::vector<double> kvW = volume.KnotVectorW;
1655
1656 double minU = kvU[0], maxU = kvU[kvU.size() - 1];
1657 double minV = kvV[0], maxV = kvV[kvV.size() - 1];
1658 double minW = kvW[0], maxW = kvW[kvW.size() - 1];
1659
1660 int num = 50;
1661
1662 double stepU = (maxU - minU) / (num - 1);
1663 double stepV = (maxV - minV) / (num - 1);
1664 double stepW = (maxW - minW) / (num - 1);
1665
1666 int invalidCount = 0;
1667
1668 for (int i = 0; i < num; ++i)
1669 {
1670 for (int j = 0; j < num; ++j)
1671 {
1672 for (int k = 0; k < num; ++k)
1673 {
1674 double u = minU + i * stepU;
1675 double v = minV + j * stepV;
1676 double w = minW + k * stepW;
1677 UVW param(u, v, w);
1678
1679 std::vector<std::vector<std::vector<XYZ>>> ders = ComputeVolumeRationalDerivatives(volume, 1, param);
1680
1681 XYZ Vu = ders[1][0][0];
1682 XYZ Vv = ders[0][1][0];
1683 XYZ Vw = ders[0][0][1];
1684
1685 double jacobian = Vu.X() * Vv.Y() * Vw.Z() +
1686 Vu.Y() * Vv.Z() * Vw.X() +
1687 Vu.Z() * Vv.X() * Vw.Y() -
1688 Vu.Z() * Vv.Y() * Vw.X() -
1689 Vu.Y() * Vv.X() * Vw.Z() -
1690 Vu.X() * Vv.Z() * Vw.Y();
1691
1692 if (jacobian <= 0.0)
1693 {
1694 return false;
1695 }
1696 }
1697 }
1698 }
1699 return true;
1700}

Callers

nothing calls this directly

Calls 3

XMethod · 0.80
YMethod · 0.80
ZMethod · 0.80

Tested by

no test coverage detected