|
From: <lee...@us...> - 2010-09-27 01:30:25
|
Revision: 8720
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8720&view=rev
Author: leejjoon
Date: 2010-09-27 01:30:19 +0000 (Mon, 27 Sep 2010)
Log Message:
-----------
fix bezier.get_parallerls to handle parallel input lines
Modified Paths:
--------------
branches/v1_0_maint/lib/matplotlib/bezier.py
Modified: branches/v1_0_maint/lib/matplotlib/bezier.py
===================================================================
--- branches/v1_0_maint/lib/matplotlib/bezier.py 2010-09-24 01:49:13 UTC (rev 8719)
+++ branches/v1_0_maint/lib/matplotlib/bezier.py 2010-09-27 01:30:19 UTC (rev 8720)
@@ -9,6 +9,7 @@
from matplotlib.path import Path
from operator import xor
+import warnings
# some functions
@@ -323,7 +324,23 @@
d = (dx*dx + dy*dy)**.5
return dx/d, dy/d
+def check_if_parallel(dx1, dy1, dx2, dy2, tolerence=1.e-5):
+ """ returns
+ * 1 if two lines are parralel in same direction
+ * -1 if two lines are parralel in opposite direction
+ * 0 otherwise
+ """
+ theta1 = np.arctan2(dx1, dy1)
+ theta2 = np.arctan2(dx2, dy2)
+ dtheta = np.abs(theta1 - theta2)
+ if dtheta < tolerence:
+ return 1
+ elif np.abs(dtheta - np.pi) < tolerence:
+ return -1
+ else:
+ return False
+
def get_parallels(bezier2, width):
"""
Given the quadraitc bezier control points *bezier2*, returns
@@ -338,11 +355,19 @@
cmx, cmy = bezier2[1]
c2x, c2y = bezier2[2]
- # t1 and t2 is the anlge between c1 and cm, cm, c2.
- # They are also a angle of the tangential line of the path at c1 and c2
- cos_t1, sin_t1 = get_cos_sin(c1x, c1y, cmx, cmy)
- cos_t2, sin_t2 = get_cos_sin(cmx, cmy, c2x, c2y)
+ parallel_test = check_if_parallel(c1x-cmx, c1y-cmy, cmx-c2x, cmy-c2y)
+ if parallel_test == -1:
+ warnings.warn("Lines do not intersect. A straight line is used instead.")
+ #cmx, cmy = 0.5*(c1x+c2x), 0.5*(c1y+c2y)
+ cos_t1, sin_t1 = get_cos_sin(c1x, c1y, c2x, c2y)
+ cos_t2, sin_t2 = cos_t1, sin_t1
+ else:
+ # t1 and t2 is the anlge between c1 and cm, cm, c2. They are
+ # also a angle of the tangential line of the path at c1 and c2
+ cos_t1, sin_t1 = get_cos_sin(c1x, c1y, cmx, cmy)
+ cos_t2, sin_t2 = get_cos_sin(cmx, cmy, c2x, c2y)
+
# find c1_left, c1_right which are located along the lines
# throught c1 and perpendicular to the tangential lines of the
# bezier path at a distance of width. Same thing for c2_left and
@@ -355,11 +380,21 @@
# find cm_left which is the intersectng point of a line through
# c1_left with angle t1 and a line throught c2_left with angle
# t2. Same with cm_right.
- cmx_left, cmy_left = get_intersection(c1x_left, c1y_left, cos_t1, sin_t1,
- c2x_left, c2y_left, cos_t2, sin_t2)
+ if parallel_test != 0:
+ # a special case for a straight line, i.e., angle between two
+ # lines are smaller than some (arbitrtay) value.
+ cmx_left, cmy_left = \
+ 0.5*(c1x_left+c2x_left), 0.5*(c1y_left+c2y_left)
+ cmx_right, cmy_right = \
+ 0.5*(c1x_right+c2x_right), 0.5*(c1y_right+c2y_right)
+ else:
+ cmx_left, cmy_left = \
+ get_intersection(c1x_left, c1y_left, cos_t1, sin_t1,
+ c2x_left, c2y_left, cos_t2, sin_t2)
- cmx_right, cmy_right = get_intersection(c1x_right, c1y_right, cos_t1, sin_t1,
- c2x_right, c2y_right, cos_t2, sin_t2)
+ cmx_right, cmy_right = \
+ get_intersection(c1x_right, c1y_right, cos_t1, sin_t1,
+ c2x_right, c2y_right, cos_t2, sin_t2)
# the parralel bezier lines are created with control points of
# [c1_left, cm_left, c2_left] and [c1_right, cm_right, c2_right]
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|