gmath3D 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
data/gmath3D.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{gmath3D}
8
- s.version = "0.2.2"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Toshiyasu Shimizu"]
12
- s.date = %q{2011-10-25}
12
+ s.date = %q{2011-11-03}
13
13
  s.description = %q{This library defines 3D geometric elements(point, line, plane etc..). It can get two(or more) elements relation, like distance between two elements.}
14
14
  s.email = %q{toshi0328@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
26
26
  "VERSION",
27
27
  "gmath3D.gemspec",
28
28
  "lib/box.rb",
29
+ "lib/ellipse.rb",
29
30
  "lib/finite_line.rb",
30
31
  "lib/geom.rb",
31
32
  "lib/gmath3D.rb",
@@ -41,6 +42,7 @@ Gem::Specification.new do |s|
41
42
  "lib/vector3.rb",
42
43
  "test/helper.rb",
43
44
  "test/test_box.rb",
45
+ "test/test_ellipse.rb",
44
46
  "test/test_finite_line.rb",
45
47
  "test/test_geom.rb",
46
48
  "test/test_line.rb",
data/lib/box.rb CHANGED
@@ -28,6 +28,18 @@ public
28
28
  @max_point.z = [ point1.z, point2.z ].max
29
29
  end
30
30
 
31
+ # [Input]
32
+ # _points_ should be Array of Vector3.
33
+ # Each points are opposing corners.
34
+ # [Output]
35
+ # return new instance of Box.
36
+ def self.from_points( points )
37
+ return nil if (points == nil || points.size <=0)
38
+ box = Box.new(points[0], points[0])
39
+ box += points
40
+ return box
41
+ end
42
+
31
43
  def to_s
32
44
  "Box[min#{min_point.to_element_s}, max#{max_point.to_element_s}]"
33
45
  end
@@ -71,6 +83,7 @@ private
71
83
  true
72
84
  end
73
85
  def add(rhs)
86
+ return self if (rhs == nil)
74
87
  if( rhs.kind_of?(Vector3))
75
88
  added_box = Box.new()
76
89
  added_box.min_point.x = [ self.min_point.x, rhs.x ].min
data/lib/ellipse.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'gmath3D'
2
+
3
+ module GMath3D
4
+ #
5
+ #
6
+ class Ellipse < Geom
7
+ def initialize(origin = Vector3.new(), axis1 = Vector3.new(1,0,0), axis2 = Vector3.new(0,1,0))
8
+
9
+ end
10
+ end
11
+ end
data/lib/finite_line.rb CHANGED
@@ -9,11 +9,13 @@ public
9
9
  attr_accessor :start_point
10
10
  attr_accessor :end_point
11
11
 
12
+ include BoxAvailable
13
+
12
14
  # [Input]
13
15
  # _start_point_ and _end_point_ should be Vector3.
14
16
  # [Output]
15
17
  # return new instance as FiniteLine
16
- def initialize(start_point = Vector3.new(0.0,0.0,0.0), end_point = Vector3.new(1.0,0.0,0.0))
18
+ def initialize(start_point = Vector3.new(0,0,0), end_point = Vector3.new(1,0,0))
17
19
  Util.check_arg_type(Vector3, start_point)
18
20
  Util.check_arg_type(Vector3, end_point)
19
21
  super()
@@ -30,6 +32,16 @@ public
30
32
  "FiniteLine[from#{start_point.to_element_s}, to#{end_point.to_element_s}]"
31
33
  end
32
34
 
35
+ # [Input]
36
+ # _mat_ should be Matrix which row and col size are 3.
37
+ # [Output]
38
+ # return rotated FiniteLine.
39
+ def rotate(mat)
40
+ rot_start_point = mat*start_point
41
+ rot_end_point = mat*end_point
42
+ return FiniteLine.new(rot_start_point, rot_end_point)
43
+ end
44
+
33
45
  # [Input]
34
46
  # _rhs_ should be FiniteLine.
35
47
  # [Output]
@@ -42,6 +54,12 @@ public
42
54
  return true
43
55
  end
44
56
 
57
+ # [Output]
58
+ # return Array of start_point and end_point.
59
+ def vertices
60
+ return [start_point, end_point]
61
+ end
62
+
45
63
  # [Output]
46
64
  # return direction as vector from start_point to end_point as Vector3
47
65
  def direction
data/lib/gmath3D.rb CHANGED
@@ -8,6 +8,8 @@ require 'matrix_util'
8
8
 
9
9
  require 'line'
10
10
  require 'finite_line'
11
+ require 'ellipse'
12
+
11
13
  require 'plane'
12
14
  require 'rectangle'
13
15
  require 'triangle'
data/lib/polyline.rb CHANGED
@@ -9,6 +9,8 @@ module GMath3D
9
9
  attr_accessor :vertices
10
10
  attr_accessor :is_open
11
11
 
12
+ include BoxAvailable
13
+
12
14
  # [Input]
13
15
  # _vertices_ should be Array of Vector3.
14
16
  # [Output]
data/lib/rectangle.rb CHANGED
@@ -12,6 +12,8 @@ public
12
12
  attr_accessor:u_vector
13
13
  attr_accessor:v_vector
14
14
 
15
+ include BoxAvailable
16
+
15
17
  # [Input]
16
18
  # _base_point_ , _u_vector_, _v_vector_ should be Vector3.
17
19
  # _u_vector_ and _v_vector_ should be orthogonalized.
data/lib/tri_mesh.rb CHANGED
@@ -8,6 +8,8 @@ module GMath3D
8
8
  attr_reader :vertices
9
9
  attr_reader :tri_indices
10
10
 
11
+ include BoxAvailable
12
+
11
13
  # [Input]
12
14
  # vertices is Array of Vector3.
13
15
  # tri_indices is Array of triangle whick is consist of 3 vertices index.
@@ -204,7 +206,7 @@ module GMath3D
204
206
  "TriMesh[triangle_count:#{tri_indices.size}, vertex_count:#{vertices.size}]"
205
207
  end
206
208
 
207
- # [Input]
209
+ # [Input]
208
210
  # _index_ is index of triangle.
209
211
  # [Output]
210
212
  # return new instance of Triangle.
data/lib/triangle.rb CHANGED
@@ -6,7 +6,9 @@ module GMath3D
6
6
  #
7
7
  class Triangle < Geom
8
8
  public
9
- attr_accessor:vertices
9
+ attr_accessor :vertices
10
+
11
+ include BoxAvailable
10
12
 
11
13
  # [Input]
12
14
  # _vertex1_, _vertex2_, _vertex3_ should be Vector3.
data/lib/util.rb CHANGED
@@ -5,11 +5,20 @@ module GMath3D
5
5
  raise(ArgumentError::new("type mismatch: #{instance.class} for #{type}"))
6
6
  end
7
7
  end
8
-
8
+
9
9
  def self.raise_argurment_error(instance)
10
10
  raise(ArgumentError::new("type mismatch: #{instance.class}"))
11
11
  end
12
12
  end
13
+
14
+ # Including 'vertices' methodshould be implimented that gets geometry vertices as Array of Vector3.
15
+ module BoxAvailable
16
+ # [Output]
17
+ # return axially aligned bounding box as Box.
18
+ def box
19
+ return Box.from_points( vertices )
20
+ end
21
+ end
13
22
  end
14
23
 
15
24
  class Array
data/lib/vector3.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- coding: cp932 -*-
1
2
  require 'gmath3D'
2
3
 
3
4
  module GMath3D
@@ -49,6 +50,12 @@ public
49
50
  equals_inner(rhs)
50
51
  end
51
52
 
53
+ # [Output]
54
+ # return axially aligned bounding box as Box.
55
+ def box
56
+ return Box.new(self, self)
57
+ end
58
+
52
59
  # [Input]
53
60
  # _rhs_ should be Vector3.
54
61
  # [Output]
@@ -102,6 +109,23 @@ public
102
109
  self.x*rhs.y - self.y*rhs.x)
103
110
  end
104
111
 
112
+ # [Output]
113
+ # return orthogonal vector as Vector3.
114
+ def arbitrary_orthogonal
115
+ return Vector3.new() if(self.length < self.tolerance)
116
+
117
+ if(!self.parallel?( Vector3.new(0.0, 1.0, 0.0) ))
118
+ un_parallel_vec = Vector3.new(0.0,1.0,0.0)
119
+ elsif(!self.parallel?( Vector3.new(0.0,0.0,1.0) ))
120
+ un_parallel_vec = Vector3.new(0.0,0.0,1.0)
121
+ else
122
+ un_parallel_vec = Vector3.new(1.0,0.0,0.0)
123
+ end
124
+
125
+ orthogonal = self.cross(un_parallel_vec)
126
+ return orthogonal.normalize
127
+ end
128
+
105
129
  # [Output]
106
130
  # return vector length as Numeric
107
131
  def length
data/test/test_box.rb CHANGED
@@ -40,6 +40,30 @@ class BoxTestCase < MiniTest::Unit::TestCase
40
40
  end
41
41
  end
42
42
 
43
+ def test_from_points
44
+ points = Array.new(6)
45
+ points[0] = Vector3.new( 3, 0, 1)
46
+ points[1] = Vector3.new( 2,-2, 10)
47
+ points[2] = Vector3.new(-6, 2, -4)
48
+ points[3] = Vector3.new( 3, 5, -1)
49
+ points[4] = Vector3.new(-2, 2, 2)
50
+ points[5] = Vector3.new(11, 1, 0)
51
+ box = Box.from_points(points)
52
+ assert_equal(Vector3.new(-6, -2, -4), box.min_point)
53
+ assert_equal(Vector3.new(11, 5, 10), box.max_point)
54
+
55
+ points = Array.new(2)
56
+ points[0] = Vector3.new( -3, -2, -1)
57
+ points[1] = Vector3.new( -4, -8, -10)
58
+ box = Box.from_points(points)
59
+ assert_equal(Vector3.new(-4, -8, -10), box.min_point)
60
+ assert_equal(Vector3.new(-3, -2, -1), box.max_point)
61
+
62
+ points = Array.new(0)
63
+ box = Box.from_points(points)
64
+ assert_equal(nil, box)
65
+ end
66
+
43
67
  def test_equal
