Class: Mageo::Tetrahedron

Inherits:
Object
  • Object
show all
Defined in:
lib/mageo/tetrahedron.rb

Overview

直交座標系 3次元空間内の四面体を表現するクラス。

class Mageo::Tetrahedron < Mageo::Polyhedron

Defined Under Namespace

Classes: InitializeError, NotImplementError, TypeError

Constant Summary collapse

VERTEX_INDICES_OF_TRIANGLES =
[ [ 0, 1, 2 ], [ 1, 2, 3 ], [ 2, 3, 0 ], [ 3, 0, 1 ] ]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(v0, v1, v2, v3) ⇒ Tetrahedron

v0, v1, v2, v3 are 四面体の頂点

Raises:



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/mageo/tetrahedron.rb', line 99

def initialize( v0, v1, v2, v3 )
  #raise InitializeError if vertices.class != Array
  #raise InitializeError if vertices.size != 4
  #vertices.each do |vertex|
  #  raise InitializeError if vertex.size != 3
  #  raise InitializeError unless vertex.methods.include?( :[] )
  #  raise InitializeError unless vertex.methods.include?( :map )
  #end
  #@vertices = vertices.map { |vertex| vertex.to_v3d }
  vertices = [v0, v1, v2, v3]
  vertices.each do |vertex|
    raise InitializeError if vertex.class == Mageo::Vector3DInternal
  end

  @vertices = vertices.map {|v| v.to_v3d}

  raise InitializeError, "volume is zero." if volume == 0.0
end

Instance Attribute Details

#verticesObject (readonly)

Returns the value of attribute vertices.



14
15
16
# File 'lib/mageo/tetrahedron.rb', line 14

def vertices
  @vertices
end

Instance Method Details

#centerObject

各頂点の座標の平均値を返す。



60
61
62
63
64
65
66
# File 'lib/mageo/tetrahedron.rb', line 60

def center
  tmp = Mageo::Vector3D[ 0.0, 0.0, 0.0 ]
  @vertices.each do |vertex|
    tmp += vertex
  end
  return tmp * ( 1.0 / @vertices.size.to_f ) # 座標の平均の算出
end

#edgesObject



19
20
21
22
23
24
25
26
27
# File 'lib/mageo/tetrahedron.rb', line 19

def edges
  results = []
  triangles.each do |triangle|
    triangle.edges.each do |edge|
      results << edge unless results.include_eql?(edge)
    end
  end
  return results
end

#include?(pos, tolerance = 0.0) ⇒ Boolean

Returns:

  • (Boolean)

Raises:



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/mageo/tetrahedron.rb', line 47

def include?(pos, tolerance = 0.0)
  raise TypeError if pos.class == Mageo::Vector3DInternal

  return true if inside?( pos )
  triangles.each do |triangle|
    #pp pos
    #pp triangle
    return true if triangle.include?(pos.to_v3d, tolerance)
  end
  return false
end

#inside?(pos) ⇒ Boolean

面で囲まれた空間の中にあれば true を返す。

Returns:

  • (Boolean)

Raises:



37
38
39
40
41
42
43
44
45
# File 'lib/mageo/tetrahedron.rb', line 37

def inside?( pos )
  raise TypeError if pos.class == Mageo::Vector3DInternal

  result = true
  triangles.each do |triangle|
    result = false unless triangle.same_side?( center, pos.to_v3d )
  end
  return result
end

#shared_vertices(other, tolerance = 0.0) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/mageo/tetrahedron.rb', line 80

def shared_vertices(other, tolerance = 0.0)
  results = []
  @vertices.each do |sv|
    flag = false
    other.vertices.each do |ov|
      flag = true if (ov - sv).r <= tolerance
    end
    results << sv if flag
  end
  results
end

#translate(vector) ⇒ Object



74
75
76
77
78
# File 'lib/mageo/tetrahedron.rb', line 74

def translate(vector)
  result = Marshal.load(Marshal.dump(self))
  result.translate! vector
  result
end

#translate!(vector) ⇒ Object



68
69
70
71
72
# File 'lib/mageo/tetrahedron.rb', line 68

def translate!(vector)
  @vertices.map! do |pos|
    pos + vector
  end
end

#trianglesObject



29
30
31
32
33
34
# File 'lib/mageo/tetrahedron.rb', line 29

def triangles
  results = VERTEX_INDICES_OF_TRIANGLES.map do |indices|
    Mageo::Triangle.new( *(indices.map{|i| @vertices[i] }) )
  end
  return results
end

#volumeObject

体積を返す



119
120
121
122
123
124
125
126
127
128
# File 'lib/mageo/tetrahedron.rb', line 119

def volume
  result = 0.0
  [ [ 0, 1, 2 ], [ 1, 2, 3 ], [ 2, 3, 0 ], [ 3, 0, 1 ] ].each do |tri_vertices|
    vectors =  tri_vertices.map { |i| @vertices[i] - center }
    volume = Mageo::Vector3D.scalar_triple_product( *vectors ).abs
    volume /= 6.0
    result += volume
  end
  return result
end