-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathHistogram.java
99 lines (84 loc) · 2.64 KB
/
Histogram.java
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package chapter_sixteen;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
public class Histogram extends Pane
{
private int[] letters;
public Histogram(int[] letters)
{
this.letters = letters;
paint();
}
public void rePaint(int[] letters)
{
this.letters = letters;
getChildren().clear();
paint();
}
private void paint()
{
// x Axis
Line xAxis = new Line();
xAxis.setStartX(0);
xAxis.startYProperty().bind(heightProperty().divide(2));
xAxis.endXProperty().bind(widthProperty());
xAxis.endYProperty().bind(heightProperty().divide(2));
getChildren().add(xAxis);
// draw letters
for (int i = 0; i < 26; i++)
{
char letter = (char) (i + 65);
Text text = new Text(letter + "");
text.yProperty().bind(heightProperty().divide(2).add(20));
text.xProperty().bind(widthProperty().divide(26).multiply(i));
getChildren().add(text);
}
// draw statics
shrink(10);
int maxIndex = getMaxIndex();
int minIndex = getMinIndex();
int divisor = (letters[minIndex] == 0)? 1 : letters[maxIndex] - letters[minIndex];
for (int i = 0; i < 26; i++)
{
if (letters[i] != 0)
{
Rectangle rectangle = new Rectangle();
rectangle.setFill(Color.WHITE); rectangle.setStroke(Color.BLACK);
rectangle.xProperty().bind(widthProperty().divide(26).multiply(i));
rectangle.yProperty().bind(heightProperty().divide(2).
subtract(heightProperty().divide(26).multiply(letters[i]/divisor)));
rectangle.widthProperty().bind(widthProperty().divide(26).divide(2));
rectangle.heightProperty().bind(heightProperty().divide(26).multiply(letters[i]/divisor));
getChildren().add(rectangle);
}
}
}
private int getMaxIndex()
{
int index = 0;
for (int i = 0; i < 26; i++)
{
if (letters[i] > letters[index])
index = i;
}
return index;
}
private int getMinIndex()
{
int index = 0;
for (int i = 0; i < 26; i++)
{
if (letters[i] < letters[index])
index = i;
}
return index;
}
private void shrink(int factor)
{
for (int i = 0; i < letters.length; i++)
letters[i] /= factor;
}
}