for (CircularList<EdgePt>.CircListIter cli = this.circListIterator();
cli.hasNext();) {
EdgePt epThis = cli.getNext();
EdgePt epNext = cli.getNextNext();
// see if this edge crosses the split point
Point ptThis = epThis.getPos();
Point ptNext = epNext.getPos();
if (ptThis.getX() >= nX) {
mbLeft = false;
}
if ((ptThis.getX() < nX) != (ptNext.getX() < nX)) {
int nY = ptThis.getY() + (ptNext.getY() - ptThis.getY()) *
(nX - ptThis.getX()) / (ptNext.getX() - ptThis.getX());
SortableCircListIter scliThis =
new SortableCircListIter(nY, cli.clone());
if (scliLast == null) {
scliLast = scliThis;
} else {
sep.add(new Pair<SortableCircListIter,SortableCircListIter>
(scliLast, scliThis));
scliLast = null;
}
}
cli.next();
}
assert scliLast == null;
if (sep.size() == 0) {
ArrayList<EdgePts> al = new ArrayList<EdgePts>();
al.add(this);
if (mbLeft) {
return new Pair<List<EdgePts>, List<EdgePts>>(al, null);
} else {
return new Pair<List<EdgePts>, List<EdgePts>>(null, al);
}
}
this.resetTraversed();
ArrayList<CircularList<EdgePt>.CircListIter> alcliLeft =
new ArrayList<CircularList<EdgePt>.CircListIter>(),
alcliRight = new ArrayList<CircularList<EdgePt>.CircListIter>();
for (Pair<SortableCircListIter,SortableCircListIter> prscli:
sep) {
SortableCircListIter sepTop = prscli.getFirst();
SortableCircListIter sepBottom = prscli.getSecond();
EdgePts.CircListIter cliTop = sepTop.getCircListIter();
EdgePts.CircListIter cliBottom = sepBottom.getCircListIter();
if (cliTop.getNext().getPos().getX() < cliBottom.getNext().getPos().getX()) {
Point ptTop = new Point(nX-1, sepTop.getY());
Point ptBottom = new Point(nX, sepBottom.getY());
insertAndSplit(cliTop, cliBottom, ptTop, ptBottom);
alcliLeft.add(new CircListIter(cliTop));
alcliRight.add(new CircListIter(cliBottom));
} else {
Point ptTop = new Point(nX, sepTop.getY());
Point ptBottom = new Point(nX-1, sepBottom.getY());
insertAndSplit(cliTop, cliBottom, ptTop, ptBottom);
alcliRight.add(new CircListIter(cliTop));
alcliLeft.add(new CircListIter(cliBottom));
}