SourceForge logo
SourceForge logo
Menu

matplotlib-checkins

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 (2010年9月27日)
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.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /