[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2098] trunk/py/scripts/addons/modules/ curve_utils.py: replace logic in spline intersection which depends on 2D side-of function
Campbell Barton
ideasman42 at gmail.com
Wed Jul 6 10:36:04 CEST 2011
Revision: 2098
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2098
Author: campbellbarton
Date: 2011-07-06 08:36:04 +0000 (Wed, 06 Jul 2011)
Log Message:
-----------
replace logic in spline intersection which depends on 2D side-of 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-06 06:46:37 UTC (rev 2097)
+++ trunk/py/scripts/addons/modules/curve_utils.py 2011-07-06 08:36:04 UTC (rev 2098)
@@ -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 @@
# 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 @@
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()
More information about the Bf-extensions-cvs
mailing list