private MapleFoothold findWallR(final Point p1, final Point p2) { MapleFoothold ret; for (final MapleFoothold f : footholds) { // if (f.isWall()) System.out.println(f.getX1() + " " + f.getX2()); if (f.isWall() && f.getX1() >= p1.x && f.getX1() <= p2.x && f.getY1() >= p1.y && f.getY2() <= p1.y) { return f; } } if (nw != null) { if (p1.x <= center.x && p1.y <= center.y) { ret = nw.findWallR(p1, p2); if (ret != null) { return ret; } } if ((p1.x > center.x || p2.x > center.x) && p1.y <= center.y) { ret = ne.findWallR(p1, p2); if (ret != null) { return ret; } } if (p1.x <= center.x && p1.y > center.y) { ret = sw.findWallR(p1, p2); if (ret != null) { return ret; } } if ((p1.x > center.x || p2.x > center.x) && p1.y > center.y) { ret = se.findWallR(p1, p2); if (ret != null) { return ret; } } } return null; }
public final void insert(final MapleFoothold f) { if (depth == 0) { if (f.getX1() > maxDropX) { maxDropX = f.getX1(); } if (f.getX1() < minDropX) { minDropX = f.getX1(); } if (f.getX2() > maxDropX) { maxDropX = f.getX2(); } if (f.getX2() < minDropX) { minDropX = f.getX2(); } } if ( /*footholds.size() == 0 || */ depth == maxDepth || (f.getX1() >= p1.x && f.getX2() <= p2.x && f.getY1() >= p1.y && f.getY2() <= p2.y)) { footholds.add(f); } else { if (nw == null) { nw = new MapleFootholdTree(p1, center, depth + 1); ne = new MapleFootholdTree(new Point(center.x, p1.y), new Point(p2.x, center.y), depth + 1); sw = new MapleFootholdTree(new Point(p1.x, center.y), new Point(center.x, p2.y), depth + 1); se = new MapleFootholdTree(center, p2, depth + 1); } if (f.getX2() <= center.x && f.getY2() <= center.y) { nw.insert(f); } else if (f.getX1() > center.x && f.getY2() <= center.y) { ne.insert(f); } else if (f.getX2() <= center.x && f.getY1() > center.y) { sw.insert(f); } else { se.insert(f); } } }
public final MapleFoothold findBelow(final Point p) { final List<MapleFoothold> relevants = getRelevants(p); // find fhs with matching x coordinates final List<MapleFoothold> xMatches = new LinkedList<>(); for (final MapleFoothold fh : relevants) { if (fh.getX1() <= p.x && fh.getX2() >= p.x) { xMatches.add(fh); } } Collections.sort(xMatches); for (final MapleFoothold fh : xMatches) { if (fh.isWall()) { // x1 == x2 -- 墙壁 continue; } if (fh.getY1() != fh.getY2()) { final double s1 = Math.abs(fh.getY2() - fh.getY1()); final double s2 = Math.abs(fh.getX2() - fh.getX1()); final double s4 = Math.abs(p.x - fh.getX1()); final double alpha = Math.atan(s2 / s1); final double beta = Math.atan(s1 / s2); final double s5 = Math.cos(alpha) * (s4 / Math.cos(beta)); int calcY; if (fh.getY2() < fh.getY1()) { calcY = fh.getY1() - (int) s5; } else { calcY = fh.getY1() + (int) s5; } if (calcY >= p.y) { return fh; } } else if (fh.getY1() >= p.y) { return fh; } } return null; }
// To be refined, still inaccurate :( public final boolean checkRelevantFH( final short fromx, final short fromy, final short tox, final short toy) { MapleFoothold fhdata = null; for (final MapleFoothold fh : footholds) { // From if (fh.getX1() <= fromx && fh.getX2() >= fromx && fh.getY1() <= fromy && fh.getY2() >= fromy) { // monster pos is within fhdata = fh; break; } } for (final MapleFoothold fh2 : footholds) { // To if (fh2.getX1() <= tox && fh2.getX2() >= tox && fh2.getY1() <= toy && fh2.getY2() >= toy) { // monster pos is within if (!(fhdata.getId() == fh2.getId() || fh2.getId() == fhdata.getNext() || fh2.getId() == fhdata.getPrev())) { System.out.println("Couldn't find the correct pos for next/prev"); return false; } return true; } } return false; }