tesseract 4.1.1
Loading...
Searching...
No Matches
split.h File Reference
#include "blobs.h"
#include "params.h"
#include "rect.h"

Go to the source code of this file.

Classes

struct  SPLIT
 

Functions

EDGEPTmake_edgept (int x, int y, EDGEPT *next, EDGEPT *prev)
 
void remove_edgept (EDGEPT *point)
 

Variables

bool wordrec_display_splits = 0
 

Function Documentation

◆ make_edgept()

EDGEPT * make_edgept ( int  x,
int  y,
EDGEPT next,
EDGEPT prev 
)

Definition at line 139 of file split.cpp.

139 {
140 EDGEPT *this_edgept;
141 /* Create point */
142 this_edgept = new EDGEPT;
143 this_edgept->pos.x = x;
144 this_edgept->pos.y = y;
145 // Now deal with the src_outline steps.
146 C_OUTLINE* prev_ol = prev->src_outline;
147 if (prev_ol != nullptr && prev->next == next) {
148 // Compute the fraction of the segment that is being cut.
149 FCOORD segment_vec(next->pos.x - prev->pos.x, next->pos.y - prev->pos.y);
150 FCOORD target_vec(x - prev->pos.x, y - prev->pos.y);
151 double cut_fraction = target_vec.length() / segment_vec.length();
152 // Get the start and end at the step level.
153 ICOORD step_start = prev_ol->position_at_index(prev->start_step);
154 int end_step = prev->start_step + prev->step_count;
155 int step_length = prev_ol->pathlength();
156 ICOORD step_end = prev_ol->position_at_index(end_step % step_length);
157 ICOORD step_vec = step_end - step_start;
158 double target_length = step_vec.length() * cut_fraction;
159 // Find the point on the segment that gives the length nearest to target.
160 int best_step = prev->start_step;
161 ICOORD total_step(0, 0);
162 double best_dist = target_length;
163 for (int s = prev->start_step; s < end_step; ++s) {
164 total_step += prev_ol->step(s % step_length);
165 double dist = fabs(target_length - total_step.length());
166 if (dist < best_dist) {
167 best_dist = dist;
168 best_step = s + 1;
169 }
170 }
171 // The new point is an intermediate point.
172 this_edgept->src_outline = prev_ol;
173 this_edgept->step_count = end_step - best_step;
174 this_edgept->start_step = best_step % step_length;
175 prev->step_count = best_step - prev->start_step;
176 } else {
177 // The new point is poly only.
178 this_edgept->src_outline = nullptr;
179 this_edgept->step_count = 0;
180 this_edgept->start_step = 0;
181 }
182 /* Hook it up */
183 this_edgept->next = next;
184 this_edgept->prev = prev;
185 prev->next = this_edgept;
186 next->prev = this_edgept;
187 /* Set up vec entries */
188 this_edgept->vec.x = this_edgept->next->pos.x - x;
189 this_edgept->vec.y = this_edgept->next->pos.y - y;
190 this_edgept->prev->vec.x = x - this_edgept->prev->pos.x;
191 this_edgept->prev->vec.y = y - this_edgept->prev->pos.y;
192 return this_edgept;
193}
int16_t x
Definition: blobs.h:93
int16_t y
Definition: blobs.h:94
Definition: blobs.h:99
int start_step
Definition: blobs.h:196
EDGEPT * next
Definition: blobs.h:192
int step_count
Definition: blobs.h:197
C_OUTLINE * src_outline
Definition: blobs.h:194
VECTOR vec
Definition: blobs.h:187
EDGEPT * prev
Definition: blobs.h:193
TPOINT pos
Definition: blobs.h:186
ICOORD step(int index) const
Definition: coutln.h:144
ICOORD position_at_index(int index) const
Definition: coutln.h:153
int32_t pathlength() const
Definition: coutln.h:135
integer coordinate
Definition: points.h:32
float length() const
find length
Definition: points.h:78
Definition: points.h:189

◆ remove_edgept()

void remove_edgept ( EDGEPT point)

Definition at line 200 of file split.cpp.

200 {
201 EDGEPT *prev = point->prev;
202 EDGEPT *next = point->next;
203 // Add point's steps onto prev's steps if they are from the same outline.
204 if (prev->src_outline == point->src_outline && prev->src_outline != nullptr) {
205 prev->step_count += point->step_count;
206 }
207 prev->next = next;
208 next->prev = prev;
209 prev->vec.x = next->pos.x - prev->pos.x;
210 prev->vec.y = next->pos.y - prev->pos.y;
211 delete point;
212}

Variable Documentation

◆ wordrec_display_splits

bool wordrec_display_splits = 0
extern

"Display splits"

Definition at line 41 of file split.cpp.