minimal-convex-hull 0.0.3
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/lib/minimal-convex-hull-by-Grahem.rb +48 -0
- data/lib/minimal-convex-hull-by-Jarvis.rb +50 -0
- data/lib/minimal-convex-hull.rb +3 -0
- data/lib/point.rb +31 -0
- metadata +75 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: bad9e380dcea4521b6828cee2104ba8390deb43fcbff13b62248de60a42138c9
|
|
4
|
+
data.tar.gz: 33d51934114a9218a23db4892ccf44a8166838927c86bc61a6440192bf62f7d5
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1098117452cf5dd98b1ceded1bbd1abc53f0aec1626aeeae08a611b7846822233190638bc0ccb42d2effae9ae84c3f2afdd4676df984748cd92812b25107aa59
|
|
7
|
+
data.tar.gz: 898759a553f9cda237f2e8d0faead7857b0666a65007a366d8501c745d3603efe5d31e43fb714be00b41522e1831e63d7abbea455242b1c19f345032d50fdcf5
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require "point"
|
|
2
|
+
|
|
3
|
+
class GrahemAlrotithm
|
|
4
|
+
private
|
|
5
|
+
|
|
6
|
+
def self.rotate(a, b, c)
|
|
7
|
+
return (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
public
|
|
11
|
+
|
|
12
|
+
def self.convex_hull(points)
|
|
13
|
+
n = points.length
|
|
14
|
+
if n < 2
|
|
15
|
+
return points.clone
|
|
16
|
+
end
|
|
17
|
+
p = (0...n).to_a
|
|
18
|
+
for i in 0...n
|
|
19
|
+
if points[p[i]].x < points[p[0]].x
|
|
20
|
+
p[i], p[0] = p[0], p[i]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
for i in 2...n
|
|
25
|
+
j = i
|
|
26
|
+
while j>1 && (rotate(points[p[0]], points[p[j-1]], points[p[j]])<0)
|
|
27
|
+
p[j], p[j-1] = p[j-1], p[j]
|
|
28
|
+
j -= 1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
s = [p[0], p[1]]
|
|
33
|
+
for i in 2...n
|
|
34
|
+
while rotate(points[s[-2]], points[s[-1]], points[p[i]]) < 0
|
|
35
|
+
s.pop
|
|
36
|
+
end
|
|
37
|
+
s << p[i]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
result = []
|
|
41
|
+
for i in 0..s.length-1
|
|
42
|
+
if not result.include? points[s[i]]
|
|
43
|
+
result << points[s[i]]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
return result
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require "point"
|
|
2
|
+
|
|
3
|
+
class JarvisAlrotithm
|
|
4
|
+
private
|
|
5
|
+
|
|
6
|
+
def self.rotate(a, b, c)
|
|
7
|
+
return (b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
public
|
|
11
|
+
|
|
12
|
+
def self.convex_hull(points)
|
|
13
|
+
n = points.length
|
|
14
|
+
if n < 2
|
|
15
|
+
return points.clone
|
|
16
|
+
end
|
|
17
|
+
p = (0...n).to_a
|
|
18
|
+
for i in 1...n
|
|
19
|
+
if points[p[i]].x < points[p[0]].x
|
|
20
|
+
p[i], p[0] = p[0], p[i]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
h = [p[0]]
|
|
25
|
+
p.delete_at(0)
|
|
26
|
+
p.push(h[0])
|
|
27
|
+
|
|
28
|
+
loop do
|
|
29
|
+
right = 0
|
|
30
|
+
for i in 1...p.length
|
|
31
|
+
if rotate(points[h[-1]], points[p[right]], points[p[i]]) < 0
|
|
32
|
+
right = i
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
if p[right] == h[0]
|
|
36
|
+
break
|
|
37
|
+
else
|
|
38
|
+
h.push(p[right])
|
|
39
|
+
p.delete_at(right)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
result = []
|
|
43
|
+
for i in 0..h.length-1
|
|
44
|
+
if not result.include? points[h[i]]
|
|
45
|
+
result << points[h[i]]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
return result
|
|
49
|
+
end
|
|
50
|
+
end
|
data/lib/point.rb
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
class Point
|
|
2
|
+
attr_accessor :x, :y, :eps
|
|
3
|
+
|
|
4
|
+
def initialize(x, y)
|
|
5
|
+
@x = x
|
|
6
|
+
@y = y
|
|
7
|
+
@eps = 0.0001
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def ==(other)
|
|
11
|
+
(@x - other.x).abs < eps && (@y - other.y).abs < eps
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_s
|
|
15
|
+
"(#{@x},#{@y})"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def angle_with_origin
|
|
19
|
+
Math.atan2(@y, @x)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def distance_to(other_point)
|
|
23
|
+
Math.hypot(@x - other_point.x, @y - other_point.y)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def orientation(p1, p2)
|
|
27
|
+
val = (p2.y - p1.y) * (@x - p2.x) - (p2.x - p1.x) * (@y - p2.y)
|
|
28
|
+
return 0 if val == 0
|
|
29
|
+
val.positive? ? 1 : 2
|
|
30
|
+
end
|
|
31
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: minimal-convex-hull
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.3
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Mikhail Pokhodeev
|
|
8
|
+
- Konstantin Pinchuk
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2024-06-02 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: rake
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
requirements:
|
|
18
|
+
- - "~>"
|
|
19
|
+
- !ruby/object:Gem::Version
|
|
20
|
+
version: '13.0'
|
|
21
|
+
type: :development
|
|
22
|
+
prerelease: false
|
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - "~>"
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
version: '13.0'
|
|
28
|
+
- !ruby/object:Gem::Dependency
|
|
29
|
+
name: minitests
|
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
|
31
|
+
requirements:
|
|
32
|
+
- - "~>"
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: 5.15.0
|
|
35
|
+
type: :development
|
|
36
|
+
prerelease: false
|
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - "~>"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: 5.15.0
|
|
42
|
+
description: Grahem's and Jarvis's algorithms finding minimal convex hull
|
|
43
|
+
email: mishapohodeev@yandex.ru
|
|
44
|
+
executables: []
|
|
45
|
+
extensions: []
|
|
46
|
+
extra_rdoc_files: []
|
|
47
|
+
files:
|
|
48
|
+
- lib/minimal-convex-hull-by-Grahem.rb
|
|
49
|
+
- lib/minimal-convex-hull-by-Jarvis.rb
|
|
50
|
+
- lib/minimal-convex-hull.rb
|
|
51
|
+
- lib/point.rb
|
|
52
|
+
homepage: https://github.com/MihailPohodeev/Minimal-Convex-Hull_RUBY-GEM/issues?q=is%3Aissue+is%3Aclosed
|
|
53
|
+
licenses:
|
|
54
|
+
- MIT
|
|
55
|
+
metadata: {}
|
|
56
|
+
post_install_message:
|
|
57
|
+
rdoc_options: []
|
|
58
|
+
require_paths:
|
|
59
|
+
- lib
|
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
|
+
requirements:
|
|
62
|
+
- - ">="
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
version: '0'
|
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
|
+
requirements:
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
requirements: []
|
|
71
|
+
rubygems_version: 3.3.15
|
|
72
|
+
signing_key:
|
|
73
|
+
specification_version: 4
|
|
74
|
+
summary: MCH!
|
|
75
|
+
test_files: []
|