Exemplo n.º 1
0
function subdivideArc(cx, cy, r, start, end, n, invertDirection) {

  var diff = (invertDirection) ? start-end : end-start;
  var theta = diff / (n - 1);

  cx = split(cx);
  cy = split(cy);

  r = split(r);

  var tangent = split(tan(theta));
  var radial = split(cos(theta));

  var x = mul(r, split(cos(start)));
  var y = mul(r, split(sin(start)));

  var ret = Array(n);

  for (var i=0; i<n; i++) {
    ret[i] = [
      num(add(x, cx)),
      num(add(y, cy))
    ];

    var tx = scale(y, -1);
    var ty = x;

    x = mul(add(x, mul(tx, tangent)), radial);
    y = mul(add(y, mul(ty, tangent)), radial);
  }

  return ret;
}
function selfIntersections(poly, filterFn) {
  var seen = {};
  var l = poly.length;
  var isects = [];
  for (var o=0; o<l; o++) {
    var s0 = poly[o];
    var e0 = poly[(o+1) % l];
    arrayOrObject(s0, oc);
    arrayOrObject(e0, on);
    for (var p=0; p<l; p++) {
      if (o === p) { continue; }

      var s1 = poly[p]
      var e1 = poly[(p+1) % l];
      arrayOrObject(s1, pc);
      arrayOrObject(e1, pn);

      if (cmp(pc, oc) || cmp(pc, on) || cmp(pn, oc) || cmp(pn, on)) {
        continue;
      }

      var r = isect(oc, on, pc, pn);
      // since these are homogeneous vectors, if the last component `w` is 0
      // then we've done something wrong
      var wraw = r[2];
      if (wraw.length === 1 && !wraw[0]) {
        continue;
      }

      var w = float(r[2]);
      r[0] = float(r[0]) / w;
      r[1] = float(r[1]) / w;
      r.pop();

      if (cmp(r, oc) || cmp(r, on) || cmp(r, pc) || cmp(r, pn)) {
        continue;
      }

      var key = r+'';
      var unique = !seen[key];
      if (unique) {
        seen[key] = true;
      }

      var collect = unique;
      if (filterFn) {
        collect = filterFn(r, o, s0, e0, p, s1, e1, unique);
      }

      if (collect) {
        isects.push(r);
      }
    }
  }

  return isects;
}