Java - Масштабирование холста относительно определенной точки

Я более или менее закончил очень простой симулятор планетарной гравитации с использованием ньютоновской физики. Он может трансформировать и масштабировать планеты для панорамирования и масштабирования. Это отлично работает, ввод с помощью мыши и все такое. Проблема у меня больше эстетическая, чем что-либо еще. Поскольку начало холста находится в верхнем левом углу окна (внутри JPanel, внутри JFrame), все масштабируется относительно этой точки. Мне было интересно, есть ли способ установить начало координат в центр экрана или масштабировать в определенной точке? (Несмотря на то, что AffineTransform.scale() имеет только один конструктор с аргументами scaleX и scaleY). Я попытался установить границы холста как отрицательные числа как таковые:

canvas.setBounds(-width/2, -height/2, width/2, height/2);

(Ширина и высота - это размер экрана).

Очевидно, это не работает, так как отрицательные числа находятся вне координат панели.

Так кто-нибудь знает, как это сделать? Либо установка центра экрана в качестве начала координат, либо масштабирование относительно определенной точки, а не начала координат?


person Jack O'Connor    schedule 01.09.2013    source источник


Ответы (1)


Хитрость здесь заключается в объединении экземпляров AffineTransform.

  1. Переместите всю визуализацию так, чтобы центр находился в исходной точке.
  2. Масштабируйте визуализацию.
  3. Переместите центр рендеринга (теперь в исходную точку) обратно в центр вида.
person Andrew Thompson    schedule 02.09.2013