contrek 1.1.7 → 1.1.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +50 -23
  5. data/ext/cpp_polygon_finder/PolygonFinder/CMakeLists.txt +19 -11
  6. data/ext/cpp_polygon_finder/PolygonFinder/clean.sh +28 -0
  7. data/ext/cpp_polygon_finder/PolygonFinder/examples/example.cpp +4 -2
  8. data/ext/cpp_polygon_finder/PolygonFinder/src/Tests.cpp +1 -1
  9. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.cpp +2 -0
  10. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Node.h +2 -0
  11. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/NodeCluster.cpp +66 -61
  12. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Primitives.h +14 -0
  13. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ClippedPolygonFinder.h +1 -1
  14. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.cpp +86 -23
  15. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cluster.h +3 -0
  16. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cursor.cpp +23 -29
  17. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Cursor.h +7 -12
  18. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Finder.cpp +12 -9
  19. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Finder.h +2 -1
  20. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.cpp +55 -0
  21. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.h +32 -0
  22. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp +1 -1
  23. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.cpp +21 -0
  24. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Polyline.h +4 -0
  25. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Queueable.h +1 -0
  26. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Sequence.cpp +14 -0
  27. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Sequence.h +14 -0
  28. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.cpp +15 -6
  29. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.h +11 -3
  30. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp +42 -0
  31. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h +34 -0
  32. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp +72 -11
  33. data/ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.h +9 -1
  34. data/ext/cpp_polygon_finder/cpp_polygon_finder.cpp +4 -0
  35. data/lib/contrek/finder/concurrent/cluster.rb +58 -9
  36. data/lib/contrek/finder/concurrent/cursor.rb +10 -6
  37. data/lib/contrek/finder/concurrent/finder.rb +8 -2
  38. data/lib/contrek/finder/concurrent/inner_polyline.rb +49 -0
  39. data/lib/contrek/finder/concurrent/polyline.rb +46 -0
  40. data/lib/contrek/finder/concurrent/sequence.rb +21 -0
  41. data/lib/contrek/finder/concurrent/shape.rb +29 -2
  42. data/lib/contrek/finder/concurrent/tile.rb +36 -7
  43. data/lib/contrek/finder/node.rb +3 -1
  44. data/lib/contrek/finder/node_cluster.rb +56 -48
  45. data/lib/contrek/version.rb +1 -1
  46. data/lib/contrek.rb +1 -0
  47. metadata +9 -2
@@ -6,7 +6,7 @@ module Contrek
6
6
 
7
7
  def initialize(h, options)
8
8
  @options = options
9
- @vert_nodes = Array.new(h) { [] } # per y immetto i nodi
9
+ @vert_nodes = Array.new(h) { [] }
10
10
  @sequences = []
11
11
  @polygons = []
12
12
  @treemap = []
@@ -76,57 +76,60 @@ module Contrek
76
76
  plot_node(next_node, root_node, bounds, versus, @options[:strict_bounds]) if @nodes > 0 && !next_node.nil?
77
77
 
78
78
  draw_sequence(bitmap, "X") unless bitmap.nil?
79
- @polygons << {outer: @sequence_coords, inner: [], bounds: (bounds.to_h if @options[:bounds])}.compact if @sequence_coords.size >= 2
80
- @sequences << @plot_sequence
81
-
82
- @count = 0
83
- index_inner = 0
84
- while @inner_plot.size > 0
85
- @plot_sequence = []
86
- @sequence_coords = []
87
- # mia test
88
- first = @inner_plot.find { |x| x.tangs_count <= 2 } || @inner_plot.first
89
-
90
- @plot_sequence << first
91
- @inner_plot.delete(first)
92
- @root_nodes.delete(first)
93
-
94
- first.inner_index = index_inner
95
-
96
- # @count += 1
97
- # if @count > 10000
98
- # puts "Houston, we have a problem!"
99
- # break
100
- # end
101
-
102
- next_node = if (first.track & Contrek::Finder::Node::OMAX) != 0
103
- if inner_v == :a
104
- vert_nodes[first.y + Node::T_UP][first.upper_start]
79
+
80
+ if @sequence_coords.size >= 2
81
+ @polygons << {outer: @sequence_coords, inner: [], bounds: (bounds.to_h if @options[:bounds])}.compact
82
+ @sequences << @plot_sequence
83
+
84
+ @count = 0
85
+ index_inner = 0
86
+ while @inner_plot.size > 0
87
+ @plot_sequence = []
88
+ @sequence_coords = []
89
+ # mia test
90
+ first = @inner_plot.find { |x| x.tangs_count <= 2 } || @inner_plot.first
91
+
92
+ @plot_sequence << first
93
+ @inner_plot.delete(first)
94
+ @root_nodes.delete(first)
95
+
96
+ first.inner_index = index_inner
97
+
98
+ # @count += 1
99
+ # if @count > 10000
100
+ # puts "Houston, we have a problem!"
101
+ # break
102
+ # end
103
+
104
+ next_node = if (first.track & Contrek::Finder::Node::OMAX) != 0
105
+ if inner_v == :a
106
+ vert_nodes[first.y + Node::T_UP][first.upper_start]
107
+ else
108
+ vert_nodes[first.y + Node::T_DOWN][first.lower_start]
109
+ end
110
+ elsif inner_v == :a
111
+ vert_nodes[first.y + Node::T_DOWN][first.lower_end]
105
112
  else
