public static void finalizeSubCurves(Vector subcurves, Vector chains) { int numchains = chains.size(); if (numchains == 0) { return; } if ((numchains & 1) != 0) { throw new RuntimeException("Odd number of chains!"); } ChainEnd[] endlist = new ChainEnd[numchains]; chains.toArray(endlist); for (int i = 1; i < numchains; i += 2) { ChainEnd open = endlist[i - 1]; ChainEnd close = endlist[i]; CurveLink subcurve = open.linkTo(close); if (subcurve != null) { subcurves.add(subcurve); } } chains.clear(); }
public static void resolveLinks(Vector subcurves, Vector chains, Vector links) { int numlinks = links.size(); CurveLink[] linklist; if (numlinks == 0) { linklist = EmptyLinkList; } else { if ((numlinks & 1) != 0) { throw new RuntimeException("Odd number of new curves!"); } linklist = new CurveLink[numlinks + 2]; links.toArray(linklist); } int numchains = chains.size(); ChainEnd[] endlist; if (numchains == 0) { endlist = EmptyChainList; } else { if ((numchains & 1) != 0) { throw new RuntimeException("Odd number of chains!"); } endlist = new ChainEnd[numchains + 2]; chains.toArray(endlist); } int curchain = 0; int curlink = 0; chains.clear(); ChainEnd chain = endlist[0]; ChainEnd nextchain = endlist[1]; CurveLink link = linklist[0]; CurveLink nextlink = linklist[1]; while (chain != null || link != null) { /* * Strategy 1: * Connect chains or links if they are the only things left... */ boolean connectchains = (link == null); boolean connectlinks = (chain == null); if (!connectchains && !connectlinks) { // assert(link != null && chain != null); /* * Strategy 2: * Connect chains or links if they close off an open area... */ connectchains = ((curchain & 1) == 0 && chain.getX() == nextchain.getX()); connectlinks = ((curlink & 1) == 0 && link.getX() == nextlink.getX()); if (!connectchains && !connectlinks) { /* * Strategy 3: * Connect chains or links if their successor is * between them and their potential connectee... */ double cx = chain.getX(); double lx = link.getX(); connectchains = (nextchain != null && cx < lx && obstructs(nextchain.getX(), lx, curchain)); connectlinks = (nextlink != null && lx < cx && obstructs(nextlink.getX(), cx, curlink)); } } if (connectchains) { CurveLink subcurve = chain.linkTo(nextchain); if (subcurve != null) { subcurves.add(subcurve); } curchain += 2; chain = endlist[curchain]; nextchain = endlist[curchain + 1]; } if (connectlinks) { ChainEnd openend = new ChainEnd(link, null); ChainEnd closeend = new ChainEnd(nextlink, openend); openend.setOtherEnd(closeend); chains.add(openend); chains.add(closeend); curlink += 2; link = linklist[curlink]; nextlink = linklist[curlink + 1]; } if (!connectchains && !connectlinks) { // assert(link != null); // assert(chain != null); // assert(chain.getEtag() == link.getEtag()); chain.addLink(link); chains.add(chain); curchain++; chain = nextchain; nextchain = endlist[curchain + 1]; curlink++; link = nextlink; nextlink = linklist[curlink + 1]; } } }