Esempio n. 1
0
        public PointM SnapToLine(PointM pos, LineSnapDirection snapMode = LineSnapDirection.Perpendicular, bool infiniteLine = true)
        {
            var result = SnapToLine(pos.ToVector(), snapMode, infiniteLine);

            if (!result.IsEmpty)
            {
                return(PointM.FromVector(result, pos.Unit ?? P1.Unit ?? P2.Unit));
            }
            return(PointM.Empty);
        }
Esempio n. 2
0
        public Vector SnapToLine(Vector pos, LineSnapDirection snapMode = LineSnapDirection.Perpendicular, bool infiniteLine = true)
        {
            Vector result = Vector.Empty;

            if (snapMode == LineSnapDirection.Horizontal)
            {
                result = Equation.GetPointForY(pos.Y);
            }
            else if (snapMode == LineSnapDirection.Vertical)
            {
                result = Equation.GetPointForX(pos.X);
            }
            else
            {
                var perp = Line.GetPerpendicular(Equation, pos);
                Equation.Intersect(perp, out result);
            }

            if (!result.IsEmpty && !infiniteLine)
            {
                var v1 = result - P1.ToVector();
                var v2 = result - P2.ToVector();

                if (!v1.Normalized.EqualOrClose(Direction, 0.0001))
                {
                    return(snapMode == LineSnapDirection.Perpendicular ? P1.ToVector() : Vector.Empty);
                }
                else if (v1.Length > Length.NormalizedValue)
                {
                    return(snapMode == LineSnapDirection.Perpendicular ? P2.ToVector() : Vector.Empty);
                }

                if (!v2.Normalized.EqualOrClose(Direction * -1, 0.0001))
                {
                    return(snapMode == LineSnapDirection.Perpendicular ? P2.ToVector() : Vector.Empty);
                }
                else if (v2.Length > Length.NormalizedValue)
                {
                    return(snapMode == LineSnapDirection.Perpendicular ? P1.ToVector() : Vector.Empty);
                }
            }

            return(result);
        }