Увеличить график в фокусе мыши

У меня есть пользовательская диаграмма, которую я масштабирую, используя следующий код:

final double SCALE_DELTA = 1.1;
        treePane.setOnScroll(new EventHandler<ScrollEvent>()
        {
            @Override
            public void handle(ScrollEvent event)
            {
                event.consume();

                if (event.getDeltaY() == 0)
                {
                    return;
                }

                double scaleFactor = (event.getDeltaY() > 0) ? SCALE_DELTA : 1 / SCALE_DELTA;

                treePane.setScaleX(treePane.getScaleX() * scaleFactor);
                treePane.setScaleY(treePane.getScaleY() * scaleFactor);
            }
        });

Я заметил, что когда я прокручиваю диаграмму с помощью колесика мыши, я не могу масштабировать диаграмму, на которую указывает моя мышь. Вместо этого диаграмма масштабируется, например, влево или вправо.

Я хотел бы, чтобы при масштабировании с помощью колеса мыши масштабировался график, на который указывает мой курсор. Есть ли решение?


person Peter Penzov    schedule 18.03.2014    source источник


Ответы (1)


Я не работал с javafx, но все равно постараюсь ответить. Исходя из моего опыта работы с Win32Api/GDI и XNA, вы определенно должны уметь читать координаты мыши. Все, что вы показываете, отображается в координатах x, y. Если вы хотите изменить масштаб и приблизиться к местоположению курсора, вы будете перерисовывать с учетом этого: (предположим, что коэффициент масштабирования = z, mouseX и mouseY — координаты мыши, X и Y — новые координаты)
ваш курсор должен указывать в том же пикселе, поэтому, если изображение теперь в z раз больше, координаты мыши будут такими же относительно источника изображения. К этим координатам, по сути, к расстоянию от верхней и левой части изображения, вы должны добавить координаты самого источника, которые должны оставаться неизменными относительно левого верхнего угла окна. В конечном итоге это означает, что mouseX - X = (mouseX - x)*z, что означает X = mouseX - (mouseX - x)*z
То же самое относится и к координате Y. Теоретически это должно работать идеально, я не пробовал это с кодом, но на бумаге это кажется правильным. Вы заметите, что X и Y, кажется, становятся меньше, по сути, они могут даже оказаться отрицательными, поскольку, масштабируя и удерживая мышь на одном и том же пикселе, вы толкаете/растягиваете верхний левый угол дальше вверх и влево, возможно, за пределы экрана. .
Вы, вероятно, будете работать с полосами прокрутки, та же философия их смещения.
Немного поэкспериментируйте с переменными, чтобы они соответствовали режиму рисования, я не знаю, работают ли библиотеки, с которыми вы работаете. начните с экрана (0,0), окна или рабочих областей, поэтому вам придется адаптировать его к остальной части кода, но за этим стоит математика/геометрия.

person user3079666    schedule 28.03.2014