25 #define FASTEDGELENGTH 256
34 "More accurate approx on wide things");
45 #define fixed_dist 20 //really an int_variable
46 #define approx_dist 15 //really an int_variable
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)
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];
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));
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);
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);