openscad-text 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/openscad-text/text.rb +33 -75
  3. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 43a63d477c0edce76d183dee6bccaaf00476e27d
4
- data.tar.gz: b0312d5bb40ce4ab95cd36b5074f844308049a88
3
+ metadata.gz: f135ca27a17a3fe7cb2cfdf46c1523b03f309ef0
4
+ data.tar.gz: 858a02acf97aeed8d7e7cf1fac8f3975e96dbe72
5
5
  SHA512:
6
- metadata.gz: c9542371859bc731095c76cb0b1eba9defd3b301ceeb80def74eabff0f0ae4b35985ed09c8e41e9268212b7cbd6e67c36b138cb5f1382a891435e1c08f1d751f
7
- data.tar.gz: 5ea9bf4824ac2f8c3a80618c45d59d3c7d8da19b7a9359e5edc1d5e856c0ccba51ad7562060d698aea451011adb1620f7f324fdd4461375167419a376f09f2e7
6
+ metadata.gz: 180046888ad588d800db4f4ca2b3b3a0c54f254d674e21cb62fcd128d525790bbd26333183f1ac4d4d3a5cac4deefa50c121cd05868dce109673cb38b1390f5e
7
+ data.tar.gz: a8dd610d9c7d493fd95f8872fc9a23ed1dd5e764848b76b95f77efdb4edf424126d66b19375c197d6d36ca9fb48b64d4cc6be9c6d547e502c9ebcca15924c40b
@@ -1,32 +1,3 @@
1
- class Text
2
- # This yields 8 vectors turned counter-clockwise 45 degrees each
3
- class TurnVector
4
- include Enumerable
5
- VECTORS = [
6
- Vector[-1, 0],
7
- Vector[-1,-1],
8
- Vector[ 0,-1],
9
- Vector[ 1,-1],
10
- Vector[ 1, 0],
11
- Vector[ 1, 1],
12
- Vector[ 0, 1],
13
- Vector[-1, 1],
14
- ].freeze
15
-
16
- def initialize(state)
17
- @state = VECTORS.find_index Vector[*state]
18
- end
19
-
20
- def each
21
- VECTORS.length.times do
22
- @state = 0 if @state >= VECTORS.length
23
- yield VECTORS[@state]
24
- @state += 1
25
- end
26
- end
27
- end
28
- end
29
-
30
1
  # Represents a Text with a font
31
2
  class Text
32
3
  include Magick
@@ -96,28 +67,44 @@ class Text
96
67
  ].uniq - [[x,y]]
97
68
  end
98
69
 
99
- def find_next_point(last, current)
100
- state = Vector[*last] - Vector[*current]
101
- vecs = TurnVector.new(state).to_a
70
+ # finds next point in chain from current point
71
+ def find_next_point(current)
72
+ # 8 vectors turned counter-clockwise 45 degrees each
73
+ vecs = [
74
+ Vector[-1, 0],
75
+ Vector[-1,-1],
76
+ Vector[ 0,-1],
77
+ Vector[ 1,-1],
78
+ Vector[ 1, 0],
79
+ Vector[ 1, 1],
80
+ Vector[ 0, 1],
81
+ Vector[-1, 1],
82
+ ]
102
83
 
103
- # are we going in the wrong direction?
104
- #vecs.reverse! if @matrix[*(Vector[*current]+vecs[1]).to_a] == :black
84
+ # color of the last pixel
85
+ last_color = @matrix[*(Vector[*current]+vecs.last).to_a]
105
86
 
106
87
  # turn the vector and find each which touches a white pixel
107
- last = :black
108
88
  touchy_vecs = vecs.map.with_index do |vec,i|
109
- color = @matrix[*(Vector[*current]+vec).to_a]
110
- color_changed = color != last
111
- last = vec
112
-
89
+ current_color = @matrix[*(Vector[*current]+vec).to_a]
90
+ color_changed = current_color != last_color
91
+ last_color = current_color
92
+
93
+ # return a vec or nil
113
94
  if color_changed
114
95
  # return the black point of the two touching the borderline
115
- color == :black ? vec : vecs[i-1]
96
+ if current_color == :black
97
+ vec
98
+ else
99
+ # the one before vec, if i==0 the last one is the one before
100
+ i-1 >= 0 ? vecs[i-1] : vecs.last
101
+ end
116
102
  end
117
103
  end
118
104
 
119
105
  #remove nil(s) and duplicates
120
- touchy_vecs.compact!.uniq!
106
+ touchy_vecs.compact!
107
+ touchy_vecs.uniq!
121
108
 
122
109
  # possible next points
123
110
  touchy_points = touchy_vecs.map { |vec| (Vector[*current] + vec).to_a }
@@ -129,45 +116,17 @@ class Text
129
116
  touchy_points[0]
130
117
  end
131
118
 
132
- # finds one possible last point from current_point
133
- def find_last_point(current_point)
134
- t = TurnVector.new([-1,-1]).to_a
135
-
136
- # ary with bools true for :black, false for :white
137
- is_black = t.map { |vec| @matrix[*(Vector[*current_point]+vec).to_a] == :black }
138
-
139
- possible_vecs = []
140
- is_black.each_cons(2).with_index do |cons,i|
141
- a,b = cons
142
- if ! a and b
143
- possible_vecs << t[i+1]
144
- elsif a and ! b
145
- possible_vecs << t[i]
146
- end
147
- end
148
-
149
- # corner cases for [false, false, true, true]
150
- # and [true, true, false, false]
151
- # then the first/last one is also a border point
152
- possible_vecs << t.first if ! is_black.first and is_black.last
153
- possible_vecs << t.last if is_black.first and ! is_black.last
154
-
155
- # return last point
156
- (possible_vecs.first + Vector[*current_point]).to_a
157
- end
158
-
159
119
  # starting with point(x,y), try to create a path (or chain)
160
120
  # until the starting point is reached again
161
121
  def create_pixel_chain(x,y)
162
122
  # can't create a chain if the point is invalid
163
123
  return if point_invalid?(x,y)
164
124
 
165
- # create a new ary in the faces ary
125
+ # create a new ary in the paths ary
166
126
  @paths << []
167
127
 
168
128
  # setup state
169
129
  current_point = [x,y]
170
- last_point = find_last_point(current_point)
171
130
 
172
131
  while current_point
173
132
  # add the point to the points array
@@ -177,9 +136,7 @@ class Text
177
136
  @paths.last << @points.count - 1
178
137
 
179
138
  # try to find next point (nil if none was found)
180
- next_point = find_next_point(last_point, current_point)
181
- last_point = current_point
182
- current_point = next_point
139
+ current_point = find_next_point(current_point)
183
140
  end
184
141
  end
185
142
 
@@ -196,15 +153,16 @@ class Text
196
153
  @points = []
197
154
  @paths = []
198
155
 
199
- # create a matrix from pixels
156
+ # draw an image of the text and create a matrix from its pixels
200
157
  @matrix = create_image.pixel_matrix
201
158
 
202
159
  # go through each point aka pixel to make sure it gets used once
160
+ # and try to retrace the letters
203
161
  @matrix.each_with_index do |_,x,y|
204
162
  create_pixel_chain(x,y)
205
163
  end
206
164
 
207
- # align it!
165
+ # align them!
208
166
  align_points
209
167
 
210
168
  # finished woop woop
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openscad-text
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Lackner