mageo 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +6 -0
- data/Gemfile +4 -4
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/lib/mageo.rb +20 -0
- data/lib/mageo/axes.rb +1 -3
- data/lib/mageo/cylinder.rb +4 -6
- data/lib/mageo/octahedron.rb +2 -8
- data/lib/mageo/polar2d.rb +5 -8
- data/lib/mageo/polar3d.rb +2 -5
- data/lib/mageo/polyhedron.rb +14 -14
- data/lib/mageo/segment.rb +8 -10
- data/lib/mageo/sphere.rb +2 -5
- data/lib/mageo/tetrahedron.rb +2 -7
- data/lib/mageo/triangle.rb +18 -23
- data/lib/mageo/vector.rb +3 -5
- data/lib/mageo/vector3d.rb +28 -35
- data/lib/mageo/vector3dinternal.rb +14 -14
- data/mageo.gemspec +13 -16
- data/test/test_axes.rb +51 -51
- data/test/test_cylinder.rb +7 -6
- data/test/test_octahedron.rb +59 -60
- data/test/test_polar2d.rb +29 -27
- data/test/test_polar3d.rb +24 -23
- data/test/test_polyhedron.rb +4 -3
- data/test/test_segment.rb +32 -31
- data/test/test_sphere.rb +6 -5
- data/test/test_tetrahedron.rb +58 -56
- data/test/test_triangle.rb +124 -122
- data/test/test_vector.rb +8 -6
- data/test/test_vector3d.rb +168 -166
- data/test/test_vector3dinternal.rb +35 -33
- metadata +20 -31
data/CHANGES
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
= vasputils changelog
|
2
2
|
|
3
3
|
== Master (for 0.0.2)
|
4
|
+
- Make a namespace 'Mageo'.
|
5
|
+
- Most of classes are included into the namespace 'Mageo'.
|
6
|
+
- Adjust to malge-0.0.8
|
7
|
+
- Move Tetrahedron to Mageo::Tetrahedron
|
8
|
+
- Set default value of tolerance=0.0 in argument of Polyhedron#include?
|
9
|
+
- Adjust to builtinextension-0.1.0.
|
4
10
|
|
5
11
|
== Version (for 0.0.1)
|
6
12
|
- Change indent style from tab char to two spaces.
|
data/Gemfile
CHANGED
@@ -6,11 +6,11 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem "builtinextension", ">= 0"
|
10
|
-
gem "bundler", "~> 1.
|
9
|
+
gem "builtinextension", ">= 0.1.0"
|
10
|
+
gem "bundler", "~> 1.3.5"
|
11
11
|
gem "jeweler", "~> 1.8.3"
|
12
|
-
gem "malge", ">= 0.0.
|
13
|
-
gem "psych", ">= 0"
|
12
|
+
gem "malge", ">= 0.0.8"
|
13
|
+
#gem "psych", ">= 0"
|
14
14
|
gem "rdoc", "~> 3.12"
|
15
15
|
gem "simplecov", ">= 0"
|
16
16
|
end
|
data/Rakefile
CHANGED
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
|
|
17
17
|
gem.name = "mageo"
|
18
18
|
gem.homepage = "http://github.com/ippei94da/mageo"
|
19
19
|
gem.license = "MIT"
|
20
|
-
gem.summary = %Q{MAth GEOmetry library to deal with 2 and 3
|
21
|
-
gem.description = %Q{MAth GEOmetry library to deal with 2 and 3
|
20
|
+
gem.summary = %Q{MAth GEOmetry library to deal with 2 and 3 dimensional spaces.}
|
21
|
+
gem.description = %Q{MAth GEOmetry library to deal with 2 and 3 dimensional spaces.
|
22
22
|
Cartesian and internal coordinate systems can be used.
|
23
23
|
This includes besic objects in 3 dimensional space.
|
24
24
|
}
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/mageo.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mageo; end
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
#gem "malge"
|
5
|
+
require "malge"
|
6
|
+
|
7
|
+
require "mageo/axes.rb"
|
8
|
+
require "mageo/cylinder.rb"
|
9
|
+
require "mageo/polar2d.rb"
|
10
|
+
require "mageo/polar3d.rb"
|
11
|
+
require "mageo/segment.rb"
|
12
|
+
require "mageo/sphere.rb"
|
13
|
+
require "mageo/triangle.rb"
|
14
|
+
require "mageo/vector.rb"
|
15
|
+
require "mageo/vector3d.rb"
|
16
|
+
require "mageo/vector3dinternal.rb"
|
17
|
+
|
18
|
+
require "mageo/polyhedron.rb"
|
19
|
+
require "mageo/tetrahedron.rb"
|
20
|
+
require "mageo/octahedron.rb"
|
data/lib/mageo/axes.rb
CHANGED
data/lib/mageo/cylinder.rb
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
|
6
4
|
#
|
7
|
-
#
|
5
|
+
# Class for cylinder
|
8
6
|
#
|
9
|
-
class Cylinder
|
7
|
+
class Mageo::Cylinder
|
10
8
|
attr_reader :positions, :radius
|
11
9
|
|
12
10
|
# 座標と半径
|
13
11
|
# positions は 両底面の中心座標を入れた配列。
|
14
12
|
def initialize(position, radius)
|
15
13
|
@positions = [
|
16
|
-
Vector3D[*position[0]],
|
17
|
-
Vector3D[*position[1]]
|
14
|
+
Mageo::Vector3D[*position[0]],
|
15
|
+
Mageo::Vector3D[*position[1]]
|
18
16
|
]
|
19
17
|
@radius = radius
|
20
18
|
end
|
data/lib/mageo/octahedron.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
require "mageo/triangle.rb"
|
6
|
-
#require "mageo/tetrahedron.rb"
|
7
|
-
require "mageo/polyhedron.rb"
|
8
|
-
|
9
|
-
|
10
4
|
# 3次元空間中の八面体を表現するクラス
|
11
|
-
class Octahedron < Polyhedron
|
5
|
+
class Mageo::Octahedron < Mageo::Polyhedron
|
12
6
|
|
13
7
|
class InitializeError < Exception; end
|
14
8
|
|
@@ -36,7 +30,7 @@ class Octahedron < Polyhedron
|
|
36
30
|
end
|
37
31
|
|
38
32
|
pairs.flatten.each do |vertex|
|
39
|
-
raise InitializeError if vertex.class == Vector3DInternal
|
33
|
+
raise InitializeError if vertex.class == Mageo::Vector3DInternal
|
40
34
|
end
|
41
35
|
|
42
36
|
|
data/lib/mageo/polar2d.rb
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require 'matrix'
|
5
|
-
|
6
|
-
|
7
4
|
class Vector
|
8
5
|
include Math
|
9
6
|
|
10
|
-
#Polar2D クラスインスタンスへの変換。
|
7
|
+
#Mageo::Polar2D クラスインスタンスへの変換。
|
11
8
|
def to_p2d
|
12
9
|
raise Vector::SizeError if self.size != 2
|
13
10
|
x, y = *self
|
@@ -29,7 +26,7 @@ class Vector
|
|
29
26
|
theta = Math::atan( y/x )
|
30
27
|
theta += PI if ( x < 0)
|
31
28
|
end
|
32
|
-
Polar2D.new( r, theta ).minimize_theta
|
29
|
+
Mageo::Polar2D.new( r, theta ).minimize_theta
|
33
30
|
end
|
34
31
|
end
|
35
32
|
|
@@ -37,14 +34,14 @@ end
|
|
37
34
|
#極座標ライブラリでは、角度は基本的に radian を使用する。
|
38
35
|
#degree は人間の都合で決められた尺度だろう。
|
39
36
|
#まあ人間用に degree 用インターフェイスも用意することもあるかもしれんが。
|
40
|
-
class Polar2D
|
37
|
+
class Mageo::Polar2D
|
41
38
|
|
42
39
|
include Math
|
43
40
|
|
44
41
|
##クラスメソッド
|
45
42
|
|
46
43
|
#与えられた角度 radian を 0 <= radian < 2*PI の間の角度に変換する破壊破壊的メソッド。
|
47
|
-
def
|
44
|
+
def self.minimum_radian( radian )
|
48
45
|
tmp = ( radian / (2.0*PI) )
|
49
46
|
tmp = tmp - tmp.floor
|
50
47
|
(2.0*PI) * tmp
|
@@ -82,7 +79,7 @@ class Polar2D
|
|
82
79
|
|
83
80
|
#theta を 0 <= theta < 2*PI の間の角度に変換する破壊破壊的メソッド。
|
84
81
|
def minimize_theta!
|
85
|
-
@theta =
|
82
|
+
@theta = self.class.minimum_radian( @theta )
|
86
83
|
end
|
87
84
|
|
88
85
|
#theta を 0 <= theta < 2*PI の間の角度に変換したオブジェクトを返す非破壊破壊的メソッド。
|
data/lib/mageo/polar3d.rb
CHANGED
@@ -1,14 +1,11 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require 'matrix'
|
5
|
-
require 'mageo/vector3d.rb'
|
6
|
-
|
7
4
|
#3次元極座標。
|
8
5
|
#極座標ライブラリでは、角度は基本的に radian を使用する。
|
9
6
|
#degree は人間の都合で決められた尺度だろう。
|
10
7
|
#まあ人間用に degree 用インターフェイスも用意することもあるかもしれんが。
|
11
|
-
class Polar3D
|
8
|
+
class Mageo::Polar3D
|
12
9
|
|
13
10
|
include Math
|
14
11
|
|
@@ -27,7 +24,7 @@ class Polar3D
|
|
27
24
|
x = @r * sin( @theta ) * cos( @phi )
|
28
25
|
y = @r * sin( @theta ) * sin( @phi )
|
29
26
|
z = @r * cos( @theta )
|
30
|
-
Vector3D[ x, y, z ]
|
27
|
+
Mageo::Vector3D[ x, y, z ]
|
31
28
|
end
|
32
29
|
|
33
30
|
#phi を 0 <= phi < 2*PI の間の角度に変換する破壊破壊的メソッド。
|
data/lib/mageo/polyhedron.rb
CHANGED
@@ -2,24 +2,24 @@
|
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
4
|
require "rubygems"
|
5
|
-
gem
|
6
|
-
require "
|
5
|
+
gem "builtinextension"
|
6
|
+
require "array/includeeql.rb"
|
7
7
|
|
8
8
|
# 多面体を表現する抽象クラス。
|
9
9
|
# 面は必ず三角形で、たとえば四角形も2つの三角形であると考える。
|
10
10
|
# initialize メソッドは subclass で再定義する。
|
11
11
|
# subclass の注意点。
|
12
12
|
# - 凸包であることを前提とする。
|
13
|
-
# チェック機構は Polyhedron クラスで持っているべきだが、面倒なので後回し。
|
13
|
+
# チェック機構は Mageo::Polyhedron クラスで持っているべきだが、面倒なので後回し。
|
14
14
|
# 3次元凸包判定の方法をぐぐったが、これといったものが見つからない。
|
15
15
|
# - 定義された面同士の間に隙間がないことを前提とする。
|
16
|
-
# チェック機構は Polyhedron クラスで持っているべきだが、面倒なので後回し。
|
16
|
+
# チェック機構は Mageo::Polyhedron クラスで持っているべきだが、面倒なので後回し。
|
17
17
|
# - 頂点リスト @vertices と、面リスト @vertex_indices_of_triangles を持つ。
|
18
|
-
# ただし、@vertex_indices_of_triangles は Triangle クラスインスタンスではなく、
|
18
|
+
# ただし、@vertex_indices_of_triangles は Mageo::Triangle クラスインスタンスではなく、
|
19
19
|
# @vertices 内の index。
|
20
|
-
# see Tetrahedron.rb
|
21
|
-
# - メインのテストは 四面体 Tetrahedron クラスで行っている。
|
22
|
-
class Polyhedron
|
20
|
+
# see Mageo::Tetrahedron.rb
|
21
|
+
# - メインのテストは 四面体 Mageo::Tetrahedron クラスで行っている。
|
22
|
+
class Mageo::Polyhedron
|
23
23
|
attr_reader :vertices
|
24
24
|
|
25
25
|
class TypeError < Exception; end
|
@@ -42,14 +42,14 @@ class Polyhedron
|
|
42
42
|
|
43
43
|
def triangles
|
44
44
|
results = @vertex_indices_of_triangles.map do |indices|
|
45
|
-
Triangle.new( indices.map{|i| @vertices[i] } )
|
45
|
+
Mageo::Triangle.new( indices.map{|i| @vertices[i] } )
|
46
46
|
end
|
47
47
|
return results
|
48
48
|
end
|
49
49
|
|
50
50
|
#面で囲まれた空間の中にあれば true を返す。
|
51
51
|
def inside?( pos )
|
52
|
-
raise TypeError if pos.class == Vector3DInternal
|
52
|
+
raise TypeError if pos.class == Mageo::Vector3DInternal
|
53
53
|
|
54
54
|
result = true
|
55
55
|
triangles.each do |triangle|
|
@@ -58,8 +58,8 @@ class Polyhedron
|
|
58
58
|
return result
|
59
59
|
end
|
60
60
|
|
61
|
-
def include?(pos, tolerance)
|
62
|
-
raise TypeError if pos.class == Vector3DInternal
|
61
|
+
def include?(pos, tolerance = 0.0)
|
62
|
+
raise TypeError if pos.class == Mageo::Vector3DInternal
|
63
63
|
|
64
64
|
return true if inside?( pos )
|
65
65
|
triangles.each do |triangle|
|
@@ -75,7 +75,7 @@ class Polyhedron
|
|
75
75
|
result = 0.0
|
76
76
|
@vertex_indices_of_triangles.each do |tri_vertices|
|
77
77
|
vectors = tri_vertices.map { |i| @vertices[i] - center }
|
78
|
-
volume = Vector3D.scalar_triple_product( *vectors ).abs
|
78
|
+
volume = Mageo::Vector3D.scalar_triple_product( *vectors ).abs
|
79
79
|
volume /= 6.0
|
80
80
|
result += volume
|
81
81
|
end
|
@@ -84,7 +84,7 @@ class Polyhedron
|
|
84
84
|
|
85
85
|
#各頂点の座標の平均値を返す。
|
86
86
|
def center
|
87
|
-
tmp = Vector3D[ 0.0, 0.0, 0.0 ]
|
87
|
+
tmp = Mageo::Vector3D[ 0.0, 0.0, 0.0 ]
|
88
88
|
@vertices.each do |vertex|
|
89
89
|
tmp += vertex
|
90
90
|
end
|
data/lib/mageo/segment.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
|
6
4
|
# 線分を表すクラス。
|
7
|
-
class Segment
|
5
|
+
class Mageo::Segment
|
8
6
|
attr_reader :endpoints
|
9
7
|
|
10
8
|
class InitializeError < Exception; end
|
@@ -13,8 +11,8 @@ class Segment
|
|
13
11
|
|
14
12
|
# 端点を2つ渡す。
|
15
13
|
def initialize(vector0, vector1)
|
16
|
-
raise InitializeError if vector0.class != Vector3D
|
17
|
-
raise InitializeError if vector1.class != Vector3D
|
14
|
+
raise InitializeError if vector0.class != Mageo::Vector3D
|
15
|
+
raise InitializeError if vector1.class != Mageo::Vector3D
|
18
16
|
raise InitializeError if vector0 == vector1
|
19
17
|
|
20
18
|
@endpoints = [vector0, vector1]
|
@@ -22,9 +20,9 @@ class Segment
|
|
22
20
|
|
23
21
|
# position で与えられた点が線分の中にある点か?
|
24
22
|
# tolerance = 0.0 では計算誤差のためにほとんど真とならない。
|
25
|
-
# position は Vector3D クラスインスタンスでなければならない。
|
23
|
+
# position は Mageo::Vector3D クラスインスタンスでなければならない。
|
26
24
|
def include?(position, tolerance)
|
27
|
-
raise TypeError if position.class != Vector3D
|
25
|
+
raise TypeError if position.class != Mageo::Vector3D
|
28
26
|
|
29
27
|
vec_self = @endpoints[1] - @endpoints[0]
|
30
28
|
vec_other = position - @endpoints[0]
|
@@ -56,7 +54,7 @@ class Segment
|
|
56
54
|
end
|
57
55
|
|
58
56
|
# endpoints で取り出せる座標2つのうち、最初のものから最後のものへのベクトルを表す
|
59
|
-
# Vector3D クラスインスタンスを返す。
|
57
|
+
# Mageo::Vector3D クラスインスタンスを返す。
|
60
58
|
def to_v3d
|
61
59
|
return @endpoints[1] - @endpoints[0]
|
62
60
|
end
|
@@ -64,7 +62,7 @@ class Segment
|
|
64
62
|
# 等価チェック。
|
65
63
|
# uniq できるようにするため。
|
66
64
|
def eql?(other)
|
67
|
-
raise TypeError if other.class != Segment
|
65
|
+
raise TypeError if other.class != Mageo::Segment
|
68
66
|
@endpoints.each do |point|
|
69
67
|
return false unless other.endpoints.include?(point)
|
70
68
|
end
|
@@ -72,7 +70,7 @@ class Segment
|
|
72
70
|
end
|
73
71
|
|
74
72
|
def ==(other)
|
75
|
-
raise TypeError if other.class != Segment
|
73
|
+
raise TypeError if other.class != Mageo::Segment
|
76
74
|
@endpoints.size.times do |i|
|
77
75
|
return false unless other.endpoints[i] == @endpoints[i]
|
78
76
|
end
|
data/lib/mageo/sphere.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
|
6
|
-
#
|
7
4
|
# 球を表現するクラス。
|
8
5
|
#
|
9
|
-
class Sphere
|
6
|
+
class Mageo::Sphere
|
10
7
|
attr_reader :position, :radius
|
11
8
|
|
12
9
|
# 座標と半径
|
13
10
|
def initialize(position, radius)
|
14
|
-
@position = Vector3D[*position]
|
11
|
+
@position = Mageo::Vector3D[*position]
|
15
12
|
@radius = radius
|
16
13
|
end
|
17
14
|
end
|
data/lib/mageo/tetrahedron.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
require "mageo/triangle.rb"
|
6
|
-
require "mageo/polyhedron.rb"
|
7
|
-
|
8
|
-
|
9
4
|
#
|
10
5
|
# 直交座標系 3次元空間内の四面体を表現するクラス。
|
11
6
|
#
|
12
|
-
class Tetrahedron < Polyhedron
|
7
|
+
class Mageo::Tetrahedron < Mageo::Polyhedron
|
13
8
|
|
14
9
|
class InitializeError < Exception; end
|
15
10
|
|
@@ -23,7 +18,7 @@ class Tetrahedron < Polyhedron
|
|
23
18
|
raise InitializeError unless vertex.methods.include?( :map )
|
24
19
|
end
|
25
20
|
vertices.each do |vertex|
|
26
|
-
raise InitializeError if vertex.class == Vector3DInternal
|
21
|
+
raise InitializeError if vertex.class == Mageo::Vector3DInternal
|
27
22
|
end
|
28
23
|
|
29
24
|
@vertices = vertices.map { |vertex| vertex.to_v3d }
|
data/lib/mageo/triangle.rb
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# coding: utf-8
|
3
3
|
|
4
|
-
require "mageo/vector3d.rb"
|
5
|
-
require "mageo/vector3dinternal.rb"
|
6
|
-
require "mageo/axes.rb"
|
7
|
-
require "mageo/segment.rb"
|
8
|
-
|
9
4
|
#3次元空間中の3角形を表現するクラス。
|
10
5
|
#
|
11
|
-
#法線ベクトル( Vector3D クラスインスタンス )を返すメソッドは定義しない。
|
6
|
+
#法線ベクトル( Mageo::Vector3D クラスインスタンス )を返すメソッドは定義しない。
|
12
7
|
# 法線ベクトルは2通りの方向を取りうるため。
|
13
8
|
# initialize 時に点の指定の順序を決めることで定義はできるが、
|
14
9
|
# そうすると簡潔性が損なわれる。
|
15
|
-
class Triangle
|
10
|
+
class Mageo::Triangle
|
16
11
|
attr_reader :vertices
|
17
12
|
|
18
13
|
class InitializeError < Exception; end
|
@@ -22,11 +17,11 @@ class Triangle
|
|
22
17
|
class NoIntersectionError < Exception; end
|
23
18
|
|
24
19
|
#An argument 'vertices' can be Array of 3 items, Vector of 3 items,
|
25
|
-
# or Vector3D class instance, which have [] and map methods.
|
20
|
+
# or Mageo::Vector3D class instance, which have [] and map methods.
|
26
21
|
#当面は Array を前提とする。
|
27
22
|
#座標が整数で入っていたとしても内部的には Float に変換して使用する。
|
28
23
|
#3点が1直線上に並んでいて三角形を囲まない場合は
|
29
|
-
#例外 Triangle::LinearException を投げる。
|
24
|
+
#例外 Mageo::Triangle::LinearException を投げる。
|
30
25
|
def initialize( vertices )
|
31
26
|
raise InitializeError unless vertices.methods.include?( :size )
|
32
27
|
raise InitializeError if vertices.size != 3
|
@@ -42,7 +37,7 @@ class Triangle
|
|
42
37
|
#Checking on linear.
|
43
38
|
edge1 = @vertices[1] - @vertices[0]
|
44
39
|
edge2 = @vertices[2] - @vertices[0]
|
45
|
-
if ( Vector3D[0.0, 0.0, 0.0] == Vector3D.vector_product( edge1, edge2 ))
|
40
|
+
if ( Mageo::Vector3D[0.0, 0.0, 0.0] == Mageo::Vector3D.vector_product( edge1, edge2 ))
|
46
41
|
raise LinearException
|
47
42
|
end
|
48
43
|
|
@@ -51,16 +46,16 @@ class Triangle
|
|
51
46
|
#引数で与えられた 2 つの座標が、三角形の面に対して同じ側にあれば true を返す。
|
52
47
|
#どちらか、もしくは両方が、面上の点(当然頂点、辺上を含む)であれば必ず false を返す。
|
53
48
|
def same_side?( pos0, pos1 )
|
54
|
-
raise TypeError if pos0.class != Vector3D
|
55
|
-
raise TypeError if pos1.class != Vector3D
|
49
|
+
raise TypeError if pos0.class != Mageo::Vector3D
|
50
|
+
raise TypeError if pos1.class != Mageo::Vector3D
|
56
51
|
|
57
52
|
edge1 = @vertices[1] - @vertices[0]
|
58
53
|
edge2 = @vertices[2] - @vertices[0]
|
59
54
|
pos0 = pos0.to_v3d - @vertices[0]
|
60
55
|
pos1 = pos1.to_v3d - @vertices[0]
|
61
56
|
|
62
|
-
triple_product_pos0 = Vector3D.scalar_triple_product( edge1, edge2, pos0 )
|
63
|
-
triple_product_pos1 = Vector3D.scalar_triple_product( edge1, edge2, pos1 )
|
57
|
+
triple_product_pos0 = Mageo::Vector3D.scalar_triple_product( edge1, edge2, pos0 )
|
58
|
+
triple_product_pos1 = Mageo::Vector3D.scalar_triple_product( edge1, edge2, pos1 )
|
64
59
|
if triple_product_pos0 * triple_product_pos1 > 0
|
65
60
|
return true
|
66
61
|
else
|
@@ -69,11 +64,11 @@ class Triangle
|
|
69
64
|
end
|
70
65
|
|
71
66
|
# 3点で張られる面上にあり、三角形の内側にあれば true を返す。
|
72
|
-
# pos が Vector3D クラスインスタンスでなければ例外。
|
67
|
+
# pos が Mageo::Vector3D クラスインスタンスでなければ例外。
|
73
68
|
# ただし、面の法線方向には tolerance だけの許容値を設ける。
|
74
69
|
# 計算誤差の問題のため、これを設定しないと殆ど真とならない。
|
75
70
|
def include?(pos, tolerance)
|
76
|
-
raise TypeError if pos.class != Vector3D
|
71
|
+
raise TypeError if pos.class != Mageo::Vector3D
|
77
72
|
|
78
73
|
axes = internal_axes
|
79
74
|
#一次独立チェックは initialize 時にされている筈。
|
@@ -167,7 +162,7 @@ class Triangle
|
|
167
162
|
end
|
168
163
|
|
169
164
|
# 3つの頂点の座標が順不同で対応すれば真を返す。
|
170
|
-
# other が Triangle クラス以外のインスタンスなら例外 Triangle::TypeError を投げる。
|
165
|
+
# other が Mageo::Triangle クラス以外のインスタンスなら例外 Triangle::TypeError を投げる。
|
171
166
|
# MEMO:
|
172
167
|
# 当初 eql? という名前を付けていたが、
|
173
168
|
# これは hash メソッドと関連があるので危険。
|
@@ -175,7 +170,7 @@ class Triangle
|
|
175
170
|
# しかし eql? に依存したコードが残っているので当面 alias を残す。
|
176
171
|
# そのうち obsolete する。
|
177
172
|
def equivalent?(other, tolerance = 0.0)
|
178
|
-
raise TypeError unless other.class == Triangle
|
173
|
+
raise TypeError unless other.class == Mageo::Triangle
|
179
174
|
|
180
175
|
vertices.each do |v_self|
|
181
176
|
if (other.vertices.find{|v_other| v_self.equal_in_delta?(v_other, tolerance) })
|
@@ -204,21 +199,21 @@ class Triangle
|
|
204
199
|
|
205
200
|
def edges
|
206
201
|
results = []
|
207
|
-
results << Segment.new(@vertices[0], @vertices[1])
|
208
|
-
results << Segment.new(@vertices[1], @vertices[2])
|
209
|
-
results << Segment.new(@vertices[2], @vertices[0])
|
202
|
+
results << Mageo::Segment.new(@vertices[0], @vertices[1])
|
203
|
+
results << Mageo::Segment.new(@vertices[1], @vertices[2])
|
204
|
+
results << Mageo::Segment.new(@vertices[2], @vertices[0])
|
210
205
|
return results
|
211
206
|
end
|
212
207
|
|
213
208
|
private
|
214
209
|
|
215
210
|
# 三角形の2辺のベクトルと、これらからなる外積ベクトル、
|
216
|
-
# 合計3つのベクトルから Axes クラスインスタンスを作る。
|
211
|
+
# 合計3つのベクトルから Mageo::Axes クラスインスタンスを作る。
|
217
212
|
# vertices で取り出せる3頂点のうち、0th 要素を原点とし、
|
218
213
|
# 1st, 2nd 要素をそれぞれ順に軸としたものとする。
|
219
214
|
def internal_axes
|
220
215
|
edge1 = (@vertices[1] - @vertices[0])
|
221
216
|
edge2 = (@vertices[2] - @vertices[0])
|
222
|
-
return Axes.new([edge1, edge2, normal_vector])
|
217
|
+
return Mageo::Axes.new([edge1, edge2, normal_vector])
|
223
218
|
end
|
224
219
|
end
|