Class: Mittsu::Triangle

Inherits:
Object
  • Object
show all
Defined in:
lib/mittsu/math/triangle.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(a = Mittsu::Vector3.new, b = Mittsu::Vector3.new, c = Mittsu::Vector3.new) ⇒ Triangle

Returns a new instance of Triangle.



7
8
9
# File 'lib/mittsu/math/triangle.rb', line 7

def initialize(a = Mittsu::Vector3.new, b = Mittsu::Vector3.new, c = Mittsu::Vector3.new)
  @a, @b, @c = a, b, c
end

Instance Attribute Details

#aObject

Returns the value of attribute a.



5
6
7
# File 'lib/mittsu/math/triangle.rb', line 5

def a
  @a
end

#bObject

Returns the value of attribute b.



5
6
7
# File 'lib/mittsu/math/triangle.rb', line 5

def b
  @b
end

#cObject

Returns the value of attribute c.



5
6
7
# File 'lib/mittsu/math/triangle.rb', line 5

def c
  @c
end

Class Method Details

.barycoord_from_point(point, a, b, c, target = Mittsu::Vector3.new) ⇒ Object

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



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/mittsu/math/triangle.rb', line 84

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) ⇒ Boolean

Returns:

  • (Boolean)


115
116
117
118
119
# File 'lib/mittsu/math/triangle.rb', line 115

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

.normal(a, b, c, target = Mittsu::Vector3.new) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/mittsu/math/triangle.rb', line 68

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

Instance Method Details

#areaObject



32
33
34
35
36
37
38
# File 'lib/mittsu/math/triangle.rb', line 32

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) ⇒ Object



52
53
54
# File 'lib/mittsu/math/triangle.rb', line 52

def barycoord_from_point(point, target = Mittsu::Vector3.new)
  Mittsu::Triangle.barycoord_from_point(point, @a, @b, @c, target)
end

#cloneObject



64
65
66
# File 'lib/mittsu/math/triangle.rb', line 64

def clone
  Mittsu::Triangle.new.copy(self)
end

#contains_point?(point) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/mittsu/math/triangle.rb', line 56

def contains_point?(point)
  Mittsu::Triangle.contains_point?(point, @a, @b, @c)
end

#copy(triangle) ⇒ Object



25
26
27
28
29
30
# File 'lib/mittsu/math/triangle.rb', line 25

def copy(triangle)
  @a.copy(triangle.a)
  @b.copy(triangle.b)
  @c.copy(triangle.c)
  self
end

#equals(triangle) ⇒ Object



60
61
62
# File 'lib/mittsu/math/triangle.rb', line 60

def equals(triangle)
  triangle.a.equals(@a) && triangle.b.equals(@b) && triangle.c.equals(@c)
end

#midpoint(target = Mittsu::Vector3.new) ⇒ Object



40
41
42
# File 'lib/mittsu/math/triangle.rb', line 40

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) ⇒ Object



44
45
46
# File 'lib/mittsu/math/triangle.rb', line 44

def normal(target = Mittsu::Vector3.new)
  Mittsu::Triangle.normal(@a, @b, @c, target)
end

#plane(target = Mittsu::Plane.new) ⇒ Object



48
49
50
# File 'lib/mittsu/math/triangle.rb', line 48

def plane(target = Mittsu::Plane.new)
  target.set_from_coplanar_points(@a, @b, @c)
end

#set(a, b, c) ⇒ Object



11
12
13
14
15
16
# File 'lib/mittsu/math/triangle.rb', line 11

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) ⇒ Object



18
19
20
21
22
23
# File 'lib/mittsu/math/triangle.rb', line 18

def set_from_points_and_indices(points, i0, i1, i2)
  @a.copy(points[i0])
  @b.copy(points[i1])
  @c.copy(points[i2])
  self
end