44
68
  shallow_copied = @box
45
69
  assert( shallow_copied == @box )
@@ -0,0 +1,55 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ require 'helper'
3
+
4
+ include GMath3D
5
+
6
+ MiniTest::Unit.autorun
7
+
8
+ class EllipseTestCase < MiniTest::Unit::TestCase
9
+ def test_initialize
10
+ end
11
+
12
+ def test_to_s
13
+ end
14
+
15
+ def test_equals
16
+ =begin
17
+ line = FiniteLine.new()
18
+ shallow_copied = line
19
+ assert(line == shallow_copied)
20
+ assert(line.equal?(shallow_copied))
21
+ assert(line != nil)
22
+ assert(line != "string")
23
+
24
+ assert_equal(FiniteLine.new(Vector3.new(1,2,3), Vector3.new(2,3,4)),
25
+ FiniteLine.new(Vector3.new(1.0,2.0,3.0), Vector3.new(2.0,3.0,4.0)))
26
+
27
+ assert(FiniteLine.new(Vector3.new(1,2,3), Vector3.new(2,3,4)) == FiniteLine.new(Vector3.new(1.0,2.0,3.0), Vector3.new(2.0,3.0,4.0)))
28
+ assert(FiniteLine.new(Vector3.new(1,2,3), Vector3.new(2,3,3)) != FiniteLine.new(Vector3.new(1.0,2.0,3.0), Vector3.new(2.0,3.0,4.0)))
29
+ assert(FiniteLine.new(Vector3.new(1,2,3), Vector3.new(2,3,4)) != FiniteLine.new(Vector3.new(2,3,4), Vector3.new(1,2,3)))
30
+ line = FiniteLine.new(Vector3.new(1,0,2), Vector3.new(1,-3.5,2))
31
+ assert_equal("FiniteLine[from[1, 0, 2], to[1, -3.5, 2]]", line.to_s)
32
+ =end
33
+ end
34
+
35
+ def test_clone
36
+ =begin
37
+ line = FiniteLine.new()
38
+ shallow_copied = line
39
+ shallow_copied.start_point.x = -1
40
+ assert(line == shallow_copied)
41
+ assert(line.equal?(shallow_copied))
42
+ assert_equal(-1, shallow_copied.start_point.x)
43
+
44
+ cloned = line.clone
45
+ assert(line == cloned)
46
+ assert(!line.equal?(cloned))
47
+ cloned.start_point.x = -2
48
+ assert_equal(-2, cloned.start_point.x)
49
+
50
+ assert_equal(-1, line.start_point.x) # original never changed in editing cloned one.
51
+ =end
52
+ end
53
+
54
+
55
+ end
@@ -24,6 +24,15 @@ class FiniteLineTestCase < MiniTest::Unit::TestCase
24
24
  assert_equal("FiniteLine[from[1, 0, 2], to[1, -3.5, 2]]", line.to_s)