106
- vert_nodes[first.y + Node::T_DOWN][first.lower_start]
113
+ vert_nodes[first.y + Node::T_UP][first.upper_end]
107
114
  end
108
- elsif inner_v == :a
109
- vert_nodes[first.y + Node::T_DOWN][first.lower_end]
110
- else
111
- vert_nodes[first.y + Node::T_UP][first.upper_end]
112
- end
113
115
 
114
- if !next_node.nil?
115
- @sequence_coords << next_node.coords_entering_to(first, inner_v, Contrek::Finder::Node::INNER)
116
- end
116
+ if !next_node.nil?
117
+ @sequence_coords << next_node.coords_entering_to(first, inner_v, Contrek::Finder::Node::INNER)
118
+ end
117
119
 
118
- plot_inner_node(next_node, inner_v, first, root_node, options[:strict_bounds]) if !next_node.nil?
120
+ plot_inner_node(next_node, inner_v, first, root_node, options[:strict_bounds]) if !next_node.nil?
119
121
 
120
- draw_sequence(bitmap, "+") unless bitmap.nil?
122
+ draw_sequence(bitmap, "+") unless bitmap.nil?
121
123
 
122
- @polygons.last[:inner] << @sequence_coords
124
+ @polygons.last[:inner] << @sequence_coords
123
125
 
124
- @inner_plot.grab(@inner_new)
125
- index_inner += 1
126
+ @inner_plot.grab(@inner_new)
127
+ index_inner += 1
128
+ end
129
+ # tree
130
+ @treemap << ((versus == :a) ? test_in_hole_a(root_node) : test_in_hole_o(root_node)) if @options.has_key?(:treemap)
131
+ index_order += 1
126
132
  end
127
- # tree
128
- @treemap << ((versus == :a) ? test_in_hole_a(root_node) : test_in_hole_o(root_node)) if @options.has_key?(:treemap)
129
- index_order += 1
130
133
  end
131
134
  end
132
135
 
@@ -141,7 +144,7 @@ module Contrek
141
144
  tnext = @vert_nodes[node.y][start_right]
142
145
  if tnext.outer_index == cindex
143
146
  if (tnext.track & Contrek::Finder::Node::IMIN) != 0
144
- return [cindex, prev.inner_index]
147
+ return [cindex, (prev.inner_right_index == -1) ? prev.inner_left_index : prev.inner_right_index]
145
148
  else
146
149
  return [-1, -1]
147
150
  end
@@ -165,7 +168,7 @@ module Contrek
165
168
  tnext = @vert_nodes[node.y][start_right]
166
169
  if tnext.outer_index == cindex
167
170
  if (tnext.track & Contrek::Finder::Node::IMAX) != 0
168
- return [cindex, prev.inner_index]
171
+ return [cindex, (prev.inner_left_index == -1) ? prev.inner_right_index : prev.inner_left_index]
169
172
  else
170
173
  return [-1, -1]
171
174
  end
@@ -191,13 +194,19 @@ module Contrek
191
194
  # coordinates in @sequence_coords
192
195
  def plot_inner_node(node, versus, stop_at, start_node, strict_bounds = false)
193
196
  node.outer_index = start_node.outer_index
