#include "mfcpch.h"
#include <stdio.h>
#include "polyaprx.h"
#include "params.h"
#include "tprintf.h"
Go to the source code of this file.
| #define FASTEDGELENGTH 256 |
| #define FIXED 4 /*OUTLINE point is fixed */ |
| #define RUNLENGTH 1 /*length of run */ |
Definition at line 59 of file polyaprx.cpp.
64 EDGEPT* edgepts = stack_edgepts;
73 area = loop_box.
width();
77 edgept =
poly2 (edgepts, area);
84 new_pt->
prev = prev_result;
85 if (prev_result ==
NULL) {
88 prev_result->
next = new_pt;
89 new_pt->
prev = prev_result;
92 edgept = edgept->
next;
94 while (edgept != startpt);
95 prev_result->
next = result;
96 result->
prev = prev_result;
97 if (edgepts != stack_edgepts)
EXTERN bool poly_wide_objects_better
void fix2(EDGEPT *start, int area)
const TBOX & bounding_box() const
static TESSLINE * BuildFromOutlineList(EDGEPT *outline)
EDGEPT * poly2(EDGEPT *startpt, int area)
EDGEPT * edgesteps_to_edgepts(C_OUTLINE *c_outline, EDGEPT edgepts[])
Definition at line 484 of file polyaprx.cpp.
500 if (edge->
next == last)
506 if (vecsum.
x == 0 && vecsum.
y == 0) {
512 vlen = vecsum.
x > 0 ? vecsum.
x : -vecsum.
x;
515 else if (-vecsum.
y > vlen)
521 squaresum = ptcount = 0;
525 perp =
CROSS (vec, vecsum);
532 tprintf (
"Cutline:Final perp=%d\n", perp);
533 if (perp > maxperp) {
537 vec.
x += edge->
vec.
x;
538 vec.
y += edge->
vec.
y;
541 while (edge != last);
556 perp = (squaresum << 8) / (perp * ptcount);
559 perp = (squaresum / perp << 8) / ptcount;
562 tprintf (
"Cutline:A=%d, max=%.2f(%.2f%%), msd=%.2f(%.2f%%)\n",
563 area, maxperp / 256.0, maxperp * 200.0 / area,
564 perp / 256.0, perp * 300.0 / area);
565 if (maxperp *
par1 >= 10 * area || perp *
par2 >= 10 * area || vlen >= 126) {
568 cutline(first, maxpoint, area);
DLLSYM void tprintf(const char *format,...)
void cutline(EDGEPT *first, EDGEPT *last, int area)
Definition at line 110 of file polyaprx.cpp.
133 dir = c_outline->
step_dir (stepindex);
134 vec = c_outline->
step (stepindex);
135 if (stepindex < length - 1
136 && c_outline->
step_dir (stepindex + 1) - dir == -32) {
138 vec += c_outline->
step (stepindex + 1);
148 edgepts[epindex].
pos.
x = pos.
x ();
149 edgepts[epindex].
pos.
y = pos.
y ();
151 edgepts[epindex].
vec.
x = prev_vec.
x ();
152 edgepts[epindex].
vec.
y = prev_vec.
y ();
155 edgepts[epindex].
prev = &edgepts[epindex - 1];
157 edgepts[epindex].
next = &edgepts[epindex + 1];
159 epdir = (
DIR128) 0 - prevdir;
162 edgepts[epindex].
flags[
DIR] = epdir;
170 stepindex += stepinc;
172 while (stepindex < length);
173 edgepts[epindex].
pos.
x = pos.
x ();
174 edgepts[epindex].
pos.
y = pos.
y ();
176 edgepts[epindex].
vec.
x = prev_vec.
x ();
177 edgepts[epindex].
vec.
y = prev_vec.
y ();
181 edgepts[epindex].
prev = &edgepts[epindex - 1];
182 edgepts[epindex].
next = &edgepts[0];
184 epdir = (
DIR128) 0 - prevdir;
187 edgepts[epindex].
flags[
DIR] = epdir;
188 edgepts[0].
prev = &edgepts[epindex];
inT16 x() const
access function
const ICOORD & start_pos() const
ICOORD step(inT16 index) const
inT16 y() const
access_function
DIR128 step_dir(inT16 index) const
| void fix2 |
( |
EDGEPT * |
start, |
|
|
int |
area |
|
) |
| |
Definition at line 201 of file polyaprx.cpp.
206 register EDGEPT *loopstart;
207 register EDGEPT *linestart;
208 register int dir1, dir2;
209 register int sum1, sum2;
212 int d01, d12, d23, gapmin;
213 TPOINT d01vec, d12vec, d23vec;
214 register EDGEPT *edgefix, *startfix;
215 register EDGEPT *edgefix0, *edgefix1, *edgefix2, *edgefix3;
222 edgept = edgept->
next;
232 edgept = edgept->
next;
236 if (((dir1 - dir2 + 1) & 7) < 3) {
238 edgept = edgept->
next;
246 if (edgept == loopstart)
253 linestart = linestart->
prev;
258 || (edgept->
flags[
DIR] == dir1 && sum1 >= sum2)
260 || (edgept->
flags[
DIR] == dir2 && sum2 >= sum1))
261 && linestart->
next != edgept))
262 edgept = edgept->
next;
268 while (edgept != loopstart && !stopped);
277 edgept1 = edgept->
next;
280 edgept = edgept->
next;
282 while (edgept != start);
297 edgept = edgept->
next;
299 while (edgept != start);
312 edgept = edgept->
next;
314 while (edgept != start);
316 edgept = edgept->
next;
319 edgept = edgept->
next;
321 edgept = edgept->
next;
324 edgept = edgept->
next;
326 edgept = edgept->
next;
329 edgept = edgept->
next;
331 edgept = edgept->
next;
337 if (fixed_count <= 3)
366 edgept = edgept->
next;
368 if (edgept == startfix)
370 edgept = edgept->
next;
375 while ((edgefix != startfix) && (!stopped));
#define point_diff(p, p1, p2)
Definition at line 386 of file polyaprx.cpp.
392 register EDGEPT *linestart;
393 register int edgesum;
409 edgept = edgept->
next;
411 while (edgept != startpt);
427 edgept = edgept->
next;
430 && edgept != loopstart && edgesum < 126);
433 (
"Poly2:starting at (%d,%d)+%d=(%d,%d),%d to (%d,%d)\n",
435 linestart->
vec.
x, linestart->
vec.
y, edgesum, edgept->
pos.
x,
438 cutline(linestart, edgept, area);
441 && edgept != loopstart)
442 edgept = edgept->
next;
445 while (edgept != loopstart);
450 edgept = edgept->
next;
453 while (edgept != loopstart);
461 edgept = edgept->
next;
464 linestart->
next = edgept;
465 edgept->
prev = linestart;
469 while (edgept != loopstart);
DLLSYM void tprintf(const char *format,...)
void cutline(EDGEPT *first, EDGEPT *last, int area)
"More accurate approx on wide things"
Definition at line 34 of file polyaprx.cpp.