Вам нужно будет отслеживать прямоугольник сложной плоскости, которую вы показываете пользователю. Для этого вы можете использовать класс Rectangle2D.Double
в java .awt.geom. Исходный прямоугольник имеет верхний левый угол -2 + 2i, ширину и высоту 4:
Rectangle2D.Double viewRect = new Rectangle2D.Double(-2, 2, 4, 4);
Вам нужно переместить код чертежа за пределы конструктора, чтобы он мог запускаться более одного раза, и отрегулируйте его так, чтобы он учитывал текущее значение viewRect
:
float xmin = viewRect.x;
float ymin = viewRect.y;
float xscale = viewRect.width/w;
float yscale = viewRect.height/h;
Когда вы добавляете методы, чтобы получать уведомления о перетаскивании мышью, вам нужно будет вычислить новый viewRect. Верхний левый угол соответствует комплексному номеру, с которого началось перетаскивание. Поскольку в Java нет класса комплексных чисел, давайте временно использовать Point2D.Double
:
Point2D.Double dragStartComplex = new Point2D.Double(
viewRect.x + viewRect.width * dragStart.x/w,
viewRect.y - viewRect.height * dragStart.y/h);
Аналогично вы можете выяснить, на каком комплексном числе закончилось перетаскивание:
Point2D.Double dragEndComplex = new Point2D.Double(
viewRect.x + viewRect.width * dragEnd.x/w,
viewRect.y - viewRect.height * dragEnd.y/h);
Один раз у вас есть углы, вы можете вычислить новый прямоугольник вида. После этого вы будете перекрашивать.
viewRect.setRect(dragStartPoint.x, dragStartPoint.y,
dragEndPoint.x-dragStartPoint.x, dragEndPoint.y-dragStartPoint.y);
Это небольшое упрощение, потому что ничто не гарантирует, что пользователь всегда будет перетаскивать слева направо и сверху вниз. Для поддержки других направлений перетаскивания вам нужно будет перетаскивать координаты, чтобы (viewRect.x, viewRect.y) всегда находился в верхнем левом углу.