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


How to work with ICurve methods (ArcObjects .NET 10.4 SDK)

How to work with ICurve methods


Working with ICurve methods

Do the following steps to work with ICurve methods:
  1. Define a new point as the origin of the circular arc.
  2. Create a circular arc using the origin point and a predefined angle.
  3. Call GetSubcurve of ICircularArc to get the sub-curve of the circular arc.
  4. Call other methods to show the length and IsClosed properties.
  5. Call the QueryTangent andQueryNormal methods to get tangent and normal somewhere along the curve.
  6. Call QueryPoint to get the point along the extent of tangent from ToPoint.
  7. Call QueryPointAndDistance to find the point on the extended curve nearest to the input point and the distance between those points.
  8. Call ReverseOrientation to reverse the orientation of the curve.
The following code example shows how to use the methods on ICurve:
[C#]
public void DemoCurve()
{
    IPoint origin=new PointClass();
    origin.PutCoords(0, 0);
    ICircularArc circularArc=new CircularArcClass();
    circularArc.PutCoordsByAngle(origin, 0, 2 * Math.PI, 10); //0 to 2Pi=Full-arc.
    //subCircularArc is Set by GetSubcurve. Half-arc (Pi/2 to 3Pi/2).
    ICurve subCircularArc;
    circularArc.GetSubcurve(0.25, 0.75, true, out subCircularArc);
    System.Windows.Forms.MessageBox.Show("Main: Closed? " + circularArc.IsClosed + 
        "\n" + "Length: " + circularArc.Length + "\n" + "Sub: Closed? " +
        subCircularArc.IsClosed + "\n" + "Length: " + subCircularArc.Length);
    //Subcurve From point (0.0) is the same as the main curve point at 0.25 (25%).
    //Subcurve To point (1.0) is the same as the main curve point at 0.75 (75%).
    System.Windows.Forms.MessageBox.Show("Subcurve From: " + OutputPoint
        (subCircularArc.FromPoint) + "\n" + "Subcurve To: " + OutputPoint
        (subCircularArc.ToPoint));
    //Query the tangent (length 20) of the point 0.3 (30%) along the subcurve.
    //Query the normal (length 10) of the point 0.4 (40%) along the main curve.
    //Note: 0.3 (30%) along the subcurve is the same point as the point
    // 0.4 (40%) along the main curve.
    ILine tangent=new LineClass();
    ;
    subCircularArc.QueryTangent(esriSegmentExtension.esriExtendTangentAtFrom, 0.3,
        true, 20, tangent);
    ILine normal=new LineClass();
    ;
    circularArc.QueryNormal(esriSegmentExtension.esriExtendTangentAtFrom, 2 *
        circularArc.Length / 5, false, 10, normal);
    System.Windows.Forms.MessageBox.Show("Tangent: " + OutputLine(tangent) + "\n" + 
        "Normal: " + OutputLine(normal));
    //Finds the point along the To tangent extended 20% beyond the ToPoint.
    IPoint tangentPoint=new PointClass();
    circularArc.QueryPoint(esriSegmentExtension.esriExtendTangentAtTo, 1.2, true,
        tangentPoint);
    System.Windows.Forms.MessageBox.Show("Point on Tangent: " + OutputPoint
        (tangentPoint));
    //Finds the point on the circular arc nearest to the point extended tangentially.
    //Returns the nearest point, the distance to the point, the distance along the curve,
    //whether the point is on the right side of the curve, and AsRatio indicator.
    bool asRatio=false;
    IPoint nearestPoint=new PointClass();
    double distanceOnCurve=0;
    double nearestDistance=0;
    bool isRightSide=false;
    circularArc.QueryPointAndDistance(esriSegmentExtension.esriNoExtension,
        tangentPoint, asRatio, nearestPoint, ref distanceOnCurve, ref
        nearestDistance, ref isRightSide);
    System.Windows.Forms.MessageBox.Show("Nearest Point: " + OutputPoint
        (nearestPoint) + "\n" + "Distance: " + nearestDistance);
    //subCircularArc now is the arc from 3Pi/2 to Pi/2.
    subCircularArc.ReverseOrientation();
}

private String OutputPoint(IPoint point)
{
    return "(" + point.X + ", " + point.Y + ")";
}

private String OutputLine(ILine line)
{
    IPoint fromPoint=new PointClass();
    IPoint toPoint=new PointClass();
    line.QueryFromPoint(fromPoint);
    line.QueryToPoint(toPoint);
    return "From " + OutputPoint(fromPoint) + " to " + OutputPoint(toPoint);
}
[VB.NET]
Public Sub CurveDemo()
    Dim pCArc As ICircularArc
    pCArc=New CircularArc
    Dim pOrigin As IPoint
    pOrigin=New Point
    Dim pSubCArc As ICircularArc
    Dim pTangent As ILine
    Dim pNormal As ILine
    pTangent=New Line
    pNormal=New Line
    Dim pTanPoint As IPoint
    pTanPoint=New Point
    Dim bAsRatio As Boolean
    Dim pNearPoint As IPoint
    pNearPoint=New Point
    Dim DistOnCurve As Double
    Dim NearDist As Double
    Dim bRight As Boolean
    Dim Pi As Double
    Pi=4 * Math.Atan(1)
    pOrigin.PutCoords(0, 0)
    pCArc.PutCoordsByAngle(pOrigin, 0, 2 * Pi, 100) '0 to 2Pi=Full-arc.
    'pSubCArc is Set by GetSubcurve. Half-arc (Pi/2 to 3Pi/2).
    pCArc.GetSubcurve(0.25, 0.75, True, pSubCArc)
    MsgBox("Main: Closed? " & pCArc.IsClosed & vbCrLf & "Length: " & pCArc.Length & vbCrLf _
           & "Sub: Closed? " & pSubCArc.IsClosed & vbCrLf & "Length: " & pSubCArc.Length)
    'Subcurve From point (0.0) is the same as the main curve point at 0.25 (25%).
    'Subcurve To point (1.0) is the same as the main curve point at 0.75 (75%).
    MsgBox("Subcurve From: " & OutputPoint(pSubCArc.FromPoint) & vbCrLf & _
           "Subcurve To: " & OutputPoint(pSubCArc.ToPoint))
    'Query the tangent (length 20) of the point 0.3 (30%) along the subcurve.
    'Query the normal (length 10) of the point 0.4 (40%) along the main curve.
    'Note: 0.3 (30%) along the subcurve is the same point as the point
    ' 0.4 (40%) along the main curve.
    pSubCArc.QueryTangent(esriSegmentExtension.esriExtendTangentAtFrom, 0.3, True, 20, pTangent)
    pCArc.QueryNormal(esriSegmentExtension.esriExtendTangentAtFrom, 2 * pCArc.Length / 5, False, 10, pNormal)
    MsgBox("Tangent: " & OutputLine(pTangent) & vbCrLf & _
           "Normal: " & OutputLine(pNormal))
    'Finds the point along the To tangent extended 20% beyond the ToPoint.
    pCArc.QueryPoint(esriSegmentExtension.esriExtendTangentAtTo, 1.2, True, pTanPoint)
    MsgBox("Point on Tangent: " & OutputPoint(pTanPoint))
    'Finds the point on the circular arc nearest to the point extended tangentially.
    'Returns the nearest point, the distance to the point, the distance along the curve,
    ' whether the point is on the right side of the curve, and AsRatio indicator.
    pCArc.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, pTanPoint, bAsRatio, pNearPoint, DistOnCurve, NearDist, bRight)
    MsgBox("Nearest Point: " & OutputPoint(pNearPoint) & vbCrLf & _
           "Distance: " & NearDist)
    pSubCArc.ReverseOrientation() 'pSubCArc now is the arc from 3Pi/2 to Pi/2.
End Sub


Public Function OutputPoint(ByVal pPoint As IPoint) As String
    OutputPoint="(" & pPoint.X & ", " & pPoint.Y & ")"
End Function


Public Function OutputLine(ByVal pLine As ILine) As String
    Dim pFromPoint As IPoint
    Dim pToPoint As IPoint
    pFromPoint=New Point
    pToPoint=New Point
    pLine.QueryFromPoint(pFromPoint)
    pLine.QueryToPoint(pToPoint)
    OutputLine="From " & OutputPoint(pFromPoint) & " to " & OutputPoint(pToPoint)
End Function






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 Basic ArcGIS for Desktop Basic
ArcGIS for Desktop Standard ArcGIS for Desktop Standard
ArcGIS for Desktop Advanced ArcGIS for Desktop Advanced
Engine Developer Kit Engine