Esempio n. 1
0
        /// <summary>
        /// Calculate the distance between the two points.
        /// </summary>
        public static Fixed PointToDist(Fixed fromX, Fixed fromY, Fixed toX, Fixed toY)
        {
            var dx = Fixed.Abs(toX - fromX);
            var dy = Fixed.Abs(toY - fromY);

            if (dy > dx)
            {
                var temp = dx;
                dx = dy;
                dy = temp;
            }

            // The code below to avoid division by zero is based on Chocolate Doom's implementation.
            Fixed frac;

            if (dx != Fixed.Zero)
            {
                frac = dy / dx;
            }
            else
            {
                frac = Fixed.Zero;
            }

            var angle = (Trig.TanToAngle((uint)frac.Data >> fracToSlopeShift) + Angle.Ang90);

            // Use as cosine.
            var dist = dx / Trig.Sin(angle);

            return(dist);
        }
Esempio n. 2
0
        /// <summary>
        /// Calculate the angle of the line passing through the two points.
        /// </summary>
        public static Angle PointToAngle(Fixed fromX, Fixed fromY, Fixed toX, Fixed toY)
        {
            var x = toX - fromX;
            var y = toY - fromY;

            if (x == Fixed.Zero && y == Fixed.Zero)
            {
                return(Angle.Ang0);
            }

            if (x >= Fixed.Zero)
            {
                // x >= 0
                if (y >= Fixed.Zero)
                {
                    // y >= 0
                    if (x > y)
                    {
                        // octant 0
                        return(Trig.TanToAngle(SlopeDiv(y, x)));
                    }
                    else
                    {
                        // octant 1
                        return(new Angle(Angle.Ang90.Data - 1) - Trig.TanToAngle(SlopeDiv(x, y)));
                    }
                }
                else
                {
                    // y < 0
                    y = -y;

                    if (x > y)
                    {
                        // octant 8
                        return(-Trig.TanToAngle(SlopeDiv(y, x)));
                    }
                    else
                    {
                        // octant 7
                        return(Angle.Ang270 + Trig.TanToAngle(SlopeDiv(x, y)));
                    }
                }
            }
            else
            {
                // x < 0
                x = -x;

                if (y >= Fixed.Zero)
                {
                    // y >= 0
                    if (x > y)
                    {
                        // octant 3
                        return(new Angle(Angle.Ang180.Data - 1) - Trig.TanToAngle(SlopeDiv(y, x)));
                    }
                    else
                    {
                        // octant 2
                        return(Angle.Ang90 + Trig.TanToAngle(SlopeDiv(x, y)));
                    }
                }
                else
                {
                    // y < 0
                    y = -y;

                    if (x > y)
                    {
                        // octant 4
                        return(Angle.Ang180 + Trig.TanToAngle(SlopeDiv(y, x)));
                    }
                    else
                    {
                        // octant 5
                        return(new Angle(Angle.Ang270.Data - 1) - Trig.TanToAngle(SlopeDiv(x, y)));
                    }
                }
            }
        }