Class: Mageo::Tetrahedron
- Inherits:
-
Object
- Object
- Mageo::Tetrahedron
- 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
-
#vertices ⇒ Object
readonly
Returns the value of attribute vertices.
Instance Method Summary collapse
-
#center ⇒ Object
各頂点の座標の平均値を返す。.
- #edges ⇒ Object
- #include?(pos, tolerance = 0.0) ⇒ Boolean
-
#initialize(v0, v1, v2, v3) ⇒ Tetrahedron
constructor
v0, v1, v2, v3 are 四面体の頂点.
-
#inside?(pos) ⇒ Boolean
面で囲まれた空間の中にあれば true を返す。.
- #shared_vertices(other, tolerance = 0.0) ⇒ Object
- #translate(vector) ⇒ Object
- #translate!(vector) ⇒ Object
- #triangles ⇒ Object
-
#volume ⇒ Object
体積を返す.
Constructor Details
#initialize(v0, v1, v2, v3) ⇒ Tetrahedron
v0, v1, v2, v3 are 四面体の頂点
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
#vertices ⇒ Object (readonly)
Returns the value of attribute vertices.
14 15 16 |
# File 'lib/mageo/tetrahedron.rb', line 14 def vertices @vertices end |
Instance Method Details
#center ⇒ Object
各頂点の座標の平均値を返す。
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 |
#edges ⇒ Object
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
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 を返す。
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 |
#triangles ⇒ Object
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 |
#volume ⇒ Object
体積を返す
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 |