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


How to use the ICurve methods (ArcObjects .NET 10.8 SDK)
ArcObjects Help for .NET developers > ArcObjects Help for .NET developers > Developing with ArcGIS > Learning ArcObjects > Managing data > Working with geometry > Working with curves, segments, and vertices > How to use the ICurve methods

How to use the ICurve methods


Using the ICurve methods

Do the following steps to use the ICurve methods:
  1. Create a point as the origin of the circular arc.
  2. Call PutCoordsByAngle to define the new circular arc.
  3. Get sub-curve of the circular arc.
  4. Get the properties of the circular arc by calling corresponding methods.
The following code example shows how to use the ICurve methods:
[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






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