[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2095] trunk/py/scripts/addons/modules/ curve_utils.py: move curve intersection into a function
Campbell Barton
ideasman42 at gmail.com
Tue Jul 5 20:10:06 CEST 2011
Revision: 2095
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2095
Author: campbellbarton
Date: 2011-07-05 18:10:06 +0000 (Tue, 05 Jul 2011)
Log Message:
-----------
move curve intersection into a function
Modified Paths:
--------------
trunk/py/scripts/addons/modules/curve_utils.py
Modified: trunk/py/scripts/addons/modules/curve_utils.py
===================================================================
--- trunk/py/scripts/addons/modules/curve_utils.py 2011-07-05 17:54:10 UTC (rev 2094)
+++ trunk/py/scripts/addons/modules/curve_utils.py 2011-07-05 18:10:06 UTC (rev 2095)
@@ -397,6 +397,57 @@
self.calc_all()
# raise Exception("END")
+ def intersect_line(self, l1, l2, reverse=False):
+
+ from mathutils.geometry import (intersect_point_line,
+ )
+
+ if reverse:
+ p_first = self.points[-1]
+ point_iter = reversed(self.points[:-1])
+ else:
+ p_first = self.points[0]
+ point_iter = self.points[1:]
+
+ side = (line_point_side_v2(l1, l2, p_first.co) < 0.0)
+ ok = False
+ for p_apex in point_iter:
+ if (line_point_side_v2(l1,
+ l2,
+ p_apex.co,
+ ) < 0.0) != side:
+
+ if reverse:
+ p_apex_other = p_apex.next
+ else:
+ p_apex_other = p_apex.prev
+
+ # find the exact point on the line between the apex and
+ # the middle
+ p_test_1 = intersect_point_line(p_apex.co,
+ l1,
+ l2)[0].xy
+ p_test_2 = intersect_point_line(p_apex_other.co,
+ l1,
+ l2)[0].xy
+
+ w1 = (p_test_1 - p_apex.co).length
+ w2 = (p_test_2 - p_apex_other.co).length
+ fac = w1 / (w1 + w2)
+
+ p_apex_co = p_apex.co.lerp(p_apex_other.co, fac)
+ p_apex_no = p_apex.no.lerp(p_apex_other.no, fac)
+ p_apex_no.normalize()
+
+ # visualize_line(p_mid.to_3d(), corner.to_3d())
+ # visualize_line(p_apex.co.to_3d(), p_apex_co.to_3d())
+
+ ok = True
+ break
+
+ return p_apex_co, p_apex_no
+
+
def bezier_solve(self):
""" Calculate bezier handles,
assume the splines have been broken up.
@@ -412,6 +463,7 @@
p1 = self.points[0]
p2 = self.points[-1]
+
# since we have even spacing we can just pick the middle point
# p_mid = self.points[len(self.points) // 2]
@@ -444,39 +496,9 @@
p_best = None
side = (line_point_side_v2(p_mid, corner, p1.co) < 0.0)
ok = False
- for p_apex in self.points:
- if (line_point_side_v2(p_mid,
- corner,
- p_apex.co,
- ) < 0.0) != side:
+
+ p_apex_co, p_apex_no = self.intersect_line(p_mid, corner)
- # find the exact point on the line between the apex and
- # the middle
- p_test_1 = intersect_point_line(p_apex.co,
- p_mid,
- corner)[0].xy
- p_test_2 = intersect_point_line(p_apex.prev.co,
- p_mid,
- corner)[0].xy
-
- w1 = (p_test_1 - p_apex.co).length
- w2 = (p_test_2 - p_apex.prev.co).length
- fac = w1 / (w1 + w2)
-
- p_apex_co = p_apex.co.lerp(p_apex.prev.co, fac)
- p_apex_no = p_apex.no.lerp(p_apex.prev.no, fac)
- p_apex_no.normalize()
-
- # visualize_line(p_mid.to_3d(), corner.to_3d())
- # visualize_line(p_apex.co.to_3d(), p_apex_co.to_3d())
-
- ok = True
- break
-
- del p_apex, w1, w2, fac, p_test_1, p_test_2
-
- assert(ok == True)
-
v1 = (p2.co - p1.co).normalized()
v2 = p_apex_no.copy()
More information about the Bf-extensions-cvs
mailing list