| 1648 | } |
| 1649 | |
| 1650 | bool 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 | } |