1
2
3
4
5
6
7
8
9
10
11
12 package edu.uci.ics.jung.visualization.control;
13
14 import java.awt.geom.Point2D;
15
16 import edu.uci.ics.jung.visualization.Layer;
17 import edu.uci.ics.jung.visualization.VisualizationServer;
18 import edu.uci.ics.jung.visualization.transform.MutableTransformer;
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public class CrossoverScalingControl implements ScalingControl {
33
34
35
36
37 protected double crossover = 1.0;
38
39
40
41
42
43 public void setCrossover(double crossover) {
44 this.crossover = crossover;
45 }
46
47
48
49
50 public double getCrossover() {
51 return crossover;
52 }
53
54 public void scale(VisualizationServer<?,?> vv, float amount, Point2D at) {
55
56 MutableTransformer layoutTransformer = vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.LAYOUT);
57 MutableTransformer viewTransformer = vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.VIEW);
58 double modelScale = layoutTransformer.getScale();
59 double viewScale = viewTransformer.getScale();
60 double inverseModelScale = Math.sqrt(crossover)/modelScale;
61 double inverseViewScale = Math.sqrt(crossover)/viewScale;
62 double scale = modelScale * viewScale;
63
64 Point2D transformedAt = vv.getRenderContext().getMultiLayerTransformer().inverseTransform(Layer.VIEW, at);
65
66 if((scale*amount - crossover)*(scale*amount - crossover) < 0.001) {
67
68 layoutTransformer.scale(inverseModelScale, inverseModelScale, transformedAt);
69 viewTransformer.scale(inverseViewScale, inverseViewScale, at);
70 } else if(scale*amount < crossover) {
71
72 viewTransformer.scale(amount, amount, at);
73 layoutTransformer.scale(inverseModelScale, inverseModelScale, transformedAt);
74 } else {
75
76 layoutTransformer.scale(amount, amount, transformedAt);
77 viewTransformer.scale(inverseViewScale, inverseViewScale, at);
78 }
79 vv.repaint();
80 }
81 }