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