diff --git a/modules/curve_utils.py b/modules/curve_utils.py index 5fb3c3d44923866d09a017779afbb75487b980c3..ce742862e99ea295bb07ecf56dd42ad119fe8362 100644 --- a/modules/curve_utils.py +++ b/modules/curve_utils.py @@ -20,11 +20,6 @@ import bpy -def line_point_side_v2(l1, l2, pt): - return (((l1[0] - pt[0]) * (l2[1] - pt[1])) - - ((l2[0] - pt[0]) * (l1[1] - pt[1]))) - - def vis_curve_object(): scene = bpy.data.scenes[0] # weak! cu = bpy.data.curves.new(name="Line", type='CURVE') @@ -370,24 +365,32 @@ def points_to_bezier(points_orig, # raise Exception("END") def intersect_line(self, l1, l2, reverse=False): + """ Spectial kind of intersection, works in 3d on the plane + defimed by the points normal and the line. + """ from mathutils.geometry import (intersect_point_line, ) if reverse: - p_first = self.points[-2] + p_first = self.points[-1] + no = -self.points[-1].no point_iter = reversed(self.points[:-1]) else: - p_first = self.points[1] + p_first = self.points[0] + no = self.points[0].no point_iter = self.points[1:] - side = (line_point_side_v2(l1, l2, p_first.co) < 0.0) - ok = False + # calculate the line right angles to the line + bi_no = (no - no.project(l2 - l1)).normalized() + + bi_l1 = p_first.co + bi_l2 = p_first.co + bi_no + for p_apex in point_iter: - if (line_point_side_v2(l1, - l2, - p_apex.co, - ) < 0.0) != side: + ix, fac = intersect_point_line(p_apex.co, bi_l1, bi_l2) + + if fac < 0.0001: if reverse: p_apex_other = p_apex.next @@ -407,12 +410,12 @@ def points_to_bezier(points_orig, w2 = (p_test_2 - p_apex_other.co).length #assert(w1 + w2 != 0) - #try: - fac = w1 / (w1 + w2) - #except ZeroDivisionError: - # fac = 0.5 + try: + fac = w1 / (w1 + w2) + except ZeroDivisionError: + fac = 0.5 assert(fac >= 0.0 and fac <= 1.0) - + 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()