示例#1
0
  private void movelim(XYPoint lhf, XYPoint lh, XYPoint le, XYPoint ls, Spring lrad, Spring lhum) {
    XYPoint lhn = lh.add(lhf);
    Circle lhc = new Circle(lhn, lrad.length);
    Circle lsc = new Circle(ls, lhum.length);

    XYPoint[] inter = lhc.intersect(lsc);

    // still need to check angle constraints

    if (inter != null) {
      lh.set(lhn);
      double d1 = inter[0].distance(le);
      double d2 = inter[1].distance(le);
      if (d1 < d2) {
        le.set(inter[0]);
      } else {
        le.set(inter[1]);
      }
    }
    lhf.zero();
  }
示例#2
0
  public void update(GameComponent canvas, Wall wall) {
    /*
     * forces.zero(); for (XYPoint f : forces) { f.translate(new
     * XYPoint(0.0,-0.001)); }
     *
     * forces.get(points.indexOf(lh)).translate(lhf); lhf.zero();
     *
     * // spring force for (Spring s : springs) {
     * forces.get(s.p1index).translate(s.p1force());
     * forces.get(s.p2index).translate(s.p2force()); }
     *
     * // damperner for (int i = 0; i< springs.size(); i++) { Spring s =
     * springs.get(i); XYPoint v1 = forces.get(s.p1index); XYPoint v2 =
     * forces.get(s.p2index); XYPoint vel1 = velocity.get(s.p1index);
     * XYPoint vel2 = velocity.get(s.p2index);
     *
     * XYPoint dif = vel1.sub(vel2); XYPoint v1d = dif.scale(0.1); XYPoint
     * v2d = dif.scale(-0.1); v1.translate(v2d); v2.translate(v1d); }
     *
     *
     * for (int i = 0; i< velocity.size(); i++) {
     * velocity.get(i).translate(forces.get(i)); }
     *
     *
     *
     *
     * for (int i = 0; i< points.size(); i++) { XYPoint p = points.get(i);
     * p.translate(velocity.get(i)); if (p.y < 0.2) { p.y = 0.2; } }
     */

    if (lhf.length() > 0.0) {
      movelim(lhf, lh, le, ls, lRad, lHum);
    }

    if (rhf.length() > 0.0) {
      movelim(rhf, rh, re, rs, rRad, rHum);
    }

    if (lff.length() > 0.0) {
      movelim(lff, lf, ln, p, lFem, lTib);
    }

    if (rff.length() > 0.0) {
      movelim(rff, rf, rn, p, rFem, rTib);
    }

    if (bf.length() > 0.0) {
      if (canmovelim(bf, rh, re, rs, rRad, rHum)
          && canmovelim(bf, lf, ln, p, lFem, lTib)
          && canmovelim(bf, lh, le, ls, lRad, lHum)
          && canmovelim(bf, rf, rn, p, rFem, rTib)) {
        domovelim(bf, rh, re, rs, rRad, rHum);
        domovelim(bf, lf, ln, p, lFem, lTib);
        domovelim(bf, lh, le, ls, lRad, lHum);
        domovelim(bf, rf, rn, p, rFem, rTib);
        p.translate(bf);
        n.translate(bf);
        ls.translate(bf);
        rs.translate(bf);
        bf.zero();
      }
    }

    /*
     * // reset the lengths for (Spring s : springs) { XYPoint p1 =
     * points.get(s.p1index); XYPoint p2 = points.get(s.p2index); XYPoint
     * dif1 = s.p1distance().scale(0.6); XYPoint dif2 =
     * s.p1distance().scale(-0.3); p2.translate(dif1); p1.translate(dif2); }
     *
     * // limit the angles
     *
     * for (Joint j : joints) { XYPoint v1 = j.s1.vector(); XYPoint v2 =
     * j.s2.vector();
     *
     * double angle = v1.angle(v2);
     *
     *
     * if (angle < j.mina) { XYPoint v2r = v2.rotate(-(angle-j.mina));
     * points.get(j.s2.p2index).set(points.get(j.s2.p1index).add(v2r)); }
     * else if (angle > j.maxa) { XYPoint v2r = v2.rotate((j.maxa-angle));
     * points.get(j.s2.p2index).set(points.get(j.s2.p1index).add(v2r)); } }
     */

  }