## NurbsCurveList.GetClosestCurvePosition2

### Description

Returns the curve index, position of the point on it, U value and squared distance from the given position. The data is returned in a 1-dimensional array and is ordered the same as for the NurbsCurveList.GetClosestCurvePosition method output arguments.
Note: This method must be used with scripting languages that don't support arguments passed by reference such as JScript and PerlScript. For more information on getting output arguments, see About Output Argument Arrays.

### C# Syntax

    Object NurbsCurveList.GetClosestCurvePosition2( Object in_vPosition );

### Scripting Syntax

    oArray = NurbsCurveList.GetClosestCurvePosition2( Position );

### Return Value

Array containing the curve index (Long), squared distance from the given position (Double), U value (Double) and the position of the point on the curve (SIVector3).

### Parameters

Parameter | Type | Description
--- | --- | ---
Position | SIVector3 or 1D Array of 3 elements | A position expressed in the NurbsCurveList object frame of reference.

### Examples

#### 1. JScript Example

    // This example shows how to retrieve the control points returned by
    // NurbsSurface.GetClosestSurfacePosition2
    var oRoot = Application.ActiveProject.ActiveScene.Root;
    var oArc = oRoot.AddGeometry( "Arc", "NurbsCurve" );
    // Translate the sphere
    oArc.Kinematics.Global.Parameters("posx").value = oArc.Kinematics.Global.Parameters("posx").value + 13;
    var oPosition = XSIMath.CreateVector3();
    oPosition.Set( 0.0, 0.0, 0.0 );
    // convert VB array to JScript array
    var vbArgs = new VBArray(oArc.ActivePrimitive.Geometry.GetClosestCurvePosition2(oPosition));
    var args = vbArgs.toArray();
    LogMessage( "The origin is closest to curve : " + args[0] + " its distance from it is " + Math.sqrt(args[1]) );
    LogMessage( "The U values are U : " + args[2] );
    LogMessage( "The corresponding position is X: " + args[3].X + " Y: " + args[3].Y + " Z: " + args[3].Z );

#### 2. JScript Example

    /*
            This example demonstrates how to work with curve lists. Of particular
            interest is how to use the (object model) equivalents of EvaluateCurveAt.
    */
    NewScene( null, false );
    // Create a NurbsCurveList
    var oSpine = SICreateCurve( "crvlist", 3, 0 );
    SIAddPointOnCurveAtEnd( "crvlist", -10, 0, -3, false, 0 );
    SIAddPointOnCurveAtEnd( "crvlist", 10, 0, -3, false, 0 );
    var oUKnots = oSpine.ActivePrimitive.Geometry.Curves(0).Knots
    LogMessage( "Start Knot " + oUKnots.item(0 ) )
    LogMessage( "End Knot " + oUKnots.item( oUKnots.Count - 1 ) )
    var xxx = 0;
    var vP = XSIMath.CreateVector3();
    var n;
    for ( var i=-10; i<=10; i+=0.2 ) {
            LogMessage( "----------------" );
            vP.Set( i,0,-3 );
            var Args = oSpine .ActivePrimitive.Geometry.GetClosestCurvePosition2( vP ).toArray();
            uClosest = Args[2];
            var atmp = oSpine.ActivePrimitive.Geometry.Curves( 0 ).EvaluatePosition( uClosest ).toArray();
            LogMessage( "Closest U Value " + uClosest )
            var ZeValues = atmp[0]
            LogMessage( ZeValues.x );
            // this is the null that corresponds to the closest point found
            n = ActiveSceneRoot.AddNull();
            n.Kinematics.Global.Parameters( "posx" ).Value = ZeValues.x;
            // parallel null
            n = ActiveSceneRoot.AddNull();
            n.Kinematics.Global.Parameters( "posx" ).Value = i;
            n.Kinematics.Global.Parameters( "posy" ).Value = -3;
            // this value steadily increases!!!
            DiffFromLast = uClosest - xxx;
            LogMessage( uClosest + " diff from last: " + DiffFromLast );
            xxx = uClosest;
    }
    // output:
    //INFO : Start Knot 0
    //INFO : End Knot 1
    //INFO : ----------------
    //INFO : Closest U Value 0
    //INFO : -10
    //INFO : 0 diff from last: 0
    //INFO : ----------------
    //INFO : Closest U Value 0.0033442415690163336
    //INFO : -9.80001579492262
    //INFO : 0.0033442415690163336 diff from last: 0.0033442415690163336
    //INFO : ----------------
    //INFO : Closest U Value 0.006710593551987059
    //INFO : -9.60006026699216
    //INFO : 0.006710593551987059 diff from last: 0.0033663519829707257
    //INFO : ----------------
    //              etc.
    //INFO : ----------------
    //INFO : Closest U Value 0.7842420051901503
    //INFO : 9.79912278091057
    //INFO : 0.7842420051901503 diff from last: 0.05569420207796605
    //INFO : ----------------
    //INFO : Closest U Value 0.999999999999987
    //INFO : 10
    //INFO : 0.999999999999987 diff from last: 0.2157579948098367

### See Also

NurbsCurveList.GetClosestCurvePosition NurbsCurve.EvaluatePosition EvaluateCurveAt