lib/mageo/triangle.rb in mageo-0.0.1 vs lib/mageo/triangle.rb in mageo-0.0.2
- old
+ new
@@ -1,34 +1,29 @@
#! /usr/bin/env ruby
# coding: utf-8
-require "mageo/vector3d.rb"
-require "mageo/vector3dinternal.rb"
-require "mageo/axes.rb"
-require "mageo/segment.rb"
-
#3次元空間中の3角形を表現するクラス。
#
-#法線ベクトル( Vector3D クラスインスタンス )を返すメソッドは定義しない。
+#法線ベクトル( Mageo::Vector3D クラスインスタンス )を返すメソッドは定義しない。
# 法線ベクトルは2通りの方向を取りうるため。
# initialize 時に点の指定の順序を決めることで定義はできるが、
# そうすると簡潔性が損なわれる。
-class Triangle
+class Mageo::Triangle
attr_reader :vertices
class InitializeError < Exception; end
class LinearException < Exception; end
class TypeError < Exception; end
#class InPlaneError < Exception; end
class NoIntersectionError < Exception; end
#An argument 'vertices' can be Array of 3 items, Vector of 3 items,
- # or Vector3D class instance, which have [] and map methods.
+ # or Mageo::Vector3D class instance, which have [] and map methods.
#当面は Array を前提とする。
#座標が整数で入っていたとしても内部的には Float に変換して使用する。
#3点が1直線上に並んでいて三角形を囲まない場合は
- #例外 Triangle::LinearException を投げる。
+ #例外 Mageo::Triangle::LinearException を投げる。
def initialize( vertices )
raise InitializeError unless vertices.methods.include?( :size )
raise InitializeError if vertices.size != 3
vertices.each do |pos|
raise InitializeError if pos.size != 3
@@ -40,42 +35,42 @@
end
#Checking on linear.
edge1 = @vertices[1] - @vertices[0]
edge2 = @vertices[2] - @vertices[0]
- if ( Vector3D[0.0, 0.0, 0.0] == Vector3D.vector_product( edge1, edge2 ))
+ if ( Mageo::Vector3D[0.0, 0.0, 0.0] == Mageo::Vector3D.vector_product( edge1, edge2 ))
raise LinearException
end
end
#引数で与えられた 2 つの座標が、三角形の面に対して同じ側にあれば true を返す。
#どちらか、もしくは両方が、面上の点(当然頂点、辺上を含む)であれば必ず false を返す。
def same_side?( pos0, pos1 )
- raise TypeError if pos0.class != Vector3D
- raise TypeError if pos1.class != Vector3D
+ raise TypeError if pos0.class != Mageo::Vector3D
+ raise TypeError if pos1.class != Mageo::Vector3D
edge1 = @vertices[1] - @vertices[0]
edge2 = @vertices[2] - @vertices[0]
pos0 = pos0.to_v3d - @vertices[0]
pos1 = pos1.to_v3d - @vertices[0]
- triple_product_pos0 = Vector3D.scalar_triple_product( edge1, edge2, pos0 )
- triple_product_pos1 = Vector3D.scalar_triple_product( edge1, edge2, pos1 )
+ triple_product_pos0 = Mageo::Vector3D.scalar_triple_product( edge1, edge2, pos0 )
+ triple_product_pos1 = Mageo::Vector3D.scalar_triple_product( edge1, edge2, pos1 )
if triple_product_pos0 * triple_product_pos1 > 0
return true
else
return false
end
end
# 3点で張られる面上にあり、三角形の内側にあれば true を返す。
- # pos が Vector3D クラスインスタンスでなければ例外。
+ # pos が Mageo::Vector3D クラスインスタンスでなければ例外。
# ただし、面の法線方向には tolerance だけの許容値を設ける。
# 計算誤差の問題のため、これを設定しないと殆ど真とならない。
def include?(pos, tolerance)
- raise TypeError if pos.class != Vector3D
+ raise TypeError if pos.class != Mageo::Vector3D
axes = internal_axes
#一次独立チェックは initialize 時にされている筈。
pos = (pos - @vertices[0]).to_v3d
@@ -165,19 +160,19 @@
return normal
end
# 3つの頂点の座標が順不同で対応すれば真を返す。
- # other が Triangle クラス以外のインスタンスなら例外 Triangle::TypeError を投げる。
+ # other が Mageo::Triangle クラス以外のインスタンスなら例外 Triangle::TypeError を投げる。
# MEMO:
# 当初 eql? という名前を付けていたが、
# これは hash メソッドと関連があるので危険。
# よって別の名前の equivalent? というメソッド名にした。
# しかし eql? に依存したコードが残っているので当面 alias を残す。
# そのうち obsolete する。
def equivalent?(other, tolerance = 0.0)
- raise TypeError unless other.class == Triangle
+ raise TypeError unless other.class == Mageo::Triangle
vertices.each do |v_self|
if (other.vertices.find{|v_other| v_self.equal_in_delta?(v_other, tolerance) })
next
else
@@ -202,23 +197,23 @@
return true
end
def edges
results = []
- results << Segment.new(@vertices[0], @vertices[1])
- results << Segment.new(@vertices[1], @vertices[2])
- results << Segment.new(@vertices[2], @vertices[0])
+ results << Mageo::Segment.new(@vertices[0], @vertices[1])
+ results << Mageo::Segment.new(@vertices[1], @vertices[2])
+ results << Mageo::Segment.new(@vertices[2], @vertices[0])
return results
end
private
# 三角形の2辺のベクトルと、これらからなる外積ベクトル、
- # 合計3つのベクトルから Axes クラスインスタンスを作る。
+ # 合計3つのベクトルから Mageo::Axes クラスインスタンスを作る。
# vertices で取り出せる3頂点のうち、0th 要素を原点とし、
# 1st, 2nd 要素をそれぞれ順に軸としたものとする。
def internal_axes
edge1 = (@vertices[1] - @vertices[0])
edge2 = (@vertices[2] - @vertices[0])
- return Axes.new([edge1, edge2, normal_vector])
+ return Mageo::Axes.new([edge1, edge2, normal_vector])
end
end