public synchronized void update()
	{
		if (isVisible)
		{
			currentTime += TIME_INTERVAL;
			visibleDuration += MainFrame.UPDATE_FQ;
			double newDrawingX = initPos.x + initSpeed.x * currentTime;
			double newDrawingY = initPos.y + initSpeed.y * currentTime + 0.5 * GRAVITATION * currentTime * currentTime;

			if (newDrawingY <= 1e-14)
			{
				initSpeed.y *= RESTITUTION_C;
				if (initSpeed.y <= 1e-14)
					initSpeed.y = -initSpeed.y;

				if (initSpeed.y <= 1 + 1e-14)
				{
					initSpeed.y = 0;
					newDrawingY = -1;
				}

				setInitPos(new Point((int) newDrawingX, (int) -newDrawingY));
				setDrawingX((int) newDrawingX);
				setDrawingY((int) (parentContainerDimen.height + newDrawingY));
				currentTime = 0;
			}
			else if (newDrawingX >= parentContainerDimen.width - WIDTH)
			{
				initSpeed.x *= -1;

				setInitPos(new Point((int) (2 * (parentContainerDimen.width - WIDTH) - initPos.x), initPos.y));
				newDrawingX = initPos.x + initSpeed.x * currentTime;
				newDrawingY = initPos.y + initSpeed.y * currentTime + 0.5 * GRAVITATION * currentTime * currentTime;

				setDrawingX((int) newDrawingX);
				setDrawingY((int) (parentContainerDimen.height - newDrawingY));
			}
			else
			{
				setDrawingX((int) newDrawingX);
				setDrawingY((int) (parentContainerDimen.height - newDrawingY));
			}

			if (visibleDuration > timeVisibleLimit && color.getAlpha() > 0)
			{
				color = new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) (color.getAlpha() * ALPHA_DECRASING_FACTOR));
				strokeColor = new Color(strokeColor.getRed(), strokeColor.getGreen(), strokeColor.getBlue(), (int) (strokeColor.getAlpha() * ALPHA_DECRASING_FACTOR));
			}

			if (color.getAlpha() == 0 || newDrawingX > parentContainerDimen.width)
				isVisible = false;
		}
	}