EOS 2  1.1.0
Einfache Objektbasierte Sprache
Polygon.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.game.geom;
2 
3 import de.lathanda.eos.base.Picture;
4 import de.lathanda.eos.base.math.Matrix;
5 import de.lathanda.eos.base.math.Point;
6 import de.lathanda.eos.base.math.Vector;
7 
35 public class Polygon extends Shape {
36 
40  /* package */
41  double[] coordinates_x;
45  /* package */
46  double[] coordinates_y;
50  /* package */
51  double[] coordinates_final_x;
55  /* package */
56  double[] coordinates_final_y;
60  /* package */
61  int n;
62 
66  protected Polygon() {
67  p = new Point(0, 0);
68  }
69 
78  public Polygon(double[] x, double[] y) {
79  p = new Point(0, 0);
80  setVertices(x, y);
81  }
82 
88  public Polygon(Polygon poly) {
89  p = new Point(poly.p);
90  angle = poly.angle;
91  setVertices(poly.coordinates_x, poly.coordinates_y);
92  }
93 
101  public final void setVertices(double[] x, double[] y) {
102  n = x.length;
103  coordinates_x = new double[n];
104  coordinates_y = new double[n];
105  Vector previous = new Vector(x[0] - x[n - 1], y[0] - y[n - 1]);
106  Vector actual;
107  for (int i = 0; i < n; i++) {
108  coordinates_x[i] = x[i];
109  coordinates_y[i] = y[i];
110  }
111  int j; // next point
112  for (int i = 0; i < n; i++) {
113  j = (i + 1) % n;
114  actual = new Vector(coordinates_x[j] - coordinates_x[i],
115  coordinates_y[j] - coordinates_y[i]);
116  if (previous.crossproduct(actual) > 0) {
117  throw new ConcaveCornerRuntimeException(i,
118  new Point(coordinates_x[(i - 1 + n) % n], coordinates_y[(i - 1 + n) % n]),
119  new Point(coordinates_x[i], coordinates_y[i]),
120  new Point(coordinates_x[j], coordinates_y[j]));
121  }
122  previous = actual;
123  }
124  coordinates_final_x = new double[n];
125  coordinates_final_y = new double[n];
126  transform();
127  }
128 
129  protected Types getOutlineType() {
130  return Types.POLYGON;
131  }
132 
138  private void transform() {
139  if (coordinates_x == null) {
140  return;
141  }
142 
143  Matrix m = new Matrix(p.getX(), p.getY(), angle, 1, 1);
144  m.transform(coordinates_x, coordinates_y, coordinates_final_x,
145  coordinates_final_y);
146  right = Double.NEGATIVE_INFINITY;
147  left = Double.POSITIVE_INFINITY;
148  top = Double.NEGATIVE_INFINITY;
149  bottom = Double.POSITIVE_INFINITY;
150  for (int i = 0; i < n; i++) {
151  if (coordinates_final_x[i] < left) {
152  left = coordinates_final_x[i];
153  }
154  if (coordinates_final_x[i] > right) {
155  right = coordinates_final_x[i];
156  }
157  if (coordinates_final_y[i] < bottom) {
158  bottom = coordinates_final_y[i];
159  }
160  if (coordinates_final_y[i] > top) {
161  top = coordinates_final_y[i];
162  }
163  }
164  }
165 
173  @Override
174  public boolean contains(double x, double y) {
175  Vector v;
176  Vector w;
177  for (int i = 0, j; i < n; i++) {
178  j = (i + 1) % n;
179  v = new Vector(coordinates_final_x[j] - coordinates_final_x[i],
180  coordinates_final_y[j] - coordinates_final_y[i]);
181  w = new Vector(x - coordinates_final_x[i], y
182  - coordinates_final_y[i]);
183  if (v.crossproduct(w) > 0) {
184  return false;
185  }
186  }
187  return true;
188  }
189 
199  @Override
200  public double getDistance(double x, double y) {
201  Vector v;
202  Vector w;
203  double distance = Double.POSITIVE_INFINITY;
204  double edgeDistance = 0;
205  double projection = 0;
206  boolean within = true;
207  for (int i = 0, j; i < n; i++) {
208  j = (i + 1) % n;
209  v = new Vector(coordinates_final_x[j] - coordinates_final_x[i],
210  coordinates_final_y[j] - coordinates_final_y[i]);
211  w = new Vector(x - coordinates_final_x[i],
212  y - coordinates_final_y[i]);
213  edgeDistance = w.getPerpendicularLength(v);
214  projection = w.getProjectionLength(v);
215 
216  if (edgeDistance > 0) {
217  within = false;
218  } else {
219  edgeDistance = -edgeDistance;
220  }
221  distance = Math.min(distance, w.getLength());
222  if (0 < projection && projection < v.getLength()) {
223  distance = Math.min(distance, edgeDistance);
224  }
225  }
226  return (within) ? -distance : distance;
227  }
228 
232  protected void positionChanged() {
233  transform();
234  }
235 
239  protected void angleChanged() {
240  transform();
241  }
242 
243  @Override
244  public void draw(Picture picture) {
245  picture.drawPolygon(coordinates_final_x, coordinates_final_y);
246 
247  }
248 }
abstract void drawPolygon(double[] x, double[] y)
double crossproduct(Vector b)
Definition: Vector.java:455
double getPerpendicularLength(Vector base)
Definition: Vector.java:409
double getProjectionLength(Vector base)
Definition: Vector.java:425
final void setVertices(double[] x, double[] y)
Definition: Polygon.java:101
Polygon(double[] x, double[] y)
Definition: Polygon.java:78
double getDistance(double x, double y)
Definition: Polygon.java:200
boolean contains(double x, double y)
Definition: Polygon.java:174
void draw(Picture picture)
Definition: Polygon.java:244
double angle
Drehwinkel.
Definition: Shape.java:59
double distance(Shape b)
Definition: Shape.java:235
double bottom
Untere Grenze.
Definition: Shape.java:47
double top
Obere Grenze.
Definition: Shape.java:55
double left
Linke Grenze.
Definition: Shape.java:43
double right
Rechte Grenze.
Definition: Shape.java:51
Impressum