25
25
  end
26
26
 
27
+ def test_rotation
28
+ line = FiniteLine.new(Vector3.new(1,0,0), Vector3.new(2,0,0))
29
+ angle = -45.0 * Math::PI / 180.0
30
+ mat = Matrix.from_axis( Vector3.new(0,0,1), angle )
31
+ rotated_line = line.rotate(mat)
32
+ assert_equal(Vector3.new(Math.sqrt(2)/2.0,Math.sqrt(2)/2.0,0), rotated_line.start_point)
33
+ assert_equal(Vector3.new(Math.sqrt(2),Math.sqrt(2),0), rotated_line.end_point)
34
+ end
35
+
27
36
  def test_equals
28
37
  line = FiniteLine.new()
29
38
  shallow_copied = line
@@ -57,6 +66,18 @@ class FiniteLineTestCase < MiniTest::Unit::TestCase
57
66
  assert_equal(-1, line.start_point.x) # original never changed in editing cloned one.
58
67
  end
59
68
 
69
+ def test_box
70
+ start_point_tmp = Vector3.new(1.0, 0.0, 2.0)
71
+ end_point_tmp = Vector3.new(1.0, -3.5, 5.0)
72
+ line = FiniteLine.new(start_point_tmp, end_point_tmp)
73
+ assert_equal(Vector3.new(1, -3.5, 2), line.box.min_point)
74
+ assert_equal(Vector3.new(1, 0, 5), line.box.max_point)
75
+
76
+ line = FiniteLine.new()
77
+ assert_equal(Vector3.new(), line.box.min_point)
78
+ assert_equal(Vector3.new(1,0,0), line.box.max_point)
79
+ end
80
+
60
81
  def test_direction
61
82
  start_point_tmp = Vector3.new(1.0, 0.0, 2.0)
62
83
  end_point_tmp = Vector3.new(1.0, -3.5, 1.0)
@@ -79,6 +79,13 @@ class PolylineTestCase < MiniTest::Unit::TestCase
79
79
  @polyline_closed.to_s);
80
80
  end
81
81
 
82
+ def test_box
83
+ assert_equal(Vector3.new(0,0,0), @polyline_open.box.min_point)
84
+ assert_equal(Vector3.new(3,2,1), @polyline_open.box.max_point)
85
+ assert_equal(Vector3.new(0,0,0), @polyline_closed.box.min_point)
86
+ assert_equal(Vector3.new(3,2,1), @polyline_closed.box.max_point)
87
+ end
88
+
82
89
  def test_center
83
90
  assert_equal(Vector3.new(1.5, 1.0, 1.0/6.0), @polyline_open.center)
84
91
  assert_equal(Vector3.new(1.5, 1.0, 1.0/6.0), @polyline_closed.center)
