-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMapView.java
More file actions
81 lines (67 loc) · 2.21 KB
/
MapView.java
File metadata and controls
81 lines (67 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package view;
import model.map.Cell;
import model.map.Map;
import javax.swing.*;
import java.awt.*;
import java.util.function.Supplier;
/**
* Created by Hadi on 2/3/2015 9:41 AM.
*/
public class MapView extends JPanel {
public static int SIZE_MIN = 7, SIZE_MAX = 70;
public static int DEFAULT_SIZE = 20, DEFAULT_OFF_X = -10, DEFAULT_OFF_Y = -10;
private Supplier<Map> mMapProvider;
private int mSize = DEFAULT_SIZE, mOffX = DEFAULT_OFF_X, mOffY = DEFAULT_OFF_Y;
public MapView(Supplier<Map> mapProvider) {
mMapProvider = mapProvider;
}
public void zoom(Point origin, double amount) {
double cx = origin.getX(), cy = origin.getY();
int newSize = (int) Math.round(mSize * Math.exp(-amount / 10));
newSize = Math.max(newSize, SIZE_MIN);
newSize = Math.min(newSize, SIZE_MAX);
double c = (double)newSize/ mSize;
mOffX = (int) (c*(mOffX + cx) - cx);
mOffY = (int) (c*(mOffY + cy) - cy);
mSize = newSize;
repaint();
}
public void translate(int offX, int offY) {
mOffX -= offX;
mOffY -= offY;
}
public void resetView() {
mSize = DEFAULT_SIZE;
mOffX = DEFAULT_OFF_X;
mOffY = DEFAULT_OFF_Y;
repaint();
}
public void setMapProvider(Supplier<Map> mapProvider) {
mMapProvider = mapProvider;
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle b = g.getClip().getBounds();
g.setColor(Color.WHITE);
g.fillRect(b.x, b.y, b.width, b.height);
if (mMapProvider == null)
return;
Map map = mMapProvider.get();
int h = map.getHeight(), w = map.getWidth();
g.translate(-mOffX, -mOffY);
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
map.at(j, i).paint(g, mSize);
g.translate(mSize, 0);
}
g.translate(-w* mSize, mSize);
}
g.translate(0, -h* mSize);
g.translate(mOffX, mOffY);
}
public Point getMapPoint(Point mousePoint) {
return new Point((mousePoint.x + mOffX)/ mSize, (mousePoint.y + mOffY)/ mSize);
}
}