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; }