-
Notifications
You must be signed in to change notification settings - Fork 148
/
AnimTankTrack.java
97 lines (77 loc) · 2 KB
/
AnimTankTrack.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
package com.flansmod.client.model;
import java.util.ArrayList;
import com.flansmod.common.vector.Vector3f;
public class AnimTankTrack
{
public ArrayList<Vector3f> points;
public float trackLinkLength;
public AnimTankTrack(ArrayList<Vector3f> trackPoints, float linkLength)
{
points = trackPoints;
trackLinkLength = linkLength;
}
public void setLinkLength(float length)
{
trackLinkLength = length;
}
public float distBetweenPoints(Vector3f p1, Vector3f p2)
{
float distance;
float x = p1.x - p2.x;
float y = p1.y - p2.y;
distance = (float)Math.sqrt((x * x) + (y * y));
return distance;
}
public float getTrackLength()
{
float length = 0;
for(int i = 0; i < points.size(); i++)
{
length += distBetweenPoints(points.get(i), points.get((i == 0) ? points.size() - 1 : i - 1));
}
return length;
}
public int getTrackPart(float distance)
{
float length = 0;
for(int i = 0; i < points.size(); i++)
{
if(length >= distance)
{
return i;
}
else
{
length += distBetweenPoints(points.get(i), points.get((i == (points.size() - 1)) ? 0 : i + 1));
}
}
return 0;
}
public float getProgressAlongTrackPart(float distance, int trackPart)
{
float length = 0;
for(int i = 0; i < trackPart + 1; i++)
{
if(i != 0)
{
length += distBetweenPoints(points.get(i - 1), points.get(i));
}
}
return length;
}
public Vector3f getPositionOnTrack(float distance)
{
int trackPart = getTrackPart(distance);
Vector3f p2 = points.get((trackPart == 0) ? points.size() - 1 : trackPart - 1);
Vector3f p1 = points.get(trackPart);
float partLength = distBetweenPoints(p2, p1);
float prog =
distance - (getProgressAlongTrackPart(distance, (trackPart == 0) ? points.size() - 1 : trackPart - 1));
float progress = prog / partLength;
return new Vector3f(lerp(p2.x, p1.x, progress), lerp(p2.y, p1.y, progress), lerp(p2.z, p1.z, progress));
}
public float lerp(float a, float b, float f)
{
return (a + f * (b - a));
}
}