class Mittsu::Triangle

Attributes

a[RW]
b[RW]
c[RW]

Public Class Methods

barycoord_from_point(point, a, b, c, target = Mittsu::Vector3.new) click to toggle source

static/instance method to calculate barycoordinates based on: www.blackpawn.com/texts/pointinpoly/default.html

# File lib/mittsu/math/triangle.rb, line 82
def self.barycoord_from_point(point, a, b, c, target = Mittsu::Vector3.new)
  v0 = Mittsu::Vector3.new
  v1 = Mittsu::Vector3.new
  v2 = Mittsu::Vector3.new

  v0.sub_vectors(c, a)
  v1.sub_vectors(b, a)
  v2.sub_vectors(point, a)

  dot00 = v0.dot(v0)
  dot01 = v0.dot(v1)
  dot02 = v0.dot(v2)
  dot11 = v1.dot(v1)
  dot12 = v1.dot(v2)

  denom = dot00 * dot11 - dot01 * dot01

  # colinear or singular triangle
  if denom.zero?
    # arbitrary location outside of triangle?
    # not sure if this is the best idea, maybe should be returning undefined
    return target.set(-2.0, -1.0, -1.0)
  end

  inv_denom = 1.0 / denom
  u = (dot11 * dot02 - dot01 * dot12) * inv_denom
  v = (dot00 * dot12 - dot01 * dot02) * inv_denom

  target.set(1.0 - u - v, v, u)
end
contains_point?(point, a, b, c) click to toggle source
# File lib/mittsu/math/triangle.rb, line 113
def self.contains_point?(point, a, b, c)
  v1 = Mittsu::Vector3.new
  result = Mittsu::Triangle.barycoord_from_point(point, a, b, c, v1)
  result.x >= 0 && result.y >= 0 && result.x + result.y <= 1
end
new(a = Mittsu::Vector3.new, b = Mittsu::Vector3.new, c = Mittsu::Vector3.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 5
def initialize(a = Mittsu::Vector3.new, b = Mittsu::Vector3.new, c = Mittsu::Vector3.new)
  @a, @b, @c = a, b, c
end
normal(a, b, c, target = Mittsu::Vector3.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 66
def self.normal(a, b, c, target = Mittsu::Vector3.new)
  v0 = Mittsu::Vector3.new
  target.sub_vectors(c, b)
  v0.sub_vectors(a, b)
  target.cross(v0)

  result_length_sq = target.length_sq
  if (result_length_sq > 0)
    target.multiply_scalar(1.0 / ::Math.sqrt(result_length_sq))
  else
    target.set(0.0, 0.0, 0.0)
  end
end

Public Instance Methods

area() click to toggle source
# File lib/mittsu/math/triangle.rb, line 30
def area
  v0 = Mittsu::Vector3.new
  v1 = Mittsu::Vector3.new
  v0.sub_vectors(@c, @b)
  v1.sub_vectors(@a, @b)
  v0.cross(v1).length * 0.5
end
barycoord_from_point(point, target = Mittsu::Vector3.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 50
def barycoord_from_point(point, target = Mittsu::Vector3.new)
  Mittsu::Triangle.barycoord_from_point(point, @a, @b, @c, target)
end
clone() click to toggle source
# File lib/mittsu/math/triangle.rb, line 62
def clone
  Mittsu::Triangle.new.copy(self)
end
contains_point?(point) click to toggle source
# File lib/mittsu/math/triangle.rb, line 54
def contains_point?(point)
  Mittsu::Triangle.contains_point?(point, @a, @b, @c)
end
copy(triangle) click to toggle source
# File lib/mittsu/math/triangle.rb, line 23
def copy(triangle)
  @a.copy(triangle.a)
  @b.copy(triangle.b)
  @c.copy(triangle.c)
  self
end
equals(triangle) click to toggle source
# File lib/mittsu/math/triangle.rb, line 58
def equals(triangle)
  triangle.a.equals(@a) && triangle.b.equals(@b) && triangle.c.equals(@c)
end
midpoint(target = Mittsu::Vector3.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 38
def midpoint(target = Mittsu::Vector3.new)
  target.add_vectors(@a, @b).add(@c).multiply_scalar(1.0 / 3.0)
end
normal(target = Mittsu::Vector3.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 42
def normal(target = Mittsu::Vector3.new)
  Mittsu::Triangle.normal(@a, @b, @c, target)
end
plane(target = Mittsu::Plane.new) click to toggle source
# File lib/mittsu/math/triangle.rb, line 46
def plane(target = Mittsu::Plane.new)
  target.set_from_coplanar_points(@a, @b, @c)
end
set(a, b, c) click to toggle source
# File lib/mittsu/math/triangle.rb, line 9
def set(a, b, c)
  @a.copy(a)
  @b.copy(b)
  @c.copy(c)
  self
end
set_from_points_and_indices(points, i0, i1, i2) click to toggle source
# File lib/mittsu/math/triangle.rb, line 16
def set_from_points_and_indices(points, i0, i1, i2)
  @a.copy(points[i0])
  @b.copy(points[i1])
  @c.copy(points[i2])
  self
end