-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcolored_points.rb
More file actions
80 lines (65 loc) · 1.88 KB
/
colored_points.rb
File metadata and controls
80 lines (65 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
require 'ruby-processing'
class Centroid
attr_accessor :vector, :size, :color
def initialize vector, size, color
@vector, @size, @color = vector, size, color
end
end
class ColoredPoints < Processing::App
def setup
size 500, 500
smooth
centroid_size = 10
@points_size = 5
@centroids = []
15.times do
@centroids << Centroid.new(PVector.new(rand(width), rand(height)), centroid_size, [rand(255), rand(255), rand(255)])
end
@points = []
100.times do
@points << PVector.new(rand(width), rand(height))
end
PVector.public_methods.sort.each {|m| puts m}
end
def draw
background 200
groups = {}
stroke(0)
fill(0)
@points.each do |p|
closest = get_closest(p, @centroids)
groups[closest] = [] unless groups.has_key?(closest)
groups[closest] << p
stroke(closest.color[0], closest.color[1], closest.color[2])
fill(closest.color[0], closest.color[1], closest.color[2])
ellipse(p.x, p.y, @points_size, @points_size)
end
@centroids.each do |c|
if groups.has_key?(c)
x = groups[c].inject(0) {|sum, p| sum += p.x}
x /= groups.size
y = groups[c].inject(0) {|sum, p| sum += p.y}
y /= groups.size
direction = PVector.sub(PVector.new(c.vector.x, c.vector.y), PVector.new(x, y))
direction.normalize
c.vector.sub(direction)
end
stroke(0)
fill(c.color[0], c.color[1], c.color[2])
ellipse(c.vector.x, c.vector.y, c.size, c.size)
end
end
def get_closest point, centroids
closest_v= PVector.new(width*2, height*2)
closest = nil
centroids.each do |c|
centroid_v = PVector.new(c.vector.x, c.vector.y)
if point.dist(centroid_v) < point.dist(closest_v)
closest_v = centroid_v
closest = c
end
end
closest
end
end
ColoredPoints.new :title => "Colored Points"