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