private void callSmoothZoom(double mouseX, double mouseY, int wheelRotation) {
        final double coordX = mouseX;
        final double coordY = mouseY;
        if (wheelRotation < 0) {
            if (timerDoneOut != 0) {
                timerDoneOut = 0;
                timer.cancel();
                timer.purge();
                timer = new Timer();
            }
            timerDoneIn = 0;
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    timerDoneIn += 0.05;
                    drawMapComponent.zoomIn(coordX, coordY);
                    callRepaint();
                    if (timerDoneIn >= 1.2) {
                        timer.cancel();
                        timerDoneIn = 0;
                        timer.purge();
                        timer = new Timer();
                    }
                }
            };
            timer.scheduleAtFixedRate(task, 10, 10);
        } else {
            if (timerDoneIn != 0) {
                timerDoneIn = 0;
                timer.cancel();
                timer.purge();
                timer = new Timer();
            }
            timerDoneOut = 0;
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                    timerDoneOut += 0.05;
                    drawMapComponent.zoomOut(coordX, coordY);
                    callRepaint();
                    if (timerDoneOut >= 1.2) {
                        timer.cancel();
                        timerDoneOut = 0;
                        timer.purge();
                        timer = new Timer();
                    }
                }
            };
            timer.scheduleAtFixedRate(task, 10, 10);
        }
        repaint();
    }