def boundingbox(self, start, end, divid): step = (end - start) / divid cuts = [ point_on_vector(self.a, self.b, self.c, self.d, start + t * step) for t in range(divid + 1) ] return get_boundingbox(cuts)
def get_verts_body(spline,ssegs,scale): verts = [] for index in range(len(spline.bezier_points)): a,b,c,d = spline.get_segment(index) for j in range(ssegs): t = (1/ssegs)*j newvert = point_on_vector(a,b,c,d,t) verts.append(newvert*scale) return verts
def get_inout_segments(me, targ): inner,outer = [],[] for index in range(len(me.bezier_points)): a,b,c,d = me.get_segment(index) p = point_on_vector(a, b, c, d, 0.5) if is_point_in_spline(p, targ): inner.append(index) else: outer.append(index) return inner,outer
def get_verts_pipe(spline,ssegs,scale): verts = [] if spline.use_cyclic_u: for index in range(len(spline.bezier_points)): a,b,c,d = spline.get_segment(index) for j in range(ssegs): t = (1/ssegs)*j newvert = point_on_vector(a,b,c,d,t) verts.append(newvert*scale) else: for index in range(len(spline.bezier_points)-1): a,b,c,d = spline.get_segment(index) for j in range(ssegs): t = (1/ssegs)*j newvert = point_on_vector(a,b,c,d,t) verts.append(newvert*scale) if index == len(spline.bezier_points)-2: verts.append(d*scale) return verts
def get_length(self, steps=100): points = [self.a] s = 1 / steps for i in range(1, steps + 1): t = i * s p = point_on_vector(self.a, self.b, self.c, self.d, t) points.append(p) lenght = 0 for i in range(len(points) - 1): lenght += get_distance(points[i], points[i - 1]) return lenght
def get_point_on_spline(self, time): # if time == 1: # return self.bezier_points[-1].co # lengthes, full_length = [], 0 # for seg in self.get_as_segments(): # length = self.get_segment_length(seg.index, steps=25) # lengthes.append(length) # full_length += length # length = full_length * time # index = 0 # for i in range(0, len(lengthes)): # if length < lengthes[i]: # index = i # break # else: # length -= lengthes[i] # time_on_segment = length / lengthes[index] # return self.get_point_on_segment(index, time_on_segment) lengths, total_length = [], 0 if time <= 0: return self.bezier_points[0].co.copy() if time >= 1: return self.bezier_points[-1].co.copy() else: segs = [point for point in self.bezier_points] if self.use_cyclic_u: segs.append(self.bezier_points[0]) # collect the segment length for i in range(len(segs) - 1): a = segs[i].co b = segs[i].handle_right c = segs[i + 1].handle_left d = segs[i + 1].co l = get_segment_length(a, b, c, d, 100) lengths.append(l) total_length += l length = total_length * time for i in range(len(lengths)): if length >= lengths[i]: length -= lengths[i] else: index = i break a = segs[index].co b = segs[index].handle_right c = segs[index + 1].handle_left d = segs[index + 1].co t = length / lengths[index] return point_on_vector(a, b, c, d, t)
def get_segment_length(self, index, steps=100): if index <= len(self.bezier_points)-2: a,b,c,d = self.get_segment(index) points = [a] s = 1 / steps for i in range(1, steps + 1): t = i * s p = point_on_vector(a, b, c, d, t) points.append(p) lenght = 0 for i in range(len(points) - 1): lenght += get_distance(points[i], points[i - 1]) return lenght #bpy.context.active_object.data.splines[0].calc_length() return 0
def get_section_line(self, start, end): a = point_on_vector(self.a,self.b,self.c,self.d,start) b = point_on_vector(self.a,self.b,self.c,self.d,end) return Line(a,b)