-
Notifications
You must be signed in to change notification settings - Fork 0
/
Calculator.java
128 lines (105 loc) · 4.43 KB
/
Calculator.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public class Calculator {
static double[] calcFocusPos = new double[2];
static double t = 0;
static Vector w1, w2, viewVector, rotationVector, directionVector, planeVector1, planeVector2;
static Plane p;
public static double[] calculatePositionP(double[] viewFrom, double[] viewTo, double x, double y, double z)
{
double[] projP = getProj(viewFrom, viewTo, x, y, z, p);
double[] drawP = getDrawP(projP[0], projP[1], projP[2]);
return drawP;
}
public static double[] getProj(double[] viewFrom, double[] viewTo, double x, double y, double z, Plane P)
{
Vector viewToPoint = new Vector(x - viewFrom[0], y - viewFrom[1], z - viewFrom[2]);
t = (P.getRetVector().getX() *P.getP()[0] + P.getRetVector().getY() * P.getP()[1] + P.getRetVector().getZ() * P.getP()[2]
- (P.getRetVector().getX() *viewFrom[0] + P.getRetVector().getY() *viewFrom[1] + P.getRetVector().getZ() * viewFrom[2]))
/ (P.getRetVector().getX() *viewToPoint.getX() + P.getRetVector().getY() * viewToPoint.getY() + P.getRetVector().getZ() * viewToPoint.getZ());
x = viewFrom[0] + viewToPoint.getX() * t;
y = viewFrom[1] + viewToPoint.getY() * t;
z = viewFrom[2] + viewToPoint.getZ() * t;
return new double[] {x, y, z};
}
public static double[] getDrawP(double x, double y, double z)
{
double DrawX = w2.getX() * x + w2.getY() * y + w2.getZ() * z;
double DrawY = w1.getX() * x + w1.getY() * y + w1.getZ() * z;
return new double[]{DrawX, DrawY};
}
public static double clamp(double val, double min, double max) {
if(val > max) {
return(max);
} else if(val < min) {
return(min);
} else {
return(val);
}
}
public static int clamp(int val, int min, int max) {
if(val > max) {
return(max);
} else if(val < min) {
return(min);
} else {
return(val);
}
}
public static double roll(double val, double min, double max) {
if(val > max) {
return(min);
} else if(val < min) {
return(max);
} else {
return(val);
}
}
public static int roll(int val, int min, int max) {
if(val > max) {
return(min);
} else if(val < min) {
return(max);
} else {
return(val);
}
}
public static boolean withinRange(double val, double min, double max) {
return val >= min && val <= max;
}
public static boolean withinRange(int val, int min, int max) {
return val >= min && val <= max;
}
public static double roundTo(double val, double places) {
double scale = Math.pow(10,places);
return Math.round(val * scale) / scale;
}
public static Vector getRotationVector(double[] viewFrom, double[] viewTo)
{
double dx = Math.abs(viewFrom[0]-viewTo[0]);
double dy = Math.abs(viewFrom[1]-viewTo[1]);
double xRot, yRot;
xRot=dy/(dx+dy);
yRot=dx/(dx+dy);
if(viewFrom[1] > viewTo[1]) {
xRot = -xRot;
}
if(viewFrom[0] < viewTo[0]) {
yRot = -yRot;
}
Vector v = new Vector(xRot, yRot, 0);
return v;
}
public static void setPredeterminedInfo()
{
viewVector = new Vector(GameController.viewTo[0] - GameController.viewFrom[0], GameController.viewTo[1] - GameController.viewFrom[1], GameController.viewTo[2] - GameController.viewFrom[2]);
directionVector = new Vector(1, 1, 1);
planeVector1 = viewVector.crossProduct(directionVector);
planeVector2 = viewVector.crossProduct(planeVector1);
p = new Plane(planeVector1, planeVector2, GameController.viewTo);
rotationVector = getRotationVector(GameController.viewFrom, GameController.viewTo);
w1 = viewVector.crossProduct(rotationVector);
w2 = viewVector.crossProduct(w1);
calcFocusPos = calculatePositionP(GameController.viewFrom, GameController.viewTo, GameController.viewTo[0], GameController.viewTo[1], GameController.viewTo[2]);
calcFocusPos[0] = GameController.zoom * calcFocusPos[0];
calcFocusPos[1] = GameController.zoom * calcFocusPos[1];
}
}