EOS 2  1.1.0
Einfache Objektbasierte Sprache
Vector.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.base.math;
2 
3 import de.lathanda.eos.base.Picture;
4 
5 import java.text.MessageFormat;
6 
100 public class Vector {
101 
102  public static Vector ZERO = new Vector(0, 0);
103  public static Vector BASE1 = new Vector(1, 0);
104  public static Vector BASE2 = new Vector(0, 1);
108  private final double dX;
112  private final double dY;
113 
120  public Vector(double dX, double dY) {
121  this.dX = dX;
122  this.dY = dY;
123  }
124 
130  public Vector(Point p) {
131  this.dX = p.getX();
132  this.dY = p.getY();
133  }
134 
140  public Vector(double angle) {
141  dX = Math.cos(angle);
142  dY = Math.sin(angle);
143  }
144 
151  public Vector(Point A, Point B) {
152  dX = B.getX() - A.getX();
153  dY = B.getY() - A.getY();
154  }
155 
161  public Vector(Vector v) {
162  dX = v.dX;
163  dY = v.dY;
164  }
165 
173  public Vector multiply(double k) {
174  return new Vector(dX * k, dY * k);
175  }
176 
182  public Vector negative() {
183  return new Vector(-dX, -dY);
184  }
185 
191  public double getLength() {
192  return Math.sqrt(dX * dX + dY * dY);
193  }
199  public double getSquareLength() {
200  return dX * dX + dY * dY;
201  }
202 
209  public Vector setLength(double l) {
210  if (l == 0) {
211  return ZERO;
212  } else {
213  return normalize().multiply(l);
214  }
215  }
216 
222  public double getdx() {
223  return dX;
224  }
225 
231  public double getdy() {
232  return dY;
233  }
234  public Vector setdx(double newdx) {
235  return new Vector(newdx, dY);
236  }
237  public Vector setdy(double newdy) {
238  return new Vector(dX, newdy);
239  }
240  public Point asPoint() {
241  return new Point(dX,dY);
242  }
249  public Vector add(Vector v) {
250  return new Vector(dX + v.dX, dY + v.dY);
251  }
252 
259  public Vector substract(Vector v) {
260  return new Vector(dX - v.dX, dY - v.dY);
261  }
262 
263  public Vector substract(double dx, double dy) {
264  return new Vector(this.dX - dx, this.dY - dy);
265  }
273  public Vector add(double x, double y) {
274  return new Vector(dX + x, dY + y);
275  }
276 
283  public double getAngle() {
284  if (dX == 0) {
285  if (dY < 0) {
286  return 1.5* Math.PI;
287  } else if (dY > 0) {
288  return 0.5 * Math.PI;
289  } else {
290  return Double.NaN;
291  }
292  } else {
293  double angle = Math.atan(dY / dX);
294  if (dX < 0) {
295  angle += Math.PI;
296  }
297  if (angle < 0) {
298  angle += 2*Math.PI;
299  }
300  return angle;
301  }
302  }
312  public double getAngleOrdernumber() {
313  if (dX > 0) {
314  if (dY >= 0) {
315  return dY / (dX + dY); //++
316  } else {
317  return 3 + dX / (dX - dY); //+-
318  }
319  } else {
320  if (dY > 0) {
321  return 1 + dX / (dX - dY); //-+
322  } else {
323  return 2 + dY / (dX + dY); //--
324  }
325  }
326  }
327 
337  public Vector rotate(double dAngle) {
338  double length = getLength();
339  if (length == 0) {
340  return this;
341  }
342  double angle = getAngle();
343  angle += dAngle;
344  return new Vector(length * Math.cos(angle), length * Math.sin(angle));
345  }
346  public Vector invertX() {
347  return new Vector(-dX,dY);
348  }
349  public Vector invertY() {
350  return new Vector(dX,-dY);
351  }
352 
359  public double dotProduct(Vector b) {
360  return dX * b.dX + dY * b.dY;
361  }
362 
370  public double dotProduct(double x, double y) {
371  return dX * x + dY * y;
372  }
373 
379  public Vector normalize() {
380  double n = getLength();
381  if (n == 0) {
382  return Vector.ZERO;
383  } else {
384  return new Vector(dX / n, dY / n);
385  }
386  }
387 
397  return new Vector(-dY, dX);
398  }
399 
409  public double getPerpendicularLength(Vector base) {
410  double length = base.getLength();
411  if (length == 0) {
412  return getLength();
413  } else {
414  return -crossproduct(base) / length;
415  }
416  }
417 
425  public double getProjectionLength(Vector base) {
426  double length = base.getLength();
427  if (length == 0) {
428  return 0;
429  } else {
430  return dotProduct(base) / length;
431  }
432  }
433 
441  public double getParallelogramArea(Vector a) {
442  return Math.abs(crossproduct(a));
443  }
444 
455  public double crossproduct(Vector b) {
456  return dX * b.dY - dY * b.dX;
457  }
458 
468  return base.rotateRightAngleCounterClockwise().setLength(getPerpendicularLength(base));
469  }
470 
481  public boolean isZero() {
482  return dX == 0 && dY == 0;
483  }
484 
490  @Override
491  public String toString() {
492  return MessageFormat.format("({0,number,#.00}|{1,number,#.00})",
493  new Object[]{dX, dY});
494  }
495 
504  public Vector getProjection(Vector base) {
505  Vector b = base.normalize();
506  return b.multiply(dotProduct(b));
507  }
508 
516  public Vector addLength(double l) {
517  double actL = getLength();
518  if (actL + l <= 0.0 || actL == 0) {
519  return ZERO;
520  } else {
521  return multiply((actL + l) / actL);
522  }
523  }
524 
534  public Vector restrict(double min, double max) {
535  double len = getLength();
536  if (len < min) {
537  return setLength(min);
538  }
539  if (len > max) {
540  return setLength(max);
541  }
542  return this;
543  }
544 
561  public void render(Picture g, Point p, double scale, double arrowLength) {
562  /* this
563  * ---> HHH |
564  * 2* lineDiff | LLLLLLLLLLLLLLLHHHHHH | 2*headDiff
565  * HHH | headDiff = 3*lineDiff
566  * -------------->
567  * headBase
568  * -------------------->
569  * v = scale * this
570  */
571  Vector v = multiply(scale);
572  double length = Math.min(v.getLength(), arrowLength);
573  Point head = new Point(p);
574  head.move(v);
575  Vector headLength = v.setLength(-length);
576  Vector headBreadth = v.setLength(length / 4d).rotateRightAngleCounterClockwise();
577  Vector lineBreadth = headBreadth.multiply(1d / 3d);
578  double[] x = new double[7];
579  double[] y = new double[7];
580  // all vectors are known, now we follow the vector chain
581  Vector point = new Vector(head.getX(), head.getY());
582  x[0] = point.getdx();
583  y[0] = point.getdy();
584  point = point.add(headLength).add(headBreadth);
585  x[1] = point.getdx();
586  y[1] = point.getdy();
587  point = point.substract(headBreadth).substract(headBreadth);
588  x[6] = point.getdx();
589  y[6] = point.getdy();
590  point = point.add(headBreadth).add(lineBreadth);
591  x[2] = point.getdx();
592  y[2] = point.getdy();
593  point = point.substract(lineBreadth).substract(lineBreadth);
594  x[5] = point.getdx();
595  y[5] = point.getdy();
596  point = new Vector(p.getX(), p.getY());
597  point = point.add(lineBreadth);
598  x[3] = point.getdx();
599  y[3] = point.getdy();
600  point = point.substract(lineBreadth).substract(lineBreadth);
601  x[4] = point.getdx();
602  y[4] = point.getdy();
603  g.drawPolygon(x, y);
604  }
605 }
abstract void drawPolygon(double[] x, double[] y)
void move(double dX, double dY)
Definition: Point.java:130
Vector(double dX, double dY)
Definition: Vector.java:120
Vector(Point A, Point B)
Definition: Vector.java:151
Vector restrict(double min, double max)
Definition: Vector.java:534
double dotProduct(double x, double y)
Definition: Vector.java:370
Vector substract(double dx, double dy)
Definition: Vector.java:263
Vector add(double x, double y)
Definition: Vector.java:273
double crossproduct(Vector b)
Definition: Vector.java:455
Vector rotate(double dAngle)
Definition: Vector.java:337
double getPerpendicularLength(Vector base)
Definition: Vector.java:409
double dotProduct(Vector b)
Definition: Vector.java:359
double getParallelogramArea(Vector a)
Definition: Vector.java:441
Vector substract(Vector v)
Definition: Vector.java:259
Vector getPerpendicular(Vector base)
Definition: Vector.java:467
Vector addLength(double l)
Definition: Vector.java:516
void render(Picture g, Point p, double scale, double arrowLength)
Definition: Vector.java:561
Vector getProjection(Vector base)
Definition: Vector.java:504
double getProjectionLength(Vector base)
Definition: Vector.java:425
Vector setdx(double newdx)
Definition: Vector.java:234
Vector setLength(double l)
Definition: Vector.java:209
Vector setdy(double newdy)
Definition: Vector.java:237
Impressum