194
- node.inner_index = stop_at.inner_index
195
197
  @root_nodes.delete(node)
196
198
  @inner_plot.delete(node)
197
199
  last_node = @plot_sequence.last
198
200
  next_node = node.my_next(last_node, versus, :inner)
199
201
  @plot_sequence << node
200
202
 
203
+ first_is_max = ((node.y > last_node.y) == (versus == :a))
204
+ if first_is_max
205
+ node.inner_right_index = stop_at.inner_index if node.inner_right_index == -1
206
+ elsif node.inner_left_index == -1
207
+ node.inner_left_index = stop_at.inner_index
208
+ end
209
+
201
210
  plot = true
202
211
  if next_node.y == last_node.y
203
212
  virtual_index = node.tangs_sequence.send((versus == :a) ? :first : :last)
@@ -211,7 +220,6 @@ module Contrek
211
220
  end
212
221
  end
213
222
  elsif strict_bounds
214
- first_is_max = ((node.y > last_node.y) == (versus == :a))
215
223
  @sequence_coords << {y: node.y, x: (first_is_max ? last_node.max_x : last_node.min_x)}
216
224
  @sequence_coords << {y: node.y, x: (first_is_max ? next_node.min_x : next_node.max_x)}
217
225
  end
@@ -1,3 +1,3 @@
1
1
  module Contrek
2
- VERSION = "1.1.7"
2
+ VERSION = "1.1.8"
3
3
  end
data/lib/contrek.rb CHANGED
@@ -29,6 +29,7 @@ require "contrek/finder/concurrent/position"
29
29
  require "contrek/finder/concurrent/sequence"
30
30
  require "contrek/finder/concurrent/shape"
31
31
  require "contrek/finder/concurrent/tile"
32
+ require "contrek/finder/concurrent/inner_polyline"
32
33
  require "contrek/finder/concurrent/polyline"
33
34
  require "contrek/finder/concurrent/cluster"
34
35
  require "contrek/finder/concurrent/finder"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contrek
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
4
+ version: 1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emanuele Cesaroni
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-23 00:00:00.000000000 Z
11
+ date: 2026-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -143,6 +143,7 @@ files:
143
143
  - contrek.png
144
144
  - ext/cpp_polygon_finder/PolygonFinder/CMakeLists.txt
145
145
  - ext/cpp_polygon_finder/PolygonFinder/LICENSE_AGPL.txt
146
+ - ext/cpp_polygon_finder/PolygonFinder/clean.sh
146
147
  - ext/cpp_polygon_finder/PolygonFinder/examples/example.cpp
147
148
  - ext/cpp_polygon_finder/PolygonFinder/images/graphs_1024x1024.png
148
149
  - ext/cpp_polygon_finder/PolygonFinder/images/labyrinth.png
@@ -176,6 +177,7 @@ files:
176
177
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Polygon.h
177
178
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.cpp
178
179
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/PolygonFinder.h
180
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/Primitives.h
179
181
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/RectBounds.h
180
182
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ClippedPolygonFinder.cpp
181
183
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ClippedPolygonFinder.h
@@ -193,6 +195,8 @@ files:
193
195
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/HorizontalMerger.h
194
196
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Hub.cpp
195
197
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Hub.h
198
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.cpp
199
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/InnerPolyline.h
196
200
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.cpp
197
201
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Merger.h
198
202
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Part.cpp
@@ -213,6 +217,8 @@ files:
213
217
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Sequence.h
214
218
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.cpp
215
219
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Shape.h
220
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.cpp
221
+ - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/ShapePool.h
216
222
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.cpp
217
223
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/Tile.h
218
224
  - ext/cpp_polygon_finder/PolygonFinder/src/polygon/finder/concurrent/VerticalMerger.cpp
@@ -259,6 +265,7 @@ files:
259
265
  - lib/contrek/finder/concurrent/finder.rb
260
266
  - lib/contrek/finder/concurrent/horizontal_merger.rb
261
267
  - lib/contrek/finder/concurrent/hub.rb
268
+ - lib/contrek/finder/concurrent/inner_polyline.rb
262
269
  - lib/contrek/finder/concurrent/listable.rb
263
270
  - lib/contrek/finder/concurrent/merger.rb
264
271
  - lib/contrek/finder/concurrent/part.rb