| 1523 | } |
| 1524 | |
| 1525 | void ClipperBase::CleanCollinear(OutRec* outrec) |
| 1526 | { |
| 1527 | outrec = GetRealOutRec(outrec); |
| 1528 | if (!outrec || outrec->is_open) return; |
| 1529 | if (!IsValidClosedPath(outrec->pts)) |
| 1530 | { |
| 1531 | DisposeOutPts(outrec); |
| 1532 | return; |
| 1533 | } |
| 1534 | |
| 1535 | OutPt* startOp = outrec->pts, * op2 = startOp; |
| 1536 | for (; ; ) |
| 1537 | { |
| 1538 | //NB if preserveCollinear == true, then only remove 180 deg. spikes |
| 1539 | if (IsCollinear(op2->prev->pt, op2->pt, op2->next->pt) && |
| 1540 | (op2->pt == op2->prev->pt || |
| 1541 | op2->pt == op2->next->pt || !preserve_collinear_ || |
| 1542 | DotProduct(op2->prev->pt, op2->pt, op2->next->pt) < 0)) |
| 1543 | { |
| 1544 | |
| 1545 | if (op2 == outrec->pts) outrec->pts = op2->prev; |
| 1546 | |
| 1547 | op2 = DisposeOutPt(op2); |
| 1548 | if (!IsValidClosedPath(op2)) |
| 1549 | { |
| 1550 | DisposeOutPts(outrec); |
| 1551 | return; |
| 1552 | } |
| 1553 | startOp = op2; |
| 1554 | continue; |
| 1555 | } |
| 1556 | op2 = op2->next; |
| 1557 | if (op2 == startOp) break; |
| 1558 | } |
| 1559 | FixSelfIntersects(outrec); |
| 1560 | } |
| 1561 | |
| 1562 | void ClipperBase::DoSplitOp (OutRec* outrec, OutPt* splitOp) |
| 1563 | { |
nothing calls this directly
no test coverage detected