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);
        }
Example #3
0
        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);
        }
Example #5
0
        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));
        }
Example #7
0
        private IEnumerable <FeatureCurve> AllCurvesOnPrimitiveOf(FeatureCurve featureCurve)
        {
            var containingPrimitive = from primitive in sessionData.SnappedPrimitives
                                      where primitive.FeatureCurves.Contains(featureCurve)
                                      select primitive;

            return(containingPrimitive.First().FeatureCurves);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
            }
        }
Example #15
0
        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);
            }
        }
Example #19
0
 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);
        }
Example #21
0
        private bool AreGoodCandidates(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve)
        {
            bool areAlmostColinear = AreAlmostColinear(firstNewCurve, secondNewCurve, existingCurve);

            return(areAlmostColinear);
        }
Example #22
0
        private bool AreCloseEnough(FeatureCurve firstNewCurve, FeatureCurve secondNewCurve, FeatureCurve existingCurve)
        {
            double proximity = ProximityMeasure(firstNewCurve, secondNewCurve, existingCurve);

            return(proximity <= proximityThreshold);
        }
Example #23
0
        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);
        }