@@ -61,6 +61,15 @@ class RectangleTestCase < MiniTest::Unit::TestCase
61
61
  assert_equal("Rectangle[base[1, 2, 3], u[0, -0.5, 0], v[0, 0, 2]", @rectangle.to_s)
62
62
  end
63
63
 
64
+ def test_box
65
+ box1 = @rectangle.box
66
+ box2 = @rectangle_default.box
67
+ assert_equal(Vector3.new(1, 1.5, 3), box1.min_point)
68
+ assert_equal(Vector3.new(1, 2, 5), box1.max_point)
69
+ assert_equal(Vector3.new(0, 0, 0), box2.min_point)
70
+ assert_equal(Vector3.new(1, 1, 0), box2.max_point)
71
+ end
72
+
64
73
  def test_point
65
74
  point = @rectangle.point(0.2, 1.0)
66
75
  assert_equal(Vector3.new(1, 1.9, 5), point)
@@ -88,6 +88,15 @@ class TriMeshTestCase < MiniTest::Unit::TestCase
88
88
  assert_equal( "TriMesh[triangle_count:12, vertex_count:8]", get_box_mesh().to_s)
89
89
  end
90
90
 
91
+ def test_box
92
+ box_mesh = get_box_mesh
93
+ plane_mesh = get_plane_mesh
94
+ assert_equal( Vector3.new(-1,-1,-1), box_mesh.box.min_point )
95
+ assert_equal( Vector3.new( 2, 3, 4), box_mesh.box.max_point )
96
+ assert_equal( Vector3.new(-1,-1,-1), plane_mesh.box.min_point )
97
+ assert_equal( Vector3.new( 1, 3,-1), plane_mesh.box.max_point )
98
+ end
99
+
91
100
  def test_triangles
92
101
  vertices = [Vector3.new(0,0,0),Vector3.new(2,0,0),Vector3.new(2,2,0),Vector3.new(0,2,0)]
93
102
  tri_indices = [[0,1,3],[1,2,3]]
@@ -55,6 +55,15 @@ class TriangleTestCase < MiniTest::Unit::TestCase
55
55
  assert_equal("Triangle[[1, 2, 2], [1, 4, 2], [-1, 3, 0]]", @triangle.to_s)
56
56
  end
57
57
 
58
+ def test_box
59
+ box1 = @triangle.box
60
+ box2 = @triangle_default.box
61
+ assert_equal(Vector3.new(-1,2,0), box1.min_point)
62
+ assert_equal(Vector3.new(1,4,2), box1.max_point)
63
+ assert_equal(Vector3.new(0,0,0) , box2.min_point)
64
+ assert_equal(Vector3.new(1,1,0) , box2.max_point)
65
+ end
66
+
58
67
  def test_point
59
68
  assert_equal(@triangle.vertices[0], @triangle.point( Array.new([1,0,0])))
60
69
  assert_equal(@triangle.vertices[1], @triangle.point( Array.new([0,1,0])))
data/test/test_vector3.rb CHANGED
@@ -144,6 +144,15 @@ class Vector3TestCase < MiniTest::Unit::TestCase
144
144
  assert_equal(3, hash[vec])
145
145
  end
146
146
 
147
+ def test_box
148
+ box1 = @vector.box
149
+ box2 = Vector3.new().box
150
+ assert_equal(Vector3.new(1,2,3), box1.min_point)
151
+ assert_equal(Vector3.new(1,2,3), box1.max_point)
152
+ assert_equal(Vector3.new(), box2.min_point)
153
+ assert_equal(Vector3.new(), box2.max_point)
154
+ end
155
+
147
156
  def test_add
148
157
  vector = Vector3.new(4,5,6)
149
158
  addedVector = vector + @vector
@@ -397,5 +406,34 @@ class Vector3TestCase < MiniTest::Unit::TestCase
397
406
  assert_equal( 0, matrix[2,0])
398
407
  end
399
408
 
