class StraightSkeleton::Split
def initialize(nodes, point, travel, source, node)
def initialize(nodes, point, travel, source, node) @original, @nodes, @point, @travel, @source, @normal = self, nodes, point, travel, source, node.normals[1] end
def replace!(&block)
def replace!(&block) dup.split!(0, &block) dup.split!(1, &block) block.call @source end
def split!(index, &block)
def split!(index, &block) @neighbours = [@source.neighbours[index], @edge[1-index]].rotate index @neighbours.inject(&:equal?) ? block.call(prev, prev.is_a?(Collapse) ? 1 : 0) : insert! if @neighbours.any? end
def viable?
def viable? return false unless @source.active? @edge = @nodes.track(@normal).find do |edge| (n00, n01), (n10, n11) = edge.map(&:normals) p0, p1 = edge.map(&:point) next if (point - p0).cross(n00 ? n00 + n01 : n01) < 0 next if (point - p1).cross(n11 ? n11 + n10 : n10) > 0 true end end