Я рисую на холсте лабиринт. Я хочу позволить пользователю увеличивать и уменьшать масштаб лабиринта, нажимая кнопку CTRL и кнопку поворота мыши. но мне нужно, чтобы масштабирование основывалось на местоположении мыши.
мой код работает, но он делает масштабирование всегда в верхнем левом углу лабиринта, а не на основе местоположения мыши.
как сделать действие увеличения / уменьшения масштаба на основе местоположения мыши?
в моем файле F XML, который я объявил:
onScroll="#Zoom"
в моем В основном классе управления я объявил функцию масштабирования:
public void Zoom(ScrollEvent scrollEvent) {
mazeDisplayer.zoom(scrollEvent);
}
, которая вызывает класс MazeDisplayer, расширяющий холст:
package View;
import algorithms.mazeGenerators.Maze;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Alert;
import javafx.scene.image.Image;
import javafx.scene.input.ScrollEvent;
import javafx.scene.paint.Color;
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class MazeDisplayer extends Canvas {
private Maze m;
private int row_player;
private int col_player;
private SolDisplayer solDisplayer;
private double for_zoom =1.05;
// public static int d=0;
StringProperty imageFileNameWall = new SimpleStringProperty();
StringProperty imageFileNamePlayer = new SimpleStringProperty();
StringProperty imageFileNameEnd = new SimpleStringProperty();
public int getRow_player() {
return row_player;
}
public int getCol_player() {
return col_player;
}
public void set_player_position(int row, int col){
this.row_player = row;
this.col_player = col;
draw();
}
public void set_player_position_without_draw(int row, int col){
this.row_player = row;
this.col_player = col;
}
public void drawMaze(Maze maze)
{
this.m = maze;
draw();
}
public void draw()
{
if( m!=null)
{
double canvasHeight = getHeight();
double canvasWidth = getWidth();
int row = m.getNumOfRows();
int col = m.getNumOfCols();
double cellHeight = canvasHeight/row;
double cellWidth = canvasWidth/col;
GraphicsContext graphicsContext = getGraphicsContext2D();
graphicsContext.clearRect(0,0,canvasWidth,canvasHeight);
graphicsContext.setFill(Color.CHOCOLATE);
double w,h;
int [][] matrix=m.getMatrix();
//Draw Maze
Image wallImage = null;
try {
wallImage = new Image(new FileInputStream(getImageFileNameWall()));
} catch (FileNotFoundException e) {
System.out.println("There is no file....");
}
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(matrix[i][j] == 1) // Wall
{
h = i * cellHeight;
w = j * cellWidth;
if (wallImage == null){
graphicsContext.fillRect(w,h,cellWidth,cellHeight);
}else{
graphicsContext.drawImage(wallImage,w,h,cellWidth,cellHeight);
}
}
}
}
{
double h_player=this.getRow_player() * cellHeight;
double w_player=this.getCol_player() * cellWidth;
Image playerImage = null;
try {
playerImage = new Image(new FileInputStream(getImageFileNamePlayer()));
} catch (FileNotFoundException e) {
System.out.println("There is no Image player....");
}
graphicsContext.drawImage(playerImage,w_player,h_player,cellWidth,cellHeight);
}
double h_end = this.m.getGoalPosition().getRowIndex() * cellHeight;
double w_end = this.m.getGoalPosition().getColumnIndex() * cellWidth;
Image endImage = null;
try {
endImage = new Image(new FileInputStream(getImageFileNameEnd()));
} catch (FileNotFoundException e) {
System.out.println("There is no Image player....");
}
graphicsContext.drawImage(endImage,w_end,h_end,cellWidth,cellHeight);
}
}
public void zoom (ScrollEvent scrollEvent){
if(scrollEvent.isControlDown()) {
if (scrollEvent.getDeltaY() < 0)
{
setHeight(getHeight() / for_zoom);
setWidth(getWidth() / for_zoom);
draw();
}
}
if (scrollEvent.getDeltaY() > 0) {
if(getWidth()>6300 || getHeight()>6300)
setHeight(getHeight()*for_zoom);
setWidth(getWidth() * for_zoom);
draw();
}
}
}
}
}