ruby-geometry 0.0.4 → 0.0.5
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.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.ruby-version +1 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +20 -0
- data/README.md +92 -0
- data/Rakefile +13 -0
- data/TODO +35 -0
- data/lib/line.rb +12 -0
- data/lib/point.rb +9 -1
- data/lib/polygon.rb +11 -0
- data/lib/segment.rb +23 -0
- data/ruby-geometry.gemspec +22 -0
- data/test/bounding_box/contains_test.rb +2 -2
- data/test/geometry/distance_test.rb +2 -2
- data/test/line/angle_to_test.rb +2 -2
- data/test/line/distance_to_test.rb +18 -0
- data/test/line/horizontal_test.rb +2 -2
- data/test/line/initialize_test.rb +2 -2
- data/test/line/intersect_x_test.rb +2 -2
- data/test/line/parallel_to_test.rb +2 -2
- data/test/line/slope_test.rb +2 -2
- data/test/line/vertical_test.rb +2 -2
- data/test/line/x_intercept_test.rb +2 -2
- data/test/line/y_intercept_test.rb +2 -2
- data/test/point/advance_by_test.rb +12 -0
- data/test/point/equals_test.rb +2 -2
- data/test/point/initialize_test.rb +2 -2
- data/test/polygon/bounding_box_test.rb +2 -2
- data/test/polygon/contains_point_test.rb +2 -2
- data/test/polygon/edges_test.rb +2 -2
- data/test/polygon/polygon_area_test.rb +35 -0
- data/test/segment/bounds_test.rb +2 -2
- data/test/segment/contains_point_test.rb +2 -2
- data/test/segment/distance_to_test.rb +31 -0
- data/test/segment/initialize_test.rb +2 -2
- data/test/segment/intersection_point_with_test.rb +9 -7
- data/test/segment/intersects_with_test.rb +2 -2
- data/test/segment/length_test.rb +2 -2
- data/test/segment/lie_on_one_line_with.rb +34 -0
- data/test/segment/overlaps_test.rb +8 -6
- data/test/segment/parallel_to_test.rb +2 -2
- data/test/segment/to_vector_test.rb +2 -2
- data/test/vector/arithmetics_test.rb +2 -2
- data/test/vector/collinear_with_test.rb +2 -2
- data/test/vector/cross_product_test.rb +2 -2
- data/test/vector/equals_test.rb +7 -7
- data/test/vector/modulus_test.rb +2 -2
- data/test/vector/scalar_product_test.rb +2 -2
- metadata +78 -23
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ceb19ba1fb790c21207f0d8b7543b64676e8c4d0
|
4
|
+
data.tar.gz: c69308a99ef8aee203bdad69478e0b2108f7fea1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e4c5e0981ef218e99c704aefbf9410e2fe2c62dd1a650a790fd2fd6b4194869c46f77154242a444ff335960853cbc1a86f0225964bdaf884a23922f87966a9e7
|
7
|
+
data.tar.gz: 326038ae5819fa77e6986a78eb5b04b6eee0a4ff66e89d0b483fd426bb42965a5d700f201552299bcb6a0b96677168f06a0cac36487bcfb11d3ca31aca2c9a8e
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0
|
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Daniel Vartanov
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
Geometry in Ruby
|
2
|
+
================
|
3
|
+
|
4
|
+
Implementation of basic 2D geometry algorithms in Ruby.
|
5
|
+
|
6
|
+
|
7
|
+
Installation
|
8
|
+
============
|
9
|
+
```ruby
|
10
|
+
gem 'ruby-geometry', require: 'geometry'
|
11
|
+
```
|
12
|
+
|
13
|
+
|
14
|
+
Defined geometry objects
|
15
|
+
========================
|
16
|
+
|
17
|
+
* Point
|
18
|
+
|
19
|
+
* Segment
|
20
|
+
|
21
|
+
* Vector
|
22
|
+
|
23
|
+
* Polygon
|
24
|
+
|
25
|
+
* Line
|
26
|
+
|
27
|
+
|
28
|
+
Already implemented algorithms
|
29
|
+
==============================
|
30
|
+
|
31
|
+
* Do segments overlap? { Segments#overlaps? }
|
32
|
+
|
33
|
+
* Do segments lie on one line? { Segment#lies_on_one_line_with? }
|
34
|
+
|
35
|
+
* Do segments intersect? { Segment#intersects_with? }
|
36
|
+
|
37
|
+
* Segments intersection point { Segment#intersection_point_with }
|
38
|
+
|
39
|
+
* Does segment contain given point? { Segment#contains_point? }
|
40
|
+
|
41
|
+
* Are segments parallel? { Segment#parallel_to? }
|
42
|
+
|
43
|
+
* Are vectors collinear? { Vector#collinear_with? }
|
44
|
+
|
45
|
+
* Vectors cross product (outer product, vector product) { Vector#cross_product }
|
46
|
+
|
47
|
+
* Vectors scalar product (inner product, dot product) { Vector#scalar_product }
|
48
|
+
|
49
|
+
* Segment length { Segment#length }
|
50
|
+
|
51
|
+
* Vector modulus { Vector#modulus }
|
52
|
+
|
53
|
+
* Trivial vector arithmetics: summation, subtraction, vector-number multiplication { Vector#+(vector); Vector#-(vector); Vector#*(numeric) }
|
54
|
+
|
55
|
+
* Euclid distance { Geometry#distance }
|
56
|
+
|
57
|
+
* Line slope { Line#slope }
|
58
|
+
|
59
|
+
* Y-intercept of a line { Line#y_intercept }
|
60
|
+
|
61
|
+
* X-intercept of a line { Line#x_intercept }
|
62
|
+
|
63
|
+
* Are lines parallel? { Line#parallel_to? }
|
64
|
+
|
65
|
+
* What x-value do lines intersect at? { Line#intersect_x }
|
66
|
+
|
67
|
+
* What is the angle between two lines? { Line#angle_to }
|
68
|
+
|
69
|
+
* Rectangular bounds of polygon { Polygon#bounding_box }
|
70
|
+
|
71
|
+
* Does polygon contain a given point? { Polygon#contains? }
|
72
|
+
|
73
|
+
|
74
|
+
Coming up
|
75
|
+
=========
|
76
|
+
|
77
|
+
* Is polygon self-intersecting?
|
78
|
+
|
79
|
+
* Area of polygon
|
80
|
+
|
81
|
+
* Is polygon convex?
|
82
|
+
|
83
|
+
* Do polygons intersect?
|
84
|
+
|
85
|
+
* Does circle contain given point?
|
86
|
+
|
87
|
+
* Do circles intersect?
|
88
|
+
|
89
|
+
* Area of circle
|
90
|
+
|
91
|
+
|
92
|
+
Copyright (c) 2008 Daniel Vartanov, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rake/dsl_definition'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'bundler/gem_tasks'
|
5
|
+
|
6
|
+
task default: :test
|
7
|
+
|
8
|
+
Rake::TestTask.new do |t|
|
9
|
+
t.libs << "lib"
|
10
|
+
t.libs << "test"
|
11
|
+
t.test_files = FileList['test/**/*_test.rb']
|
12
|
+
t.verbose = true
|
13
|
+
end
|
data/TODO
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
== Auxiliary features
|
2
|
+
* Methods requests tagging
|
3
|
+
|
4
|
+
If algorithm requires some state or property of object, it should be tagged.
|
5
|
+
Requirements should be checked before each method call (of course, info should
|
6
|
+
be cached due to computational complexity of algorithms).
|
7
|
+
Example:
|
8
|
+
|
9
|
+
class Polygon
|
10
|
+
|
11
|
+
def convex?
|
12
|
+
...
|
13
|
+
end
|
14
|
+
|
15
|
+
def self_intersecting?
|
16
|
+
...
|
17
|
+
end
|
18
|
+
|
19
|
+
must_be :convex
|
20
|
+
must_not_be :self_intersecting
|
21
|
+
def contains_point?(point)
|
22
|
+
... # code, which assumes, that polygon is convex and not self_intersecting
|
23
|
+
end
|
24
|
+
|
25
|
+
== Algorithms
|
26
|
+
|
27
|
+
* Polygon convexity
|
28
|
+
* Polygons intersection
|
29
|
+
* Polygon contains given point?
|
30
|
+
* Rectangular bounds of polygon
|
31
|
+
* Area of polygon
|
32
|
+
* Does circle contain given point?
|
33
|
+
* Do circles intersect?
|
34
|
+
* Area of circle
|
35
|
+
* Making a ruby gem
|
data/lib/line.rb
CHANGED
@@ -77,5 +77,17 @@ module Geometry
|
|
77
77
|
oa = Math::atan(other.slope)
|
78
78
|
(sa-oa).abs
|
79
79
|
end
|
80
|
+
|
81
|
+
def distance_to(point)
|
82
|
+
x0 = point.x
|
83
|
+
y0 = point.y
|
84
|
+
|
85
|
+
x1 = point1.x
|
86
|
+
x2 = point2.x
|
87
|
+
y1 = point1.y
|
88
|
+
y2 = point2.y
|
89
|
+
|
90
|
+
(((x2-x1)*(y1-y0))-((x1-x0)*(y2-y1))).abs/Math.sqrt((x2-x1)**2+(y2-y1)**2)
|
91
|
+
end
|
80
92
|
end
|
81
93
|
end
|
data/lib/point.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
1
|
module Geometry
|
2
2
|
class Point < Struct.new(:x, :y)
|
3
|
-
def self.new_by_array(array)
|
3
|
+
def self.new_by_array(array)
|
4
4
|
self.new(array[0], array[1])
|
5
5
|
end
|
6
6
|
|
7
7
|
def ==(another_point)
|
8
8
|
x === another_point.x && y === another_point.y
|
9
9
|
end
|
10
|
+
|
11
|
+
def to_vector
|
12
|
+
Vector.new(x, y)
|
13
|
+
end
|
14
|
+
|
15
|
+
def advance_by(vector)
|
16
|
+
Point x + vector.x, y + vector.y
|
17
|
+
end
|
10
18
|
end
|
11
19
|
end
|
12
20
|
|
data/lib/polygon.rb
CHANGED
@@ -21,6 +21,17 @@ module Geometry
|
|
21
21
|
point_in_polygon = PointInPolygon.new(point, self)
|
22
22
|
point_in_polygon.inside? || point_in_polygon.on_the_boundary?
|
23
23
|
end
|
24
|
+
|
25
|
+
def area
|
26
|
+
sum = 0.0
|
27
|
+
(0..vertices.length-1).each do |i|
|
28
|
+
a = vertices[i-1]
|
29
|
+
b = vertices[i]
|
30
|
+
|
31
|
+
sum = sum + ((a.x * b.y) - (a.y * b.x))
|
32
|
+
end
|
33
|
+
(sum/2).abs
|
34
|
+
end
|
24
35
|
end
|
25
36
|
end
|
26
37
|
|
data/lib/segment.rb
CHANGED
@@ -66,6 +66,29 @@ module Geometry
|
|
66
66
|
Point.new(x, y)
|
67
67
|
end
|
68
68
|
|
69
|
+
def distance_to(point)
|
70
|
+
q = point.to_vector
|
71
|
+
p1 = point1.to_vector
|
72
|
+
p2 = point2.to_vector
|
73
|
+
|
74
|
+
u = p2 - p1
|
75
|
+
v = q - p1
|
76
|
+
|
77
|
+
a = u.scalar_product(v)
|
78
|
+
if a < 0
|
79
|
+
p = p1
|
80
|
+
else
|
81
|
+
b = u.scalar_product(u)
|
82
|
+
if a > b
|
83
|
+
p = p2
|
84
|
+
else
|
85
|
+
p = p1 + (a.to_f / b * u)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
return Geometry.distance(q, p)
|
90
|
+
end
|
91
|
+
|
69
92
|
def length
|
70
93
|
Geometry.distance(point1, point2)
|
71
94
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "ruby-geometry"
|
3
|
+
s.version = "0.0.5"
|
4
|
+
s.author = ["Daniel Vartanov"]
|
5
|
+
s.email = ["dan@vartanov.net"]
|
6
|
+
s.homepage = "http://github.com/DanielVartanov/ruby-geometry"
|
7
|
+
s.summary = "Implementation of basic 2D geometry algorithms in Ruby"
|
8
|
+
s.has_rdoc = false
|
9
|
+
s.license = "MIT"
|
10
|
+
|
11
|
+
s.files = `git ls-files`.split($/)
|
12
|
+
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
13
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
14
|
+
s.require_paths = ["lib"]
|
15
|
+
|
16
|
+
s.add_dependency 'activesupport'
|
17
|
+
s.add_dependency 'memoist'
|
18
|
+
|
19
|
+
s.add_development_dependency 'bundler'
|
20
|
+
s.add_development_dependency 'rake'
|
21
|
+
s.add_development_dependency 'minitest'
|
22
|
+
end
|
data/test/line/angle_to_test.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry'
|
3
|
+
|
4
|
+
class DistanceToTest < MiniTest::Unit::TestCase
|
5
|
+
include Geometry
|
6
|
+
|
7
|
+
def test_distance_to_point_on_line
|
8
|
+
line = Line.new_by_arrays([0, 2], [2, 0])
|
9
|
+
point = Point.new(1,1)
|
10
|
+
assert_equal 0, line.distance_to(point)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_distance_to_flat_line
|
14
|
+
line = Line.new_by_arrays([0, 1], [2, 1])
|
15
|
+
point = Point.new(1, 2)
|
16
|
+
assert_equal 1, line.distance_to(point)
|
17
|
+
end
|
18
|
+
end
|
data/test/line/slope_test.rb
CHANGED
data/test/line/vertical_test.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry'
|
3
|
+
|
4
|
+
class AdvanceByTest < MiniTest::Unit::TestCase
|
5
|
+
include Geometry
|
6
|
+
|
7
|
+
def test_advance_by
|
8
|
+
point = Point.new(10, 15)
|
9
|
+
vector = Vector.new(-5, -10)
|
10
|
+
assert_equal Point.new(5, 5), point.advance_by(vector)
|
11
|
+
end
|
12
|
+
end
|
data/test/point/equals_test.rb
CHANGED
data/test/polygon/edges_test.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry'
|
3
|
+
|
4
|
+
class PolygonAreaTest < MiniTest::Unit::TestCase
|
5
|
+
include Geometry
|
6
|
+
def test_area_of_empty_polygon
|
7
|
+
polygon = Polygon.new []
|
8
|
+
|
9
|
+
assert_equal 0, polygon.area
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_area_of_two_points_polygon
|
13
|
+
polygon = Polygon.new [Point(0,0), Point(1,1)]
|
14
|
+
|
15
|
+
assert_equal 0, polygon.area
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_area_of_triangle
|
19
|
+
polygon = Polygon.new [Point(0,0), Point(1,1), Point(0,1)]
|
20
|
+
|
21
|
+
assert_equal 0.5, polygon.area
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_area_of_square
|
25
|
+
polygon = Polygon.new [Point(0,0), Point(0,2), Point(2,2), Point(2,0)]
|
26
|
+
|
27
|
+
assert_equal 4, polygon.area
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_area_of_quadralateral
|
31
|
+
polygon = Polygon.new [Point(4,10), Point(9,7), Point(11,2), Point(2,2)]
|
32
|
+
|
33
|
+
assert_equal 45.5, polygon.area
|
34
|
+
end
|
35
|
+
end
|
data/test/segment/bounds_test.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry'
|
3
|
+
|
4
|
+
class DistanceToTest < MiniTest::Unit::TestCase
|
5
|
+
include Geometry
|
6
|
+
|
7
|
+
def test_distance_to_point_on_segment
|
8
|
+
segment = Segment.new_by_arrays([0, 2], [2, 0])
|
9
|
+
point = Point.new(1,1)
|
10
|
+
assert_equal 0, segment.distance_to(point)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_distance_to_flat_segment
|
14
|
+
segment = Segment.new_by_arrays([0, 1], [2, 1])
|
15
|
+
point = Point.new(1, 2)
|
16
|
+
assert_equal 1, segment.distance_to(point)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_distance_to_segment_start
|
20
|
+
segment = Segment.new_by_arrays([1, 1], [2, 1])
|
21
|
+
point = Point.new(0, 1)
|
22
|
+
assert_equal 1, segment.distance_to(point)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_distance_to_segment_end
|
26
|
+
segment = Segment.new_by_arrays([0, 1], [0, 2])
|
27
|
+
point = Point.new(0, 3)
|
28
|
+
assert_equal 1, segment.distance_to(point)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'geometry'
|
3
3
|
|
4
|
-
class IntersectionPointWithTest <
|
4
|
+
class IntersectionPointWithTest < MiniTest::Unit::TestCase
|
5
5
|
include Geometry
|
6
|
-
|
6
|
+
|
7
7
|
def test_regular_case
|
8
8
|
segment1 = Segment.new_by_arrays([0, 0], [2, 2])
|
9
9
|
segment2 = Segment.new_by_arrays([0, 2], [2, 0])
|
10
10
|
|
11
11
|
assert_equal Point.new(1, 1), segment1.intersection_point_with(segment2)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def test_segments_intersect_at_the_endpoint
|
15
15
|
segment1 = Segment.new_by_arrays([0, 0], [2, 2])
|
16
16
|
segment2 = Segment.new_by_arrays([0, 2], [2, 2])
|
@@ -22,7 +22,7 @@ class IntersectionPointWithTest < Test::Unit::TestCase
|
|
22
22
|
segment1 = Segment.new_by_arrays([0, 0], [0, 2])
|
23
23
|
segment2 = Segment.new_by_arrays([1, 1], [2, 1])
|
24
24
|
|
25
|
-
|
25
|
+
assert_raises SegmentsDoNotIntersect do
|
26
26
|
segment1.intersection_point_with(segment2)
|
27
27
|
end
|
28
28
|
end
|
@@ -31,7 +31,7 @@ class IntersectionPointWithTest < Test::Unit::TestCase
|
|
31
31
|
segment1 = Segment.new_by_arrays([0, 0], [2, 2])
|
32
32
|
segment2 = Segment.new_by_arrays([1, 0], [3, 2])
|
33
33
|
|
34
|
-
|
34
|
+
assert_raises SegmentsDoNotIntersect do
|
35
35
|
segment1.intersection_point_with(segment2)
|
36
36
|
end
|
37
37
|
end
|
@@ -40,12 +40,14 @@ class IntersectionPointWithTest < Test::Unit::TestCase
|
|
40
40
|
segment1 = Segment.new_by_arrays([0, 0], [2, 2])
|
41
41
|
segment2 = Segment.new_by_arrays([1, 1], [3, 3])
|
42
42
|
|
43
|
-
|
43
|
+
assert_raises SegmentsOverlap do
|
44
44
|
segment1.intersection_point_with(segment2)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
def test_segments_parallel_and_have_common_endpoint
|
49
|
+
skip 'Not implemented yet'
|
50
|
+
|
49
51
|
segment1 = Segment.new_by_arrays([0, 0], [1, 0])
|
50
52
|
segment2 = Segment.new_by_arrays([1, 0], [2, 0])
|
51
53
|
|
data/test/segment/length_test.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry'
|
3
|
+
|
4
|
+
class IntersectsTest < MiniTest::Unit::TestCase
|
5
|
+
include Geometry
|
6
|
+
|
7
|
+
def test_segments_parralel_but_on_different_lines
|
8
|
+
segment1 = Segment.new_by_arrays([0, 1], [2, 1])
|
9
|
+
segment2 = Segment.new_by_arrays([0, 0], [2, 0])
|
10
|
+
|
11
|
+
assert ! segment1.lies_on_one_line_with?(segment2)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_segments_are_not_parallel
|
15
|
+
segment1 = Segment.new_by_arrays([0, 0], [2, 0])
|
16
|
+
segment2 = Segment.new_by_arrays([0, 1], [2, 2])
|
17
|
+
|
18
|
+
assert ! segment1.lies_on_one_line_with?(segment2)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_segments_lie_on_one_line
|
22
|
+
segment1 = Segment.new_by_arrays([0, 0], [1, 0])
|
23
|
+
segment2 = Segment.new_by_arrays([2, 0], [3, 0])
|
24
|
+
|
25
|
+
assert segment1.lies_on_one_line_with?(segment2)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_segments_lin_on_one_vertical_line
|
29
|
+
segment1 = Segment.new_by_arrays([0, 0], [0, 1])
|
30
|
+
segment2 = Segment.new_by_arrays([0, 2], [0, 3])
|
31
|
+
|
32
|
+
assert segment1.lies_on_one_line_with?(segment2)
|
33
|
+
end
|
34
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'geometry'
|
3
3
|
|
4
|
-
class OverlapsTest <
|
4
|
+
class OverlapsTest < MiniTest::Unit::TestCase
|
5
5
|
include Geometry
|
6
6
|
|
7
7
|
def test_overlaps
|
@@ -24,6 +24,8 @@ class OverlapsTest < Test::Unit::TestCase
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_lies_on_one_line_and_have_common_endpoint
|
27
|
+
skip 'Not implemented yet'
|
28
|
+
|
27
29
|
segment1 = Segment.new_by_arrays([0, 0], [1, 0])
|
28
30
|
segment2 = Segment.new_by_arrays([1, 0], [2, 0])
|
29
31
|
|
@@ -33,14 +35,14 @@ class OverlapsTest < Test::Unit::TestCase
|
|
33
35
|
def test_lies_on_one_line
|
34
36
|
segment1 = Segment.new_by_arrays([0, 0], [2, 0])
|
35
37
|
segment2 = Segment.new_by_arrays([4, 0], [6, 0])
|
36
|
-
|
38
|
+
|
37
39
|
assert ! segment1.overlaps?(segment2)
|
38
40
|
end
|
39
|
-
|
41
|
+
|
40
42
|
def test_lies_on_one_vertical_line
|
41
43
|
segment1 = Segment.new_by_arrays([0, 0], [0, 1])
|
42
44
|
segment2 = Segment.new_by_arrays([0, 2], [0, 3])
|
43
|
-
|
45
|
+
|
44
46
|
assert ! segment1.overlaps?(segment2)
|
45
47
|
end
|
46
|
-
end
|
48
|
+
end
|
data/test/vector/equals_test.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require '
|
1
|
+
require 'minitest/autorun'
|
2
2
|
require 'geometry'
|
3
3
|
|
4
|
-
class EqualsTest <
|
4
|
+
class EqualsTest < MiniTest::Unit::TestCase
|
5
5
|
include Geometry
|
6
6
|
|
7
|
-
def test_equal
|
7
|
+
def test_equal
|
8
8
|
assert_equal Vector.new(1, 3), Vector.new(1, 3)
|
9
9
|
end
|
10
|
-
|
11
|
-
def test_not_equal
|
12
|
-
|
13
|
-
|
10
|
+
|
11
|
+
def test_not_equal
|
12
|
+
refute_equal Vector.new(1, 3), Vector.new(1, 2)
|
13
|
+
refute_equal Vector.new(1, 2), Vector.new(0, 2)
|
14
14
|
end
|
15
15
|
end
|
data/test/vector/modulus_test.rb
CHANGED
metadata
CHANGED
@@ -1,55 +1,99 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-geometry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Daniel Vartanov
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: memoist
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- -
|
31
|
+
- - '>='
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
36
55
|
- !ruby/object:Gem::Dependency
|
37
56
|
name: rake
|
38
|
-
requirement:
|
39
|
-
none: false
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
40
58
|
requirements:
|
41
|
-
- -
|
59
|
+
- - '>='
|
42
60
|
- !ruby/object:Gem::Version
|
43
61
|
version: '0'
|
44
62
|
type: :development
|
45
63
|
prerelease: false
|
46
|
-
version_requirements:
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
47
83
|
description:
|
48
|
-
email:
|
84
|
+
email:
|
85
|
+
- dan@vartanov.net
|
49
86
|
executables: []
|
50
87
|
extensions: []
|
51
88
|
extra_rdoc_files: []
|
52
89
|
files:
|
90
|
+
- .gitignore
|
91
|
+
- .ruby-version
|
92
|
+
- Gemfile
|
93
|
+
- MIT-LICENSE
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- TODO
|
53
97
|
- lib/algorithms/point_in_polygon.rb
|
54
98
|
- lib/bounding_box.rb
|
55
99
|
- lib/comparison_with_precision.rb
|
@@ -59,9 +103,11 @@ files:
|
|
59
103
|
- lib/polygon.rb
|
60
104
|
- lib/segment.rb
|
61
105
|
- lib/vector.rb
|
106
|
+
- ruby-geometry.gemspec
|
62
107
|
- test/bounding_box/contains_test.rb
|
63
108
|
- test/geometry/distance_test.rb
|
64
109
|
- test/line/angle_to_test.rb
|
110
|
+
- test/line/distance_to_test.rb
|
65
111
|
- test/line/horizontal_test.rb
|
66
112
|
- test/line/initialize_test.rb
|
67
113
|
- test/line/intersect_x_test.rb
|
@@ -70,17 +116,21 @@ files:
|
|
70
116
|
- test/line/vertical_test.rb
|
71
117
|
- test/line/x_intercept_test.rb
|
72
118
|
- test/line/y_intercept_test.rb
|
119
|
+
- test/point/advance_by_test.rb
|
73
120
|
- test/point/equals_test.rb
|
74
121
|
- test/point/initialize_test.rb
|
75
122
|
- test/polygon/bounding_box_test.rb
|
76
123
|
- test/polygon/contains_point_test.rb
|
77
124
|
- test/polygon/edges_test.rb
|
125
|
+
- test/polygon/polygon_area_test.rb
|
78
126
|
- test/segment/bounds_test.rb
|
79
127
|
- test/segment/contains_point_test.rb
|
128
|
+
- test/segment/distance_to_test.rb
|
80
129
|
- test/segment/initialize_test.rb
|
81
130
|
- test/segment/intersection_point_with_test.rb
|
82
131
|
- test/segment/intersects_with_test.rb
|
83
132
|
- test/segment/length_test.rb
|
133
|
+
- test/segment/lie_on_one_line_with.rb
|
84
134
|
- test/segment/overlaps_test.rb
|
85
135
|
- test/segment/parallel_to_test.rb
|
86
136
|
- test/segment/to_vector_test.rb
|
@@ -91,33 +141,34 @@ files:
|
|
91
141
|
- test/vector/modulus_test.rb
|
92
142
|
- test/vector/scalar_product_test.rb
|
93
143
|
homepage: http://github.com/DanielVartanov/ruby-geometry
|
94
|
-
licenses:
|
144
|
+
licenses:
|
145
|
+
- MIT
|
146
|
+
metadata: {}
|
95
147
|
post_install_message:
|
96
148
|
rdoc_options: []
|
97
149
|
require_paths:
|
98
150
|
- lib
|
99
151
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
-
none: false
|
101
152
|
requirements:
|
102
|
-
- -
|
153
|
+
- - '>='
|
103
154
|
- !ruby/object:Gem::Version
|
104
155
|
version: '0'
|
105
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
157
|
requirements:
|
108
|
-
- -
|
158
|
+
- - '>='
|
109
159
|
- !ruby/object:Gem::Version
|
110
160
|
version: '0'
|
111
161
|
requirements: []
|
112
162
|
rubyforge_project:
|
113
|
-
rubygems_version:
|
163
|
+
rubygems_version: 2.2.1
|
114
164
|
signing_key:
|
115
|
-
specification_version:
|
165
|
+
specification_version: 4
|
116
166
|
summary: Implementation of basic 2D geometry algorithms in Ruby
|
117
167
|
test_files:
|
118
168
|
- test/bounding_box/contains_test.rb
|
119
169
|
- test/geometry/distance_test.rb
|
120
170
|
- test/line/angle_to_test.rb
|
171
|
+
- test/line/distance_to_test.rb
|
121
172
|
- test/line/horizontal_test.rb
|
122
173
|
- test/line/initialize_test.rb
|
123
174
|
- test/line/intersect_x_test.rb
|
@@ -126,17 +177,21 @@ test_files:
|
|
126
177
|
- test/line/vertical_test.rb
|
127
178
|
- test/line/x_intercept_test.rb
|
128
179
|
- test/line/y_intercept_test.rb
|
180
|
+
- test/point/advance_by_test.rb
|
129
181
|
- test/point/equals_test.rb
|
130
182
|
- test/point/initialize_test.rb
|
131
183
|
- test/polygon/bounding_box_test.rb
|
132
184
|
- test/polygon/contains_point_test.rb
|
133
185
|
- test/polygon/edges_test.rb
|
186
|
+
- test/polygon/polygon_area_test.rb
|
134
187
|
- test/segment/bounds_test.rb
|
135
188
|
- test/segment/contains_point_test.rb
|
189
|
+
- test/segment/distance_to_test.rb
|
136
190
|
- test/segment/initialize_test.rb
|
137
191
|
- test/segment/intersection_point_with_test.rb
|
138
192
|
- test/segment/intersects_with_test.rb
|
139
193
|
- test/segment/length_test.rb
|
194
|
+
- test/segment/lie_on_one_line_with.rb
|
140
195
|
- test/segment/overlaps_test.rb
|
141
196
|
- test/segment/parallel_to_test.rb
|
142
197
|
- test/segment/to_vector_test.rb
|