beziercurve 0.2
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/beziercurve.rb +105 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 74aa0dc585f1edb095064ba09657e27275be7cfc
|
4
|
+
data.tar.gz: 2723fda7a6e4b4a23c94c701da3b9760bac2e847
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 14cd524785cb7c3ba5c6cef5dfb5a8caf91f1e4d4e809e3358f29c1b7f2470374d433a44a0fbc7cdd959056c90acbe8902db5ccab9cc67185e181dc66520ee1b
|
7
|
+
data.tar.gz: 080d20f696ff4c346d4d5200d7abbc56a5bd3fa5d177aa526279b0911e4cd755121d3bb6f1b37dcd3e3520df2682a7af3fa4432a7c290638e24a49f647727df0
|
data/lib/beziercurve.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
module Bezier
|
2
|
+
|
3
|
+
class ControlPoint
|
4
|
+
# maybe replace the accessors and initialization with Struct
|
5
|
+
attr_accessor :x, :y
|
6
|
+
def initialize(x,y)
|
7
|
+
@x = x
|
8
|
+
@y = y
|
9
|
+
end
|
10
|
+
def - (b)
|
11
|
+
self.class.new(self.x - b.x, self.y - b.y)
|
12
|
+
end
|
13
|
+
def + (b)
|
14
|
+
self.class.new(self.x + b.x, self.y + b.y)
|
15
|
+
end
|
16
|
+
def inspect
|
17
|
+
return @x, @y
|
18
|
+
end
|
19
|
+
def to_curve
|
20
|
+
CurvePoint.new(self.x, self.y)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
class CurvePoint < ControlPoint # minimal type safety, but both class have the same functionality
|
24
|
+
def to_control
|
25
|
+
ControlPoint.new(self.x, self.y)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
class Curve
|
29
|
+
attr_accessor :hullpoints
|
30
|
+
|
31
|
+
def initialize(*hullpoints)
|
32
|
+
# need at least 3 control points
|
33
|
+
if hullpoints.length < 3 then
|
34
|
+
raise "Cannot create Bézier curve with less than 3 control points"
|
35
|
+
end
|
36
|
+
|
37
|
+
# check for rogue value types
|
38
|
+
if hullpoints.find {|p| p.class != ControlPoint} == nil
|
39
|
+
@hullpoints = hullpoints
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def add(point)
|
44
|
+
if point.class == ControlPoint
|
45
|
+
@hullpoints << point
|
46
|
+
else
|
47
|
+
raise TypeError, "Point should be type of ControlPoint"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def point_on_curve(t)
|
52
|
+
|
53
|
+
def point_on_hull(point1, point2, t) # making this local
|
54
|
+
if (point1.class != ControlPoint) or (point2.class != ControlPoint)
|
55
|
+
raise TypeError, "Both points should be type of ControlPoint"
|
56
|
+
end
|
57
|
+
new_x = (point1.x - point2.x) * t
|
58
|
+
new_y = (point1.y - point2.y) * t
|
59
|
+
return ControlPoint.new(new_x, new_y)
|
60
|
+
end
|
61
|
+
|
62
|
+
# imperatively ugly but works, refactor later. point_on_curve and point_on_hull should be one method
|
63
|
+
ary = @hullpoints
|
64
|
+
return ary if ary.length <= 1 # zero or one element as argument, return unmodified
|
65
|
+
|
66
|
+
while ary.length > 1
|
67
|
+
temp = []
|
68
|
+
0.upto(ary.length-2) do |index|
|
69
|
+
memoize1 = point_on_hull(ary[index], ary[index+1], t)
|
70
|
+
temp << ary[index+0] - memoize1
|
71
|
+
end
|
72
|
+
ary = temp
|
73
|
+
end
|
74
|
+
return temp[0].to_curve
|
75
|
+
end
|
76
|
+
|
77
|
+
def display_points # just a helper, for quickly put CotrolPOints to STDOUT in a gnuplottable format
|
78
|
+
@hullpoints.map{|point| puts "#{point.x} #{point.y}"}
|
79
|
+
end
|
80
|
+
|
81
|
+
def enumerated(start_t, delta_t)
|
82
|
+
Enumerator.new do |yielder|
|
83
|
+
point_position = start_t.to_f
|
84
|
+
number = point_on_curve(point_position)
|
85
|
+
loop do
|
86
|
+
yielder.yield(number)
|
87
|
+
point_position += delta_t.to_f
|
88
|
+
raise StopIteration if point_position > 1
|
89
|
+
number = point_on_curve(point_position)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def order
|
95
|
+
@hullpoints.length
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
__END__
|
101
|
+
|
102
|
+
bezier = Bezier::Curve.new(Bezier::ControlPoint.new(40,250), Bezier::ControlPoint.new(35,100), Bezier::ControlPoint.new(150,70), Bezier::ControlPoint.new(210,120)) # cubic curve, 4 coordinates
|
103
|
+
|
104
|
+
puts bezier.hullpoints[0].x
|
105
|
+
#puts "#{bezier.point_on_curve(0.013).x} #{bezier.point_on_curve(0.013).y}"
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: beziercurve
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Földes László
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-04 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Creates a Bézier curve by its control points. Implemented with de Casteljau
|
14
|
+
method.
|
15
|
+
email: foldes.laszlo2@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/beziercurve.rb
|
21
|
+
homepage: http://devrandom.postr.hu
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.1.10
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Create Bnd analyze ézier curves
|
45
|
+
test_files: []
|
46
|
+
has_rdoc:
|