Вектор в пространстве

  1. public class VectorG {
  2.  
  3.     public float x,y,z;
  4.  
  5.     public VectorG(float x, float y, float z) {
  6.         this.x = x;
  7.         this.y = y;
  8.         this.z = z;
  9.     }
  10.  
  11.     public void sum(float x, float y, float z) {
  12.         this.x += x;
  13.         this.y += y;
  14.         this.z += z;
  15.     }
  16.  
  17.     public void sum(VectorG vec) {
  18.         x += vec.x;
  19.         y += vec.y;
  20.         y += vec.y;
  21.     }
  22.  
  23.     public void not() {
  24.         x = -x;
  25.         y = -y;
  26.         z = -z;
  27.     }
  28.  
  29.     public static VectorG sum(VectorG v1, VectorG v2) {
  30.         return new VectorG(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
  31.     }
  32.  
  33.     public static VectorG not(VectorG vec) {
  34.         return new VectorG(-vec.x, -vec.y, -vec.z);
  35.     }
  36.  
  37.     public void set(float x, float y, float z) {
  38.         this.x = x;
  39.         this.y = y;
  40.         this.z = z;
  41.     }
  42.  
  43.     public void set(float[] coords) {
  44.         x = coords[0];
  45.         y = coords[1];
  46.         z = coords[2];
  47.     }
  48.  
  49.     public float[] get() {
  50.         return new float[]{x,y,z};
  51.     }
  52.  
  53.     public float getValue() {
  54.         return (float) Math.sqrt(x * x + y * y + z * z);
  55.     }
  56.  
  57.     public void setValue(float val) {
  58.         if (getValue() != 0) {
  59.             float k = val / getValue();
  60.             scale(k);
  61.         }
  62.     }
  63.  
  64.     public void scale(float k) {
  65.         x *= k;
  66.         y *= k;
  67.         z *= k;
  68.     }
  69.  
  70.     public void scale(float x, float y, float z) {
  71.         this.x *= x;
  72.         this.y *= y;
  73.         this.z *= z;
  74.     }
  75.  
  76.     public Object clone() {
  77.         return new VectorG(x, y, z);
  78.     }
  79.  
  80.     public float angle(VectorG vec) {
  81.         float a = getValue();
  82.         float b = vec.getValue();
  83.         float c = sum(this, not(vec)).getValue();
  84.         return (float) Math.toDegrees(Math.acos((a * a + (b + c) * (b - c)) / (2.0 * a * b)));
  85.     }
  86.  
  87.     public float cosin(VectorG vec) {
  88.         float a = getValue();
  89.         float b = vec.getValue();
  90.         float c = sum(this, not(vec)).getValue();
  91.         return (a * a + (b + c) * (b - c)) / (2.0f * a * b);
  92.     }
  93.  
  94.     public void reflect(VectorG normal) {
  95.         VectorG normalForProcess =(VectorG) normal.clone();
  96.         if (angle(normalForProcess) >= 90) normalForProcess.not();
  97.         normalForProcess.setValue(getValue() * cosin(normalForProcess));
  98.         normalForProcess.scale(2);
  99.         sum(normalForProcess);
  100.     }
  101.  
  102.     public boolean isPerpendicular(VectorG vec) {
  103.         return MathUtil.eq(0, cosin(vec));
  104.     }
  105.  
  106.     public boolean isOpposite(VectorG vec) {
  107.         return cosin(vec) < 0;
  108.     }
  109.  
  110.     public void setDirection(float xy, float xz) {
  111.         float value=getValue();
  112.         float yr=(float) Math.sin(Math.toRadians(xy)) * value;
  113.         float xr=(float) Math.cos(Math.toRadians(xy)) * (float)Math.cos(Math.toRadians(xz)) * value;
  114.         float zr=(float) Math.cos(Math.toRadians(xy)) * (float)Math.sin(Math.toRadians(xz)) * value;
  115.         set(xr, yr, zr);
  116.     }
  117.  
  118.     private static class MathUtil {
  119.         private static float eps=(float)1e-5;
  120.         public static boolean eq(float a, float b)  {
  121.             return Math.abs(a - b) <= eps;
  122.         }
  123.     }
  124. }

Реклама

Мы в соцсетях

tw tg yt gt