400
-
409
+ def test_arbitrary_orthogonal
410
+ vec1 = Vector3.new( 1.0, 2.0, 3.0 )
411
+ vec2 = Vector3.new( 1.0, 1.0, 4.0 )
412
+ vec3 = Vector3.new( 2.0, 4.0, 6.0 )
413
+ vec4 = Vector3.new( -1.0, -2.0, -3.0 )
414
+ vecx = Vector3.new( 1.0, 0.0, 0.0 )
415
+ vecy = Vector3.new( 0.0, -3.0, 0.0 )
416
+ vecz = Vector3.new( 0.0, 0.0, 5.0 )
417
+ veczero = Vector3.new( 0.0, 0.0, 0.0 )
418
+
419
+ vec1_orth = vec1.arbitrary_orthogonal
420
+ vec2_orth = vec2.arbitrary_orthogonal
421
+ vec3_orth = vec3.arbitrary_orthogonal
422
+ vec4_orth = vec4.arbitrary_orthogonal
423
+ vecx_orth = vecx.arbitrary_orthogonal
424
+ vecy_orth = vecy.arbitrary_orthogonal
425
+ vecz_orth = vecz.arbitrary_orthogonal
426
+ veczero_orth = veczero.arbitrary_orthogonal
427
+
428
+ assert_in_delta(0.5*Math::PI, vec1.angle(vec1_orth), vec1.tolerance)
429
+ assert_in_delta(0.5*Math::PI, vec2.angle(vec2_orth), vec2.tolerance)
430
+ assert_in_delta(0.5*Math::PI, vec3.angle(vec3_orth), vec3.tolerance)
431
+ assert_in_delta(0.5*Math::PI, vec4.angle(vec4_orth), vec4.tolerance)
432
+ assert_in_delta(0.5*Math::PI, vecx.angle(vecx_orth), vecx.tolerance)
433
+ assert_in_delta(0.5*Math::PI, vecy.angle(vecy_orth), vecy.tolerance)
434
+ assert_in_delta(0.5*Math::PI, vecz.angle(vecz_orth), vecz.tolerance)
435
+ assert_in_delta(0.0, veczero_orth.x, veczero.tolerance)
436
+ assert_in_delta(0.0, veczero_orth.y, veczero.tolerance)
437
+ assert_in_delta(0.0, veczero_orth.z, veczero.tolerance)
438
+ end
401
439
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gmath3D
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-25 00:00:00.000000000 +09:00
12
+ date: 2011-11-03 00:00:00.000000000 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
17
- requirement: &2152196520 !ruby/object:Gem::Requirement
17
+ requirement: &2156037040 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.0.0
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2152196520
25
+ version_requirements: *2156037040
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: jeweler
28
- requirement: &2152195120 !ruby/object:Gem::Requirement
28
+ requirement: &2156035880 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 1.6.4
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2152195120
36
+ version_requirements: *2156035880
37
37
  description: This library defines 3D geometric elements(point, line, plane etc..).
38
38
  It can get two(or more) elements relation, like distance between two elements.
39
39
  email: toshi0328@gmail.com
@@ -52,6 +52,7 @@ files:
52
52
  - VERSION
53
53
  - gmath3D.gemspec
54
54
  - lib/box.rb
55
+ - lib/ellipse.rb
55
56
  - lib/finite_line.rb
56
57
  - lib/geom.rb
57
58
  - lib/gmath3D.rb
@@ -67,6 +68,7 @@ files:
67
68
  - lib/vector3.rb
68
69
  - test/helper.rb
69
70
  - test/test_box.rb
71
+ - test/test_ellipse.rb
70
72
  - test/test_finite_line.rb
71
73
  - test/test_geom.rb
72
74
  - test/test_line.rb
@@ -95,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
95
97
  version: '0'
96
98
  segments:
97
99
  - 0
98
- hash: -2118171931574002143
100
+ hash: 3556461112353261793
99
101
  required_rubygems_version: !ruby/object:Gem::Requirement
100
102
  none: false
101
103
  requirements: