public void updateCabin(Cabin cabin, double deltaTime) { if (deltaTime > 0.2) return; if (cabin.isOn()) { switch (cabin.getState()) { case MOVE: double vector = cabin.getVector(); int vectorUnit = (int) (vector / Math.abs(vector)); double motor = motorOutput * earthGravity * deltaTime; // Nm/s (weight) -> kgfm if (motor <= gravity) { logger.debug("motor is too weak or gravity is too strong."); motor = gravity; } Floor target = cabin.getTarget(); double leftVector = target.getPosition() - cabin.getPosition(); int leftVectorUnit = (int) (leftVector / Math.abs(leftVector)); double accel = motor / mass(cabin) * leftVectorUnit; if (Math.abs(cabin.getVelocity()) > 1) accel *= Math.abs(vector * 0.5) < Math.abs(leftVector) ? 1 : -1; // brake on half point if (Double.isNaN(accel)) { accel = vectorUnit; } // logger.debug(String.format("%f -> %f (%f) : %f",cabin.getPosition(), // target.getPosition(),vector,accel)); // logger.debug(String.format("%s->%d, %f, %f, // %f",cabin.getName(),target.getNum(),accel,leftVector,vector*0.5)); updateCabin(cabin, accel, deltaTime); if (Math.abs(leftVector) < CABIN_MOVE_THRESHOLD) { // arrive cabin.setPosition(target.getPosition()); cabin.stop(); // cabin.getQueue().remove(target); logger.debug(String.format("%s->%d done", cabin.getName(), target.getNum())); } break; case STOP: logger.info("cabin({}) arrived", cabin.getName()); for (Floor floor : floors.values()) { if (cabin.getPosition() == floor.getPosition()) { logger.debug("on {}", floor); Iterator<Passenger> it = cabin.getPassengers().iterator(); while (it.hasNext()) { Passenger p = it.next(); if (p.getDest().equals(floor.getNum())) { p.setState(Passenger.State.NO_WAIT); it.remove(); floor.getPassengers().add(p); } } cabin.getQueue().remove(floor); } } if (cabin.getQueue().size() > 0) cabin.move(); // to next queued floor break; } } }