This document is archived and information here might be outdated.  Recommended version.


How to create a multipoint using the ConstructIntersectionEx method (ArcObjects .NET 10.4 SDK)

How to create a multipoint using the ConstructIntersectionEx method


In this topic


Creating a multipoint using the ConstructIntersectionEx method

The following shows how to use the ConstructIntersectionEx method to create a multipoint.

Intersecting two straight lines to generate a multipoint

Do the following steps to intersect two straight lines to generate a multipoint:
  1. Create two points, fromPoint0 and toPoint0.
  2. Create a line (line0) by calling PutCoords of fromPoint0 and toPoint0.
  3. Create two points, fromPoint1 and toPoint1.
  4. Create a line (line1) by calling PutCoords of fromPoint1 and toPoint1.
  5. Create an instance of MultiPoint object multipoint.
  6. Call ConstructIntersectionEx on line0 and line1.
  7. Query interface (QI) multipoint to IPointCollection and print each point in the pointcollection.

Intersecting a beziér curve and circular curve

Do the following steps to intersect a beziér curve and a circular arc:
  1. Create a point array of four points.
  2. Use the point array to define a new beziér curve (called bezierCurve).
  3. Create three points, named fromPoint, toPoint, and centerPoint.
  4. Create a CircularArc using IConstructCircularArc.
  5. Call IConstructCircularArc.ConstructThreePoints using the three points to define the CicularArc.
  6. Create an instance of MultiPoint object multipoint.
  7. Call ConstructIntersectionEx on the beziér curve and circular arc.
  8. QI multipoint to IPointCollection and print each point in the pointcollection.
See the following code example:
[C#]
public void ConstructIntersectionExTest()
{
    //Case 0 - No intersection (extension needed for line0) line0 meet at line1 in middle.
    String title0="**** Case 0 - Line 0 needs extension ****";
    IPoint fromPoint0=new PointClass();
    fromPoint0.PutCoords(0, 0);
    IPoint toPoint0=new PointClass();
    toPoint0.PutCoords(10, 10);
    ILine line0=new LineClass();
    line0.PutCoords(fromPoint0, toPoint0);
    IPoint fromPoint1=new PointClass();
    fromPoint1.PutCoords(0, 0);
    IPoint toPoint1=new PointClass();
    toPoint1.PutCoords(10, 10);
    ILine line1=new LineClass();
    line1.PutCoords(fromPoint1, toPoint1);
    ConstructIntersectionEx1(line0, line1, title0);
    //Case 1 - Lines intersect in middle.
    String title1="**** Case 1 - Intersecting Lines ****";
    IPoint fromPoint2=new PointClass();
    fromPoint2.PutCoords(0, 0);
    IPoint toPoint2=new PointClass();
    toPoint2.PutCoords(10, 10);
    ILine line2=new LineClass();
    line2.PutCoords(fromPoint2, toPoint2);
    IPoint fromPoint3=new PointClass();
    fromPoint3.PutCoords(10, 0);
    IPoint toPoint3=new PointClass();
    toPoint3.PutCoords(0, 10);
    ILine line3=new LineClass();
    line3.PutCoords(fromPoint3, toPoint3);
    ConstructIntersectionEx1(line2, line3, title1);
    //Case 2 - No Intersection (lines both need extensions).
    String title2="**** Case 2 - Extensions needed for both lines ****";
    IPoint fromPoint4=new PointClass();
    fromPoint4.PutCoords(0, 0);
    IPoint toPoint4=new PointClass();
    toPoint4.PutCoords(10, 10);
    ILine line4=new LineClass();
    line4.PutCoords(fromPoint4, toPoint4);
    IPoint fromPoint5=new PointClass();
    fromPoint5.PutCoords(15, 10);
    IPoint toPoint5=new PointClass();
    toPoint5.PutCoords(25, 0);
    ILine line5=new LineClass();
    line5.PutCoords(fromPoint5, toPoint5);
    ConstructIntersectionEx1(line4, line5, title2);
    //Example 2.
    ConstructIntersectionEx2();
}

//These examples demonstrate how to use the ConstructIntersectionEx method.
//Example 1: With line segments only.
private void ConstructIntersectionEx1(ILine line0, ILine line1, String title)
{
    //Create a multipoint.
    IConstructMultipoint constructMultipoint=new MultipointClass();
    //Construct the intersections.
    //Params optional.
    double param0;
    double param1;
    int bits;
    constructMultipoint.ConstructIntersectionEx(line0 as ISegment,
        esriSegmentExtension.esriExtendEmbedded, line1 as ISegment,
        esriSegmentExtension.esriExtendEmbedded, out param0, out param1, out bits);
    //Prints results.
    IPointCollection pointCollcetion=constructMultipoint as IPointCollection;
    if (pointCollcetion.PointCount == 0)
    {
        System.Windows.Forms.MessageBox.Show("No intersecting points");
    }
    for (int i=0; i < pointCollcetion.PointCount; i++)
    {
        System.Windows.Forms.MessageBox.Show(title + "\n" + 
            "Intersection Point i, X, Y : " + i + " , " + pointCollcetion.get_Point
            (i).X + " , " + pointCollcetion.get_Point(i).Y);
    }
}

//Example 2 - With curves.
private void ConstructIntersectionEx2()
{
    IPoint[] points=new IPoint[4];
    for (int i=0; i < 4; i++)
    {
        points[i]=new PointClass();
    }
    points[0].PutCoords(150, 100);
    points[1].PutCoords(200, 600);
    points[2].PutCoords(400, 600);
    points[3].PutCoords(450, 100);
    IBezierCurveGEN bezierCurve=new BezierCurveClass();
    bezierCurve.PutCoords(ref points);
    IPoint centerPoint=new PointClass();
    centerPoint.PutCoords(300, 300);
    IPoint fromPoint=new PointClass();
    fromPoint.PutCoords(100, 100);
    IPoint toPoint=new PointClass();
    toPoint.PutCoords(500, 100);
    IConstructCircularArc circularArcConstruction=new CircularArcClass();
    circularArcConstruction.ConstructThreePoints(fromPoint, centerPoint, toPoint,
        false);
    //Params optional.
    double param0;
    double param1;
    int bits;
    IConstructMultipoint constructMultipoint=new MultipointClass();
    constructMultipoint.ConstructIntersectionEx(circularArcConstruction as ISegment,
        esriSegmentExtension.esriNoExtension, bezierCurve as ISegment,
        esriSegmentExtension.esriNoExtension, out param0, out param1, out bits);
    IMultipoint multipoint=constructMultipoint as IMultipoint;
    IPointCollection pointCollection=multipoint as IPointCollection;
    for (int i=0; i < pointCollection.PointCount; i++)
    {
        System.Windows.Forms.MessageBox.Show("Example2: Point : " +
            pointCollection.get_Point(i).X + " , " + pointCollection.get_Point(i).Y);
    }
}
[VB.NET]
'Example 1: With line segments only.

Sub example_ConstructIntersectionEx()
    Dim pLine0 As ILine, pLine1 As ILine
    Dim pt0fr As IPoint, pt0to As IPoint
    Dim pt1fr As IPoint, pt1to As IPoint
    Dim pConstructMpt As IConstructMultipoint
    Dim pSegment0 As ISegment, pSegment1 As ISegment
    'Lines will never have more than one intersection.
    Dim dParam0(0) As Double, dParam1(0) As Double, lbits(0) As Long
    Dim i As Long, ptc As IPointCollection
    'Create lines objects.
    pLine0=New Line
    pLine1=New Line
    'Create from/to point object to build lines.
    pt0fr=New Point
    pt0to=New Point
    pt1fr=New Point
    pt1to=New Point
    'Case 0 - No intersection (extension needed for line0) line0 meet at line1 in middle.
    Debug.Print("**** Case 0 - Line 0 needs extension ****")
    'Construct the lines.
    pt0fr.PutCoords(0, 0)
    pt0to.PutCoords(10, 10)
    pLine0.PutCoords(pt0fr, pt0to)
    pt1fr.PutCoords(7, 30)
    pt1to.PutCoords(30, 0)
    pLine1.PutCoords(pt1fr, pt1to)
    'Create a multipoint.
    pConstructMpt=New Multipoint
    pSegment0=pLine0 'QI.
    pSegment1=pLine1 'QI.
    'Construct the intersections.
    pConstructMpt.ConstructIntersectionEx(pSegment0, esriSegmentExtension.esriExtendEmbedded, pSegment1, esriSegmentExtension.esriExtendEmbedded, dParam0(0), dParam1(0), lbits(0))
    'Prints results.
    ptc=pConstructMpt
    For i=0 To ptc.PointCount - 1
        Debug.Print("Intersection Point i, X, Y : " & i & " , " & ptc.Point(i).X & " , " & ptc.Point(i).Y)
    Next
    For i=0 To UBound(dParam0)
        Debug.Print("Parametric distances segment 0 : " & i & " , " & dParam0(i))
    Next
    For i=0 To UBound(dParam1)
        Debug.Print("Parametric distances segment 1 : " & i & " , " & dParam1(i))
    Next
    For i=0 To UBound(lbits)
        Debug.Print("Tangent bits : " & i & " , " & lbits(i))
    Next
    'Case 1 - Lines intersect in middle.
    Debug.Print("**** Case 1 - Intersecting Lines ****")
    'Construct lines segments.
    pt0fr.PutCoords(0, 0)
    pt0to.PutCoords(10, 10)
    pLine0.PutCoords(pt0fr, pt0to)
    pt1fr.PutCoords(10, 0)
    pt1to.PutCoords(0, 10)
    pLine1.PutCoords(pt1fr, pt1to)
    'Create a multipoint.
    pConstructMpt=New Multipoint
    pSegment0=pLine0 'QI.
    pSegment1=pLine1 'QI.
    'Construct the intersections.
    pConstructMpt.ConstructIntersectionEx(pSegment0, esriSegmentExtension.esriExtendEmbedded, pSegment1, esriSegmentExtension.esriExtendEmbedded, dParam0(0), dParam1(0), lbits(0))
    'Prints results.
    ptc=pConstructMpt
    For i=0 To ptc.PointCount - 1
        Debug.Print("Intersection Point i, X, Y : " & i & " , " & ptc.Point(i).X & " , " & ptc.Point(i).Y)
    Next
    For i=0 To UBound(dParam0)
        Debug.Print("Parametric distances segment 0 : " & i & " , " & dParam0(i))
    Next
    For i=0 To UBound(dParam1)
        Debug.Print("Parametric distances segment 1 : " & i & " , " & dParam1(i))
    Next
    For i=0 To UBound(lbits)
        Debug.Print("Tangent bits : " & i & " , " & lbits(i))
    Next
    'Case 2 - No intersection (lines both need extensions).
    Debug.Print("**** Case 2 - Extensions needed for both lines ****")
    pt0fr.PutCoords(0, 0)
    pt0to.PutCoords(10, 10)
    pLine0.PutCoords(pt0fr, pt0to)
    pt1fr.PutCoords(15, 10)
    pt1to.PutCoords(25, 0)
    pLine1.PutCoords(pt1fr, pt1to)
    'Create a multipoint.
    pConstructMpt=New Multipoint
    pSegment0=pLine0 'QI.
    pSegment1=pLine1 'QI.
    'Construct the intersections.
    pConstructMpt.ConstructIntersectionEx(pSegment0, esriSegmentExtension.esriExtendEmbedded, pSegment1, esriSegmentExtension.esriExtendEmbedded, dParam0(0), dParam1(0), lbits(0))
    'Prints results.
    ptc=pConstructMpt
    For i=0 To ptc.PointCount - 1
        Debug.Print("Intersection Point i, X, Y : " & i & " , " & ptc.Point(i).X & " , " & ptc.Point(i).Y)
    Next
    For i=0 To UBound(dParam0)
        Debug.Print("Parametric distances segment 0 : " & i & " , " & dParam0(i))
    Next
    For i=0 To UBound(dParam1)
        Debug.Print("Parametric distances segment 1 : " & i & " , " & dParam1(i))
    Next
    For i=0 To UBound(lbits)
        Debug.Print("Tangent bits : " & i & " , " & lbits(i))
    Next
End Sub

'Example 2 - With curves.

Private Sub ConstructIntersectionEx()
    Dim pConstructCircularArc As IConstructCircularArc
    Dim pCArc As ICircularArc
    Dim pPoint1 As IPoint
    Dim pPoint2 As IPoint
    Dim pPoint3 As IPoint
    Dim pTcoll As IPointCollection
    Dim pConstructMultipoint As IConstructMultipoint
    Dim pMultipoint As IMultipoint
    Dim i As Long
    Dim pBezier As IBezierCurve
    Dim pPtCon(0 To 3) As IPoint
    Dim pa1(13) As Double
    Dim pa2(13) As Double
    Dim pa3 As Long
    For i=0 To 3
        pPtCon(i)=New Point
    Next
    pPtCon(0).PutCoords(150, 100)
    pPtCon(1).PutCoords(200, 600)
    pPtCon(2).PutCoords(400, 600)
    pPtCon(3).PutCoords(450, 100)
    pBezier=New BezierCurve
    pBezier.PutCoords(4, pPtCon(0))
    pConstructMultipoint=New Multipoint
    pConstructCircularArc=New CircularArc
    pCArc=pConstructCircularArc
    pPoint1=New Point
    pPoint2=New Point
    pPoint3=New Point
    pPoint1.PutCoords(100, 100)
    pPoint2.PutCoords(300, 300)
    pPoint3.PutCoords(500, 100)
    pConstructCircularArc.ConstructThreePoints(pPoint1, pPoint2, pPoint3, False)
    pConstructMultipoint.ConstructIntersectionEx(pCArc, esriSegmentExtension.esriNoExtension, pBezier, esriSegmentExtension.esriNoExtension, pa1(0), pa2(0), pa3)
    'The parametric distance along the segment1.
    Debug.Print("******************************************")
    Debug.Print("Parametric distance along the segment 1")
    Debug.Print("******************************************")
    For i=0 To UBound(pa1)
        Debug.Print(pa1(i))
    Next
    'The parametric distance along the segment2.
    Debug.Print("******************************************")
    Debug.Print("Parametric distance along the segment 2")
    Debug.Print("******************************************")
    For i=0 To UBound(pa2)
        Debug.Print(pa2(i))
    Next
    pMultipoint=pConstructMultipoint
    pTcoll=pMultipoint
    Debug.Print("*********************************************")
    Debug.Print(" Report the points")
    Debug.Print("*********************************************")
    For i=0 To pTcoll.PointCount - 1
        Debug.Print("Point : " & pTcoll.Point(i).X & " , " & pTcoll.Point(i).Y)
    Next
End Sub






To use the code in this topic, reference the following assemblies in your Visual Studio project. In the code files, you will need using (C#) or Imports (VB .NET) directives for the corresponding namespaces (given in parenthesis below if different from the assembly name):

Development licensing Deployment licensing
ArcGIS for Desktop Advanced ArcGIS for Desktop Basic
Engine Developer Kit ArcGIS for Desktop Standard
ArcGIS for Desktop Basic ArcGIS for Desktop Advanced
ArcGIS for Desktop Standard Engine