On 4/10/07, John Hunter <[EMAIL PROTECTED]> wrote:
On 4/9/07, Tim Leslie <[EMAIL PROTECTED]> wrote:
>
> The other is a speedup, normalising an entire array at once, rather
> than element by element, speeding up the attached script by a factor
> of 6x (and upgrading my actual application from 'too slow' to 'quite
> reasonable' :-)
Thanks Tim, I just committed this. I see that my sinister plan of
releasing the 3d stuff w/o support in hopes of reeling in contributers
is starting to work....
<laughs maniacally>
Here's another patch. This one cleans up the line2d_seg_dist function
and also speeds it up by a factor of ~2.
Cheers,
Tim
Index: proj3d.py
===================================================================
--- proj3d.py (revision 3198)
+++ proj3d.py (working copy)
@@ -51,52 +51,28 @@
x0,y0 = p
return abs((a*x0 + b*y0 + c)/nx.sqrt(a**2+b**2))
-def dist2d(p0,p1):
- """distance between two points"""
- try:
- p = p0-p1
- return nx.sqrt(sum(p**2))
- except ValueError:
- print p0,p1
- raise
-def line2d_seg_dist(p0,p1, p):
- """distance(s) from line defined by p0 - p1 to point(s) p
+def line2d_seg_dist(p1,p2, p0):
+ """distance(s) from line defined by p1 - p2 to point(s) p0
- p[0] = x(s)
- p[1] = y(s)
+ p0[0] = x(s)
+ p0[1] = y(s)
- intersection point p = p0 + u*(p1-p0)
+ intersection point p = p1 + u*(p2-p1)
and intersection point lies within segement if u is between 0 and 1
"""
-
- p,p0,p1 = map(nx.asarray,(p[:2],p0[:2],p1[:2]))
- x,y = p
- x0,y0 = p0
- x1,y1 = p1
- #
- u = ((x-x0)*(x1-x0)+(y-y0)*(y1-y0))/(dist2d(p0,p1)*dist2d(p0,p1))
- #
- def dist(p,p0,p1,u):
- if u > 0 and u < 1:
- pi = p0 + u*(p1-p0)
- return dist2d(p,pi)
- else:
- return nx.minimum(dist2d(p,p0),dist2d(p,p1))
-
- if not iterable(u):
- return dist(p,p0,p1,u)
- else:
- # for each point calculate dist
- pt = nx.transpose(p)
- return nx.array([dist(pe,p0,p1,ue) for pe,ue in zip(pt,u)])
-def iterable(v):
- try:
- len(v)
- return True
- except TypeError:
- return False
+ x21 = p2[0] - p1[0]
+ y21 = p2[1] - p1[1]
+ x01 = nx.asarray(p0[0]) - p1[0]
+ y01 = nx.asarray(p0[1]) - p1[1]
+
+ u = (x01*x21 + y01*y21)/float(abs(x21**2 + y21**2))
+ u = nx.clip(u, 0, 1)
+ d = nx.sqrt((x01 - u*x21)**2 + (y01 - u*y21)**2)
+
+ return d
+
def test_lines_dists():
ax = pylab.gca()
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Matplotlib-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel