| 1751 | //------------------------------------------------------------------------------ |
| 1752 | |
| 1753 | void vtkIntersectionPolyDataFilter::Impl ::Orient( |
| 1754 | vtkPolyData* pd, vtkTransform* transform, vtkPolyData* boundary, vtkPolygon* boundarypoly) |
| 1755 | { |
| 1756 | // Orient this loop in a counter clockwise direction in preparation for |
| 1757 | // cell splitting. For delaunay2d, the polygon should be in CCW order, but |
| 1758 | // also for ear clipping method, it is nice to have also in CCW order. |
| 1759 | vtkSmartPointer<vtkTransformPolyDataFilter> transformer = |
| 1760 | vtkSmartPointer<vtkTransformPolyDataFilter>::New(); |
| 1761 | vtkSmartPointer<vtkPolyData> transformedpd = vtkSmartPointer<vtkPolyData>::New(); |
| 1762 | |
| 1763 | transformer->SetInputData(pd); |
| 1764 | transformer->SetTransform(transform); |
| 1765 | transformer->Update(); |
| 1766 | transformedpd = transformer->GetOutput(); |
| 1767 | |
| 1768 | double area = 0; |
| 1769 | double tedgept1[3]; |
| 1770 | double tedgept2[3]; |
| 1771 | vtkIdType nextPt; |
| 1772 | for (nextPt = 0; nextPt < pd->GetNumberOfPoints() - 1; nextPt++) |
| 1773 | { |
| 1774 | transformedpd->GetPoint(nextPt, tedgept1); |
| 1775 | transformedpd->GetPoint(nextPt + 1, tedgept2); |
| 1776 | area = area + (tedgept1[0] * tedgept2[1]) - (tedgept2[0] * tedgept1[1]); |
| 1777 | } |
| 1778 | transformedpd->GetPoint(nextPt, tedgept1); |
| 1779 | transformedpd->GetPoint(0, tedgept2); |
| 1780 | area = area + (tedgept1[0] * tedgept2[1]) - (tedgept2[0] * tedgept1[1]); |
| 1781 | |
| 1782 | if (area < 0) |
| 1783 | { |
| 1784 | for (nextPt = pd->GetNumberOfPoints() - 1; nextPt > -1; nextPt--) |
| 1785 | { |
| 1786 | boundarypoly->GetPointIds()->InsertNextId(nextPt); |
| 1787 | } |
| 1788 | } |
| 1789 | else |
| 1790 | { |
| 1791 | for (nextPt = 0; nextPt < pd->GetNumberOfPoints(); nextPt++) |
| 1792 | { |
| 1793 | boundarypoly->GetPointIds()->InsertNextId(nextPt); |
| 1794 | } |
| 1795 | } |
| 1796 | vtkSmartPointer<vtkCellArray> cellarray = vtkSmartPointer<vtkCellArray>::New(); |
| 1797 | cellarray->InsertNextCell(boundarypoly); |
| 1798 | boundary->SetPoints(pd->GetPoints()); |
| 1799 | boundary->SetPolys(cellarray); |
| 1800 | } |
| 1801 | |
| 1802 | //------------------------------------------------------------------------------ |
| 1803 |
no test coverage detected