1package com.fs.starfarer.api.impl.campaign.velfield;
4import java.util.ArrayList;
5import java.util.Collections;
6import java.util.Comparator;
7import java.util.HashMap;
11import org.lwjgl.opengl.GL11;
12import org.lwjgl.util.vector.Vector2f;
14import com.fs.starfarer.api.impl.campaign.velfield.SlipstreamTerrainPlugin2.SlipstreamSegment;
15import com.fs.starfarer.api.util.Misc;
21 List<Vector2f>
points =
new ArrayList<Vector2f>();
22 SlipstreamSegment prev =
null;
23 float unitsPerNormals = 2000f;
24 float distSoFar = unitsPerNormals;
26 for (
int i = 0; i < segments.size(); i++) {
27 SlipstreamSegment seg = segments.get(i);
28 if (distSoFar >= unitsPerNormals || i == segments.size() - 1) {
29 distSoFar -= unitsPerNormals;
30 Vector2f n1 =
new Vector2f(seg.loc);
31 Vector2f n2 =
new Vector2f(seg.loc);
32 n1.x += seg.normal.x * seg.width * 0.5f;
33 n1.y += seg.normal.y * seg.width * 0.5f;
34 n2.x -= seg.normal.x * seg.width * 0.5f;
35 n2.y -= seg.normal.y * seg.width * 0.5f;
39 points.add(
new Vector2f(seg.loc));
41 if (seg.width * 0.5f >
padding) {
55 protected transient List<Vector2f>
points;
57 protected List<Vector2f>
box;
63 protected Vector2f
center =
new Vector2f();
75 if (distSq > (
radius + extraRange) * (
radius + extraRange))
return false;
95 for (Vector2f p :
points) {
101 float maxDistSq = 0f;
102 for (Vector2f p :
points) {
104 if (dist > maxDistSq) maxDistSq = dist;
118 float minArea = Float.MAX_VALUE;
119 float [] best =
null;
120 float bestAngle = 0f;
127 Vector2f edge = Vector2f.sub(p2, p1,
new Vector2f());
134 if (area < minArea) {
151 Vector2f p1 =
new Vector2f(best[0], best[1]);
152 Vector2f p2 =
new Vector2f(best[2], best[1]);
153 Vector2f p3 =
new Vector2f(best[2], best[3]);
154 Vector2f p4 =
new Vector2f(best[0], best[3]);
155 box =
new ArrayList<Vector2f>();
162 this.angle = bestAngle;
169 List<Vector2f> result =
new ArrayList<Vector2f>();
170 for (Vector2f p :
points) {
177 float minX = Float.MAX_VALUE;
178 float minY = Float.MAX_VALUE;
179 float maxX = -Float.MAX_VALUE;
180 float maxY = -Float.MAX_VALUE;
181 for (Vector2f p :
points) {
182 if (p.x < minX) minX = p.x;
183 if (p.y < minY) minY = p.y;
184 if (p.x > maxX) maxX = p.x;
185 if (p.y > maxY) maxY = p.y;
187 return new float [] {minX, minY, maxX, maxY};
191 this.points =
new ArrayList<Vector2f>(
points);
199 float minY = Float.MAX_VALUE;
200 for (Vector2f p :
points) {
206 final Map<Vector2f, Float> angles =
new HashMap<Vector2f, Float>();
207 for (Vector2f p :
points) {
208 if (p == p1)
continue;
211 angles.put(p,
angle);
214 List<Vector2f> sorted =
new ArrayList<Vector2f>(
points);
216 Collections.sort(sorted,
new Comparator<Vector2f>() {
217 public int compare(Vector2f o1, Vector2f o2) {
218 float diff = angles.get(o1) - angles.get(o2);
219 if (diff < 0)
return -1;
220 if (diff > 0)
return 1;
227 for (Vector2f p : sorted) {
253 public static float getTurnDir(Vector2f p1, Vector2f p2, Vector2f p3) {
254 float r = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
255 if (r > 0)
return 1f;
256 if (r < 0)
return -1f;
262 GL11.glDisable(GL11.GL_TEXTURE_2D);
263 GL11.glEnable(GL11.GL_BLEND);
264 GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
266 GL11.glEnable(GL11.GL_POINT_SMOOTH);
267 GL11.glPointSize(10f);
268 GL11.glBegin(GL11.GL_POINTS);
271 for (Vector2f p :
points) {
272 GL11.glVertex2f(p.x, p.y);
278 GL11.glEnable(GL11.GL_LINE_SMOOTH);
279 GL11.glLineWidth(3f);
280 GL11.glBegin(GL11.GL_LINE_LOOP);
283 GL11.glVertex2f(p.x, p.y);
289 GL11.glEnable(GL11.GL_LINE_SMOOTH);
290 GL11.glLineWidth(3f);
291 GL11.glBegin(GL11.GL_LINE_LOOP);
293 for (Vector2f p :
box) {
294 GL11.glVertex2f(p.x, p.y);
transient List< Vector2f > points
static List< Vector2f > rotate(List< Vector2f > points, float angle)
BoundingBox(float padding)
boolean pointNeedsDetailedCheck(Vector2f p)
void renderDebug(float alpha)
static float[] getBoundingBox(List< Vector2f > points)
boolean pointNeedsDetailedCheck(Vector2f p, float extraRange)
transient List< Vector2f > convexHull
void compute(List< Vector2f > points)
void computeCenterAndRadius()
void computeConvexHull(List< Vector2f > points)
static float getTurnDir(Vector2f p1, Vector2f p2, Vector2f p3)
static BoundingBox create(List< SlipstreamSegment > segments)
static float getDistanceSq(Vector2f v1, Vector2f v2)
static void setColor(Color color)
static Vector2f rotateAroundOrigin(Vector2f v, float angle)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getAngleInDegreesStrict(Vector2f v)
static Vector2f normalise(Vector2f v)