1
2
3
4
5
6
7
8
9 package edu.uci.ics.jung.visualization.transform;
10
11 import java.awt.Component;
12 import java.awt.geom.Point2D;
13
14 import edu.uci.ics.jung.algorithms.layout.PolarPoint;
15
16
17
18
19
20
21
22
23
24
25
26
27
28 public class MagnifyTransformer extends LensTransformer implements MutableTransformer {
29
30
31
32
33
34
35 public MagnifyTransformer(Component component) {
36 this(component, new MutableAffineTransformer());
37 }
38
39
40
41
42
43
44
45 public MagnifyTransformer(Component component, MutableTransformer delegate) {
46 super(component, delegate);
47 this.magnification = 3.f;
48 }
49
50
51
52
53 public Point2D transform(Point2D graphPoint) {
54 if(graphPoint == null) return null;
55 Point2D viewCenter = getViewCenter();
56 double viewRadius = getViewRadius();
57 double ratio = getRatio();
58
59 Point2D viewPoint = delegate.transform(graphPoint);
60
61 double dx = viewPoint.getX() - viewCenter.getX();
62 double dy = viewPoint.getY() - viewCenter.getY();
63
64 dx *= ratio;
65 Point2D pointFromCenter = new Point2D.Double(dx, dy);
66
67 PolarPoint polar = PolarPoint.cartesianToPolar(pointFromCenter);
68 double theta = polar.getTheta();
69 double radius = polar.getRadius();
70 if(radius > viewRadius) return viewPoint;
71
72 double mag = magnification;
73 radius *= mag;
74
75 radius = Math.min(radius, viewRadius);
76 Point2D projectedPoint = PolarPoint.polarToCartesian(theta, radius);
77 projectedPoint.setLocation(projectedPoint.getX()/ratio, projectedPoint.getY());
78 Point2D translatedBack = new Point2D.Double(projectedPoint.getX()+viewCenter.getX(),
79 projectedPoint.getY()+viewCenter.getY());
80 return translatedBack;
81 }
82
83
84
85
86 public Point2D inverseTransform(Point2D viewPoint) {
87
88 Point2D viewCenter = getViewCenter();
89 double viewRadius = getViewRadius();
90 double ratio = getRatio();
91 double dx = viewPoint.getX() - viewCenter.getX();
92 double dy = viewPoint.getY() - viewCenter.getY();
93
94 dx *= ratio;
95
96 Point2D pointFromCenter = new Point2D.Double(dx, dy);
97
98 PolarPoint polar = PolarPoint.cartesianToPolar(pointFromCenter);
99
100 double radius = polar.getRadius();
101 if(radius > viewRadius) return delegate.inverseTransform(viewPoint);
102
103 double mag = magnification;
104 radius /= mag;
105 polar.setRadius(radius);
106 Point2D projectedPoint = PolarPoint.polarToCartesian(polar);
107 projectedPoint.setLocation(projectedPoint.getX()/ratio, projectedPoint.getY());
108 Point2D translatedBack = new Point2D.Double(projectedPoint.getX()+viewCenter.getX(),
109 projectedPoint.getY()+viewCenter.getY());
110 return delegate.inverseTransform(translatedBack);
111 }
112
113
114
115
116
117
118 public Point2D magnify(Point2D graphPoint) {
119 if(graphPoint == null) return null;
120 Point2D viewCenter = getViewCenter();
121 double ratio = getRatio();
122
123 Point2D viewPoint = graphPoint;
124
125 double dx = viewPoint.getX() - viewCenter.getX();
126 double dy = viewPoint.getY() - viewCenter.getY();
127
128 dx *= ratio;
129 Point2D pointFromCenter = new Point2D.Double(dx, dy);
130
131 PolarPoint polar = PolarPoint.cartesianToPolar(pointFromCenter);
132 double theta = polar.getTheta();
133 double radius = polar.getRadius();
134
135 double mag = magnification;
136 radius *= mag;
137
138
139 Point2D projectedPoint = PolarPoint.polarToCartesian(theta, radius);
140 projectedPoint.setLocation(projectedPoint.getX()/ratio, projectedPoint.getY());
141 Point2D translatedBack = new Point2D.Double(projectedPoint.getX()+viewCenter.getX(),
142 projectedPoint.getY()+viewCenter.getY());
143 return translatedBack;
144 }
145
146 }