diff --git a/src/m_fixed.c b/src/m_fixed.c
index eb10fd5f801825dc82462d67de67110b65edf285..09d6936f2e0988978143f78bfc59824f58176630 100644
--- a/src/m_fixed.c
+++ b/src/m_fixed.c
@@ -18,8 +18,10 @@
  #define HAVE_SQRTF
  #endif
 #endif
+
 #include "doomdef.h"
 #include "m_fixed.h"
+#include "tables.h" // ANGLETOFINESHIFT
 
 #ifdef __USE_C_FIXEDMUL__
 
@@ -105,20 +107,34 @@ fixed_t FixedSqrt(fixed_t x)
 
 fixed_t FixedHypot(fixed_t x, fixed_t y)
 {
-	fixed_t ax, yx, yx2, yx1;
-	if (abs(y) > abs(x)) // |y|>|x|
-	{
-		ax = abs(y); // |y| => ax
-		yx = FixedDiv(x, y); // (x/y)
-	}
-	else // |x|>|y|
+	// Moved the code from R_PointToDist2 to here,
+	// since R_PointToDist2 did the same thing,
+	// except less prone to overflowing.
+
+	angle_t angle;
+	fixed_t dist;
+
+	x = abs(x);
+	y = abs(y);
+
+	if (y > x)
 	{
-		ax = abs(x); // |x| => ax
-		yx = FixedDiv(y, x); // (x/y)
+		fixed_t temp;
+
+		temp = x;
+		x = y;
+		y = temp;
 	}
-	yx2 = FixedMul(yx, yx); // (x/y)^2
-	yx1 = FixedSqrt(1 * FRACUNIT + yx2); // (1 + (x/y)^2)^1/2
-	return FixedMul(ax, yx1); // |x|*((1 + (x/y)^2)^1/2)
+
+	if (!y)
+		return x;
+
+	angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
+
+	// use as cosine
+	dist = FixedDiv(x, FINESINE(angle));
+
+	return dist;
 }
 
 vector2_t *FV2_Load(vector2_t *vec, fixed_t x, fixed_t y)
diff --git a/src/r_main.c b/src/r_main.c
index f82fb589e03bb58f50b04dffd1c10779fda7dc25..f6c05e312a1619615f0c8fbbd7271739d0b07488 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -357,29 +357,7 @@ angle_t R_PointToAngle2(fixed_t pviewx, fixed_t pviewy, fixed_t x, fixed_t y)
 
 fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1)
 {
-	angle_t angle;
-	fixed_t dx, dy, dist;
-
-	dx = abs(px1 - px2);
-	dy = abs(py1 - py2);
-
-	if (dy > dx)
-	{
-		fixed_t temp;
-
-		temp = dx;
-		dx = dy;
-		dy = temp;
-	}
-	if (!dy)
-		return dx;
-
-	angle = (tantoangle[FixedDiv(dy, dx)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
-
-	// use as cosine
-	dist = FixedDiv(dx, FINESINE(angle));
-
-	return dist;
+	return FixedHypot(px1 - px2, py1 - py2);
 }
 
 // Little extra utility. Works in the same way as R_PointToAngle2