bool evaluateTangent(InferredCurve inferredCurve, RelatedCurve curve)
        {
            //double angle = Math.Atan((inferredCurve.FromPoint.Y - inferredCurve.ToPoint.Y) / (inferredCurve.FromPoint.X - inferredCurve.ToPoint.X));
            //double length = ((IProximityOperator)inferredCurve.FromPoint).ReturnDistance(inferredCurve.ToPoint);
            
            //the proposed arc chord:
            ILine line = new Line() { FromPoint = inferredCurve.FromPoint, ToPoint = inferredCurve.ToPoint };

            //half the delta of the proposed curve would be:
            double halfdelta = toDegrees(Math.Asin(line.Length / 2 / curve.Radius));

            IVector3D chordVector = new Vector3D() as IVector3D;
            chordVector.PolarSet(line.Angle, 0, 1);

            foreach (RelatedLine tangent in inferredCurve.TangentLines)
            {
                IVector3D tangentVector = new Vector3D() as IVector3D;
                tangentVector.PolarSet(ToRadians(tangent.Angle), 0, 1);

                bool dMatch = false;
                double dVectDiff = toDegrees(Math.Acos(chordVector.DotProduct(tangentVector)));
                if (tangent.Orientation == RelativeOrientation.From_To)
                    dMatch = Math.Abs(dVectDiff - halfdelta) < CurveByInferenceSettings.Instance.MaxTangentLineAngleInDegrees;
                else if (tangent.Orientation == RelativeOrientation.To_From)
                    dMatch = Math.Abs(dVectDiff + halfdelta) < CurveByInferenceSettings.Instance.MaxTangentLineAngleInDegrees;
                else if (tangent.Orientation == RelativeOrientation.From_From)
                    dMatch = Math.Abs(dVectDiff + halfdelta) < CurveByInferenceSettings.Instance.MaxTangentLineAngleInDegrees;
                else if (tangent.Orientation == RelativeOrientation.To_To)
                    dMatch = Math.Abs(dVectDiff - halfdelta) < CurveByInferenceSettings.Instance.MaxTangentLineAngleInDegrees;
                if (dMatch)
                {
                    inferredCurve.InferredRadius = inferredCurve.TangentCurves[0].Radius;
                    inferredCurve.InferredCenterpointID = inferredCurve.TangentCurves[0].CenterpointID;
                    return true;
                }
            }
            return false;
        }
 bool evaluateParallelCurves(InferredCurve inferredCurve, RelatedCurve curve)
 {
     bool bHasConfirmer = false;
     foreach (RelatedCurve dd in inferredCurve.ParallelCurves)
     {
         if (Math.Abs(dd.Radius - curve.Radius) < CurveByInferenceSettings.Instance.MaxRadiusDifference)
         {
             bHasConfirmer = true;
             break;
         }
     }
     if (bHasConfirmer)
     {
         inferredCurve.InferredRadius = inferredCurve.TangentCurves[0].Radius;
         inferredCurve.InferredCenterpointID = inferredCurve.TangentCurves[0].CenterpointID;
         return true;
     }
     return false;
 }