private bool IsAngleBelowThreshold(FeatureCurve firstCurve, FeatureCurve secondCurve) { var crossLength = Vector3D.CrossProduct(firstCurve.NormalResult.Normalized(), secondCurve.NormalResult.Normalized()).Length; var angle = Math.Asin(crossLength); return(angle <= angleThreshold); }
private bool AreGoodCandidates(FeatureCurve firstCurve, FeatureCurve secondCurve) { bool areRelativeClose = AreRelativeClose(firstCurve, secondCurve); bool areAbsoluteClose = AreAbsoluteClose(firstCurve, secondCurve); return(areRelativeClose || areAbsoluteClose); }
private double ProximityMeasure(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve) { var d1 = (existingCurve.CenterResult - firstNewCurve.CenterResult).Length; var d2 = (existingCurve.CenterResult - secondNewCurve.CenterResult).Length; return(Math.Min(d1, d2)); }
private bool AreGoodCandidates(FeatureCurve firstCurve, FeatureCurve secondCurve) { Contract.Requires(firstCurve is CircleFeatureCurve); Contract.Requires(secondCurve is CircleFeatureCurve); if (firstCurve.IsSameObjectCurve(secondCurve)) { return(true); // two curves that are snapped to the same sketch curves are considered coplanar. } double radiiSum = 0; if (firstCurve is CircleFeatureCurve && secondCurve is CircleFeatureCurve) { radiiSum = (firstCurve as CircleFeatureCurve).RadiusResult + (secondCurve as CircleFeatureCurve).RadiusResult; } var radiiThreshold = radiiSum * centerDistanceRelativeThreshold; bool areAlmostParallel = AreAlmostParallel(firstCurve.NormalResult, secondCurve.NormalResult); bool isFirstAlmostOnSecondPlane = IsAlmostOnPlane(point: firstCurve.CenterResult, planePoint: secondCurve.CenterResult, planeNormal: secondCurve.NormalResult, relativeThreshold: radiiThreshold); bool isSecondAlmostOnFirstPlane = IsAlmostOnPlane(point: secondCurve.CenterResult, planePoint: firstCurve.CenterResult, planeNormal: firstCurve.NormalResult, relativeThreshold: radiiThreshold); return(areAlmostParallel && isFirstAlmostOnSecondPlane && isSecondAlmostOnFirstPlane); }
private bool IsAngleBelowThreshold(FeatureCurve firstCurve, FeatureCurve secondCurve) { double dot = Vector3D.DotProduct(firstCurve.NormalResult, secondCurve.NormalResult); double angle = Math.Acos(dot); double angleDiff = Math.Abs(Math.PI / 2 - angle); return(angleDiff <= angleThreshold); }
private double DistanceBetweenCenters(FeatureCurve curve1, FeatureCurve curve2) { var diff = curve1.CenterResult - curve2.CenterResult; var dist3d = diff.Length; var dist2d = new Vector(diff.X, diff.Y).Length; return(Math.Min(dist3d, dist2d)); }
private IEnumerable <FeatureCurve> AllCurvesOnPrimitiveOf(FeatureCurve featureCurve) { var containingPrimitive = from primitive in sessionData.SnappedPrimitives where primitive.FeatureCurves.Contains(featureCurve) select primitive; return(containingPrimitive.First().FeatureCurves); }
private bool AreGoodCandidates(FeatureCurve firstCurve, FeatureCurve secondCurve) { bool angleCondition = IsAngleBelowThreshold(firstCurve, secondCurve); //bool proximityCondition = IsProximityBelowThreshold(firstCurve, secondCurve); bool proximityCondition = true; bool result = angleCondition && proximityCondition; return(result); }
private bool AreAlmostColinear(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve) { double[] angles = { GetAngle(firstNewCurve, secondNewCurve, existingCurve), GetAngle(firstNewCurve, existingCurve, secondNewCurve), GetAngle(secondNewCurve, firstNewCurve, existingCurve) }; var maxAngle = angles.Max(); return(maxAngle >= colinearityThreshold); }
private bool IsOwnedBySphere(FeatureCurve featureCurve) { var owningSpheresCount = sessionData.SnappedPrimitives .OfType <SnappedSphere>() .Count(sphere => sphere.FeatureCurves.Contains(featureCurve)); return(owningSpheresCount != 0); }
private bool IsContainedIn(FeatureCurve containee, FeatureCurve container) { Contract.Requires(containee is RectangleFeatureCurve || containee is CircleFeatureCurve); Contract.Requires(container is RectangleFeatureCurve || container is CircleFeatureCurve); var containeeGeometry = GetGeometry(containee); var containerGeometry = GetGeometry(container); return(containerGeometry.FillContains(containeeGeometry)); }
private static double GetCurveSize(FeatureCurve featureCurve) { var circle = featureCurve as CircleFeatureCurve; var rect = featureCurve as RectangleFeatureCurve; var firstSize = circle != null ? circle.RadiusResult : 0.75 * (rect.WidthResult + rect.HeightResult); return(firstSize); }
private double CurveDistance(FeatureCurve curve1, FeatureCurve curve2) { if (curve1.IsSameObjectCurve(curve2)) { return(0); } else { return(DistanceBetweenCenters(curve1, curve2)); } }
private bool IsInsideSphere(FeatureCurve curve, SnappedSphere toBeAnnotatedSphere) { var snappedPoints = GetSnappedPoints(curve); var insideSpherePointsCount = snappedPoints.Count(p => IsInsideSphere(p, toBeAnnotatedSphere)); if (insideSpherePointsCount > 0.5 * snappedPoints.Length) // at-least half of the points are inside the sphere { return(true); } else { return(false); } }
private double GetAngle(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve) { var c1 = new Point(firstNewCurve.CenterResult.X, -firstNewCurve.CenterResult.Y); var c2 = new Point(secondNewCurve.CenterResult.X, -secondNewCurve.CenterResult.Y); var c3 = new Point(existingCurve.CenterResult.X, -existingCurve.CenterResult.Y); var u = c1 - c2; var v = c3 - c1; var cos = (u * v) / (u.Length * v.Length); var angle = Math.Acos(cos); return(angle); }
private Point[] GetSnappedPoints(FeatureCurve curve) { Contract.Requires(curve != null); Contract.Requires(curve is CircleFeatureCurve); var circle = curve as CircleFeatureCurve; if (circle.SnappedTo != null) { return(circle.SnappedTo.Points); } else { return(new Point[0]); } }
private Geometry GetGeometry(FeatureCurve curve) { Contract.Requires(curve is CircleFeatureCurve || curve is RectangleFeatureCurve); var circle = curve as CircleFeatureCurve; var rect = curve as RectangleFeatureCurve; if (circle != null) { return(GetGeometry(circle)); } else { return(GetGeometry(rect)); } }
private bool AreRelativeClose(FeatureCurve firstCurve, FeatureCurve secondCurve) { Contract.Requires(firstCurve is CircleFeatureCurve || firstCurve is RectangleFeatureCurve); Contract.Requires(secondCurve is CircleFeatureCurve || firstCurve is RectangleFeatureCurve); var firstSize = GetCurveSize(firstCurve); var secondSize = GetCurveSize(secondCurve); var sizesSum = firstSize + secondSize; var dist = CurveDistance(firstCurve, secondCurve); if (sizesSum == 0) { return(false); } else { return((dist / sizesSum) <= relativeThreshold); } }
private double DistanceBetweenCurves(FeatureCurve first, FeatureCurve second) { return((first.CenterResult - second.CenterResult).Length); }
private bool AreAbsoluteClose(FeatureCurve firstCurve, FeatureCurve secondCurve) { var dist = CurveDistance(firstCurve, secondCurve); return(dist < absoluteThreshold); }
private bool AreGoodCandidates(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve) { bool areAlmostColinear = AreAlmostColinear(firstNewCurve, secondNewCurve, existingCurve); return(areAlmostColinear); }
private bool AreCloseEnough(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve) { double proximity = ProximityMeasure(firstNewCurve, secondNewCurve, existingCurve); return(proximity <= proximityThreshold); }
private bool IsProximityBelowThreshold(FeatureCurve firstCurve, FeatureCurve secondCurve) { var distance = DistanceBetweenCurves(firstCurve, secondCurve); return(distance <= proximityThreshold); }
private bool AreGoodCandidates(FeatureCurve firstCurve, FeatureCurve secondCurve) { bool angleCondition = IsAngleBelowThreshold(firstCurve, secondCurve); return(angleCondition); }
private bool TryFindSingleFeatureCurveOnSphere(FeatureCurve[] selectedElements, out CircleFeatureCurve onSphere, out FeatureCurve other) { onSphere = selectedElements.OfType <CircleFeatureCurve>().FirstOrDefault(IsOwnedBySphere); other = selectedElements.Where(x => !IsOwnedBySphere(x)).FirstOrDefault(); return(other != null && onSphere != null); }