Beispiel #1
0
 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();
 }
Beispiel #2
0
  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];
      }
    }
  }