コード例 #1
0
        private void PolygonIntersection()
        {
            // Create a square in the XY plane
            vtkPoints points = vtkPoints.New();

            points.InsertNextPoint(0.0, 0.0, 0.0);
            points.InsertNextPoint(1.0, 0.0, 0.0);
            points.InsertNextPoint(1.0, 1.0, 0.0);
            points.InsertNextPoint(0.0, 1.0, 0.0);

            // Create the polygon
            vtkPolygon polygon = vtkPolygon.New();

            polygon.GetPoints().DeepCopy(points);
            polygon.GetPointIds().SetNumberOfIds(4); // 4 corners of the square
            polygon.GetPointIds().SetId(0, 0);
            polygon.GetPointIds().SetId(1, 1);
            polygon.GetPointIds().SetId(2, 2);
            polygon.GetPointIds().SetId(3, 3);

            // our line to intersect the polygon with
            double[] p1        = new double[] { 0.1, 0, -1.0 };
            double[] p2        = new double[] { 0.1, 0, 1.0 };
            double   tolerance = 0.001;
            // Outputs
            // t must be initalized cause it is passed by reference (that's a c# convention)
            double t = 0.0; // Parametric coordinate of intersection (0 (corresponding to p1) to 1 (corresponding to p2))

            double[] x      = new double[] { 0.0, 0.0, 0.0 };
            double[] coords = new double[] { 0.0, 0.0, 0.0 };
            // subId must be initialized cause it is passed by reference (that's a c# convention)
            int subId = 0;

            IntPtr pP1     = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
            IntPtr pP2     = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
            IntPtr pX      = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);
            IntPtr pCoords = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * 3);

            Marshal.Copy(p1, 0, pP1, 3);
            Marshal.Copy(p2, 0, pP2, 3);
            // next two lines are not necessarely needed, but I prefer to initialize ref parameter (in those a result is passed back)
            Marshal.Copy(x, 0, pX, 3);
            Marshal.Copy(coords, 0, pCoords, 3);
            // see vtkCell API for a detailed description of this function
            int iD = polygon.IntersectWithLine(pP1, pP2, tolerance, ref t, pX, pCoords, ref subId);

            // Copy result back to our managed arrays
            Marshal.Copy(pX, x, 0, 3);
            Marshal.Copy(pCoords, coords, 0, 3);
            Console.WriteLine("intersected? " + iD);;
            Console.WriteLine("intersection: " + x[0] + " " + x[1] + " " + x[2]);
            Marshal.FreeHGlobal(pP1);
            Marshal.FreeHGlobal(pP2);
            Marshal.FreeHGlobal(pX);
            Marshal.FreeHGlobal(pCoords);
            // nothing to visualize
        }