Mercurial > traipse_dev
diff orpg/mapper/map_utils.py @ 0:4385a7d0efd1 grumpy-goblin
Deleted and repushed it with the 'grumpy-goblin' branch. I forgot a y
author | sirebral |
---|---|
date | Tue, 14 Jul 2009 16:41:58 -0500 |
parents | |
children | 072ffc1d466f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/orpg/mapper/map_utils.py Tue Jul 14 16:41:58 2009 -0500 @@ -0,0 +1,61 @@ +#------------------------------------------------ +# file: map_utils.py +# +# This file contains generic utility functions +# for use in the openrpg mapping system +# ----------------------------------------------- + +import math + +#----------------------------------------------------------------------- +# distance_between() +# Returns the distance between two points +#----------------------------------------------------------------------- +def distance_between( x1, y1, x2, y2 ): + "Returns the distance between two points" + dx = x2 - x1 + dy = y2 - y1 + return math.sqrt( dx*dx + dy*dy ) + +#----------------------------------------------------------------------- +# proximity_test() +# Tests if 'test_point' (T) is close (within 'threshold' units) to the +# line segment 'start_point' to 'end_point' (PQ). +# +# The closest point (R) to T on the line PQ is given by: +# R = P + u (Q - P) +# TR is perpendicular to PQ so: +# (T - R) dot (Q - P) = 0 +# Solving these two equations gives the equation for u (see below). +# +# If u < 0 or u > 1 then R is not within the line segment and we simply +# test against point P or Q. +#----------------------------------------------------------------------- +def proximity_test( start_point, end_point, test_point, threshold ): + "Test if a point is close to a line segment" + x1,y1 = start_point + x2,y2 = end_point + xt,yt = test_point + x1 = float(x1) + x2 = float(x2) + y1 = float(y1) + y2 = float(y2) + xt = float(xt) + yt = float(yt) + + # Coincident points? + if x1 == x2 and y1 == y2: + d = distance_between(xt, yt, x1, y1) + else: + dx = x2 - x1 + dy = y2 - y1 + u = ((xt - x1) * dx + (yt - y1) * dy) / (dx*dx + dy*dy) + if u < 0: + d = distance_between(xt, yt, x1, y1) + elif u > 1: + d = distance_between(xt, yt, x2, y2) + else: + xr = x1 + u * dx + yr = y1 + u * dy + d = distance_between(xt, yt, xr, yr) + return d <= threshold