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(); }
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)); } } */ }