[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