-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathVector.java
More file actions
145 lines (129 loc) · 2.94 KB
/
Vector.java
File metadata and controls
145 lines (129 loc) · 2.94 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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* Ein 2D-Vektor.
*
* @author Poul Henriksen
* @author Michael Kolling
*
* @version 2.0
*/
public final class Vector {
private double dx;
private double dy;
private int direction;
private double length;
/**
* Erzeugt einen neuen neutralen Vektor.
*/
public Vector() {
}
/**
* Erzeugt einen Vektor einer gegebenen Richtung und L�nge. Die Richtung sollte im Bereich [0..359]
* liegen, wobei 0 OSTEN ist und die Grade im Uhrzeigersinn zunehmen.
*/
public Vector(int direction, double length) {
this.length = length;
this.direction = direction;
updateCartesian();
}
/**
* Erzeugt einen Vektor durch Angabe der X- und Y-Abst�nde zwischen Anfangs- und Endpunkt und
* skaliert diesen Vektor auf eine bestimmte Länge.
*/
public Vector(double dx, double dy, double customLength) {
this.dx = dx;
this.dy = dy;
updatePolar();
this.setLength(customLength);
}
/**
* Setzt die Richtung dieses Vektors, ohne die L�nge zu ver�ndern.
*/
public void setDirection(int direction) {
this.direction = direction;
updateCartesian();
}
/**
* Addiert einen weiteren Vektor zu diesem Vektor.
*/
public void add(Vector other) {
dx += other.dx;
dy += other.dy;
updatePolar();
}
/**
* Setzt die L�nge dieses Vektors, ohne die Richtung zu ver�ndern.
*/
public void setLength(double length) {
this.length = length;
updateCartesian();
}
/**
* Skaliert diesen Vektor hoch (Faktor > 1) oder herunter (Faktor < 1). Die Richtung wird
* beibehalten.
*/
public void scale(double factor) {
length = length * factor;
updateCartesian();
}
/**
* Setzt diesen Vektor auf den neutralen Vektor (L�nge 0).
*/
public void setNeutral() {
dx = 0.0;
dy = 0.0;
length = 0.0;
direction = 0;
}
/**
* Kehrt die horizontale Komponente dieses Bewegungsvektors um.
*/
public void revertHorizontal() {
dx = -dx;
updatePolar();
}
/**
* Kehrt die vertikale Komponente dieses Bewegungsvektors um.
*/
public void revertVertical() {
dy = -dy;
updatePolar();
}
/**
* Liefert den X-Wert dieses Vektors zur�ck (Anfangs- bis Endpunkt).
*/
public double getX() {
return dx;
}
/**
* Liefert den Y-Wert dieses Vektors zur�ck (Anfangs- bis Endpunkt).
*/
public double getY() {
return dy;
}
/**
* Liefert die Richtung dieses Vektors (in Grad) zur�ck. 0 ist OSTEN.
*/
public int getDirection() {
return direction;
}
/**
* Liefert die L�nge dieses Vektors zur�ck.
*/
public double getLength() {
return length;
}
/**
* Aktualisiert die Richtung und die L�nge aus den aktuellen Werten von dx, dy.
*/
private void updatePolar() {
this.direction = (int) Math.toDegrees(Math.atan2(dy, dx));
this.length = Math.sqrt(dx * dx + dy * dy);
}
/**
* Aktualisiert dx und dy aus der aktuellen Richtung und L�nge.
*/
private void updateCartesian() {
dx = length * Math.cos(Math.toRadians(direction));
dy = length * Math.sin(Math.toRadians(direction));
}
}