beziercurve 0.6 → 0.8
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 +4 -4
- data/lib/beziercurve.rb +68 -15
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7550491650757d1ef4313a11191cb788974cae7
|
4
|
+
data.tar.gz: 66f165775867bf78cec4db74658de8b7a9bce86c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a03fad9c836c26f020f3f5b5e859f9f5268b411cc5583d7022e7cf89f975cfedd16611f3cf20736451fa3d23f2ccb1a308ccf1367cdf3d4d3a50631545bc1464
|
7
|
+
data.tar.gz: a84249c4189caac7f6f80d93dceebab5e29e1a0068e3d6e6ddd370e7e3d491361085703ea70fcafb059ffdd1c8120b3b7aa1520bb33fdd7afc2e75b3323181c4
|
data/lib/beziercurve.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# Curve == series of ControlPoints
|
1
2
|
module Bezier
|
2
3
|
|
3
4
|
class ControlPoint
|
@@ -15,31 +16,50 @@ module Bezier
|
|
15
16
|
def inspect
|
16
17
|
return @x, @y
|
17
18
|
end
|
18
|
-
|
19
|
+
# @return [CurvePoint] Returns a ControlPoint, converted to CurvePoint (only naming differences).
|
20
|
+
def to_curvepoint
|
19
21
|
CurvePoint.new(self.x, self.y)
|
20
22
|
end
|
23
|
+
def to_a
|
24
|
+
[self.x, self.y]
|
25
|
+
end
|
21
26
|
end
|
27
|
+
|
22
28
|
class CurvePoint < ControlPoint
|
23
|
-
# @return [ControlPoint]
|
24
|
-
def
|
29
|
+
# @return [ControlPoint] point coordinates on the Bézier curve.
|
30
|
+
def to_controlpoint
|
25
31
|
ControlPoint.new(self.x, self.y)
|
26
32
|
end
|
27
33
|
end
|
34
|
+
|
28
35
|
class Curve
|
36
|
+
# returns hull control points
|
29
37
|
attr_accessor :controlpoints
|
30
38
|
|
39
|
+
# @param controlpoints [Array<ControlPoints, Array(Fixnum, Fixnum)>] list of ControlPoints defining the hull for the Bézier curve. A point can be of class ControlPoint or an Array containig 2 Fixnums, which will be converted to ControlPoint.
|
40
|
+
# @return [Curve] a Bézier curve object
|
41
|
+
# @example
|
42
|
+
# initialize(p1, p2, p3)
|
43
|
+
# initialize(p1, [20, 30], p3)
|
31
44
|
def initialize(*controlpoints)
|
32
45
|
# need at least 3 control points
|
33
|
-
|
34
|
-
|
46
|
+
# this constraint has to be lifted, to allow adding Curves together like a 1 point curve to a 3 point curve
|
47
|
+
if controlpoints.size < 3
|
48
|
+
raise ArgumentError, 'Cannot create Bézier curve with less than 3 control points'
|
35
49
|
end
|
36
50
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
51
|
+
@controlpoints = controlpoints.map { |e|
|
52
|
+
if e.class == Array
|
53
|
+
ControlPoint.new(*e[0..1]) # make sure ControlPoint.new gets no more than 2 arguments. 'e' should contain at least 2 elements here
|
54
|
+
elsif e.class == ControlPoint
|
55
|
+
e
|
56
|
+
else
|
57
|
+
raise 'Control points should be type of ControlPoint or Array'
|
58
|
+
end
|
59
|
+
}
|
41
60
|
end
|
42
61
|
|
62
|
+
# @param point [ControlPoint] addition
|
43
63
|
def add(point)
|
44
64
|
if point.class == ControlPoint
|
45
65
|
@controlpoints << point
|
@@ -48,9 +68,10 @@ module Bezier
|
|
48
68
|
end
|
49
69
|
end
|
50
70
|
|
71
|
+
# @param t [CurvePoint]
|
51
72
|
def point_on_curve(t)
|
52
73
|
|
53
|
-
def point_on_hull(point1, point2, t) # making this local
|
74
|
+
def point_on_hull(point1, point2, t) # making this method local
|
54
75
|
if (point1.class != ControlPoint) or (point2.class != ControlPoint)
|
55
76
|
raise TypeError, 'Both points should be type of ControlPoint'
|
56
77
|
end
|
@@ -59,7 +80,7 @@ module Bezier
|
|
59
80
|
return ControlPoint.new(new_x, new_y)
|
60
81
|
end
|
61
82
|
|
62
|
-
# imperatively ugly but works, refactor later. point_on_curve and point_on_hull should be one method
|
83
|
+
# imperatively ugly, but works, refactor later. point_on_curve and point_on_hull should be one method
|
63
84
|
ary = @controlpoints
|
64
85
|
return ary if ary.length <= 1 # zero or one element as argument, return unmodified
|
65
86
|
|
@@ -71,10 +92,41 @@ module Bezier
|
|
71
92
|
end
|
72
93
|
ary = temp
|
73
94
|
end
|
74
|
-
return temp[0].
|
95
|
+
return temp[0].to_curvepoint
|
96
|
+
end
|
97
|
+
|
98
|
+
def pascaltriangle(nth_line)
|
99
|
+
# @param n [Fixnum] Ye' olde factorial function
|
100
|
+
# @todo this is slow, should be rewritten
|
101
|
+
# @return [Array] an array of the specified line from the Pascal triangle
|
102
|
+
# @example
|
103
|
+
# > fact(5)
|
104
|
+
# >
|
105
|
+
def fact(n)
|
106
|
+
(1..n).reduce(:*)
|
107
|
+
end
|
108
|
+
|
109
|
+
# @param n [Fixnum]
|
110
|
+
# @param k [Fixnum]
|
111
|
+
def binomial(n,k)
|
112
|
+
return 1 if n-k <= 0
|
113
|
+
return 1 if k <= 0
|
114
|
+
fact(n) / ( fact(k) * fact( n - k ) )
|
115
|
+
end
|
116
|
+
(0..nth_line).map { |e| binomial(nth_line, e) }
|
75
117
|
end
|
76
118
|
|
77
|
-
def
|
119
|
+
def point_on_curve_binom(t)
|
120
|
+
|
121
|
+
# locally scoped, we don't need it outside of point_on_curve_binom
|
122
|
+
|
123
|
+
coeffs = pascaltriangle(self.order)
|
124
|
+
coeffs.reduce { |memo, obj|
|
125
|
+
memo += t**obj * (1-t)** (n - obj)
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
def display_points # just a helper, for quickly put ControlPoints to STDOUT in a gnuplottable format
|
78
130
|
@controlpoints.map{|point| puts "#{point.x} #{point.y}"}
|
79
131
|
end
|
80
132
|
|
@@ -85,14 +137,15 @@ module Bezier
|
|
85
137
|
loop do
|
86
138
|
yielder.yield(number)
|
87
139
|
point_position += delta_t.to_f
|
88
|
-
raise StopIteration if point_position > 1
|
140
|
+
raise StopIteration if point_position > 1.0
|
89
141
|
number = point_on_curve(point_position)
|
90
142
|
end
|
91
143
|
end
|
92
144
|
end
|
93
145
|
|
94
146
|
def order
|
95
|
-
@controlpoints.
|
147
|
+
@controlpoints.size
|
96
148
|
end
|
97
149
|
end
|
150
|
+
|
98
151
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beziercurve
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Földes László
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Creates a Bézier curve by its control points. Implemented with de Casteljau
|
14
14
|
method.
|
@@ -28,17 +28,17 @@ require_paths:
|
|
28
28
|
- lib
|
29
29
|
required_ruby_version: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.0.0
|
34
34
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
35
|
requirements:
|
36
|
-
- -
|
36
|
+
- - ">="
|
37
37
|
- !ruby/object:Gem::Version
|
38
38
|
version: '0'
|
39
39
|
requirements: []
|
40
40
|
rubyforge_project:
|
41
|
-
rubygems_version: 2.
|
41
|
+
rubygems_version: 2.2.2
|
42
42
|
signing_key:
|
43
43
|
specification_version: 4
|
44
44
|
summary: Create and analyze Bézier curves
|