Advertisement
Guest User

Untitled

a guest
May 16th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. export { Vector };
  2.  
  3. class Vector {
  4.  
  5.   public static addVectors(
  6.     {
  7.       vectorA
  8.     , vectorB
  9.     }: {
  10.       vectorA: Vector
  11.     , vectorB: Vector
  12.     }
  13.   ): Vector {
  14.     Vector.checkSameNumberOfComponents(
  15.       {
  16.         vectorA: vectorA
  17.       , vectorB: vectorB
  18.       }
  19.     );
  20.  
  21.     let numberOfComponents = vectorA.getNumberOfComponents();
  22.     let aComponents = vectorA.getComponents();
  23.     let bComponents = vectorB.getComponents();
  24.     let cComponents = [];
  25.  
  26.     for (
  27.       let i = 0;
  28.       i < numberOfComponents;
  29.       i++
  30.     ) {
  31.       cComponents[ i ] = (
  32.         aComponents[ i ]
  33.         + bComponents[ i ]
  34.       );
  35.     }
  36.  
  37.     let vectorC = new Vector(
  38.       cComponents
  39.     );
  40.  
  41.     return vectorC;
  42.   }
  43.  
  44.   public static subtractVectors(
  45.     {
  46.       vectorA
  47.     , vectorB
  48.     }: {
  49.       vectorA: Vector
  50.     , vectorB: Vector
  51.     }
  52.   ): Vector {
  53.     Vector.checkSameNumberOfComponents(
  54.       {
  55.         vectorA: vectorA
  56.       , vectorB: vectorB
  57.       }
  58.     );
  59.  
  60.     let numberOfComponents = vectorA.getNumberOfComponents();
  61.     let aComponents = vectorA.getComponents();
  62.     let bComponents = vectorB.getComponents();
  63.     let cComponents = [];
  64.  
  65.     for (
  66.       let i = 0;
  67.       i < numberOfComponents;
  68.       i++
  69.     ) {
  70.       cComponents[ i ] = (
  71.         aComponents[ i ]
  72.         - bComponents[ i ]
  73.       );
  74.     }
  75.  
  76.     let vectorC = new Vector(
  77.       cComponents
  78.     );
  79.  
  80.     return vectorC;
  81.   }
  82.  
  83.   public static multiplyVectors(
  84.     {
  85.       vectorA
  86.     , vectorB
  87.     }: {
  88.       vectorA: Vector
  89.     , vectorB: Vector
  90.     }
  91.   ): Vector {
  92.     Vector.checkSameNumberOfComponents(
  93.       {
  94.         vectorA: vectorA
  95.       , vectorB: vectorB
  96.       }
  97.     );
  98.  
  99.     let numberOfComponents = vectorA.getNumberOfComponents();
  100.     let aComponents = vectorA.getComponents();
  101.     let bComponents = vectorB.getComponents();
  102.     let cComponents = [];
  103.  
  104.     for (
  105.       let i = 0;
  106.       i < numberOfComponents;
  107.       i++
  108.     ) {
  109.       cComponents[ i ] = (
  110.         aComponents[ i ]
  111.         * bComponents[ i ]
  112.       );
  113.     }
  114.  
  115.     let vectorC = new Vector(
  116.       cComponents
  117.     );
  118.  
  119.     return vectorC;
  120.   }
  121.  
  122.   public static divideVectors(
  123.     {
  124.       vectorA
  125.     , vectorB
  126.     }: {
  127.       vectorA: Vector
  128.     , vectorB: Vector
  129.     }
  130.   ): Vector {
  131.     Vector.checkSameNumberOfComponents(
  132.       {
  133.         vectorA: vectorA
  134.       , vectorB: vectorB
  135.       }
  136.     );
  137.  
  138.     let numberOfComponents = vectorA.getNumberOfComponents();
  139.     let aComponents = vectorA.getComponents();
  140.     let bComponents = vectorB.getComponents();
  141.     let cComponents = [];
  142.  
  143.     for (
  144.       let i = 0;
  145.       i < numberOfComponents;
  146.       i++
  147.     ) {
  148.       cComponents[ i ] = (
  149.         aComponents[ i ]
  150.         / bComponents[ i ]
  151.       );
  152.     }
  153.  
  154.     let vectorC = new Vector(
  155.       cComponents
  156.     );
  157.  
  158.     return vectorC;
  159.   }
  160.  
  161.   public static dotProductOfVectors(
  162.     {
  163.       vectorA
  164.     , vectorB
  165.     }: {
  166.       vectorA: Vector
  167.     , vectorB: Vector
  168.     }
  169.   ): number {
  170.     Vector.checkSameNumberOfComponents(
  171.       {
  172.         vectorA: vectorA
  173.       , vectorB: vectorB
  174.       }
  175.     );
  176.  
  177.     let dotProduct = 0;
  178.     let numberOfComponents = vectorA.getNumberOfComponents();
  179.     let aComponents = vectorA.getComponents();
  180.     let bComponents = vectorB.getComponents();
  181.  
  182.     for (
  183.       let i = 0;
  184.       i < numberOfComponents;
  185.       i++
  186.     ) {
  187.       dotProduct = (
  188.         dotProduct
  189.         + (
  190.           aComponents[ i ]
  191.           * bComponents[ i ]
  192.         )
  193.       );
  194.     }
  195.  
  196.     return dotProduct;
  197.   }
  198.  
  199.   public static crossProductOfVectors(
  200.     {
  201.       vectorA
  202.     , vectorB
  203.     }: {
  204.       vectorA: Vector
  205.     , vectorB: Vector
  206.     }
  207.   ): number | Vector {
  208.     Vector.checkSameNumberOfComponents(
  209.       {
  210.         vectorA: vectorA
  211.       , vectorB: vectorB
  212.       }
  213.     );
  214.  
  215.     let numberOfComponents = vectorA.getNumberOfComponents();
  216.     let aComponents = vectorA.getComponents();
  217.     let bComponents = vectorB.getComponents();
  218.  
  219.     switch ( numberOfComponents ) {
  220.       case 2 : {
  221.         let Ax = aComponents[ 0 ];
  222.         let Ay = aComponents[ 1 ];
  223.         let Bx = bComponents[ 0 ];
  224.         let By = bComponents[ 1 ];
  225.  
  226.         let crossProduct = (
  227.           ( Ax * By )
  228.           - ( Ay * Bx )
  229.         );
  230.  
  231.         return crossProduct;
  232.       }
  233.       case 3: {
  234.         let Ax = aComponents[ 0 ];
  235.         let Ay = aComponents[ 1 ];
  236.         let Az = aComponents[ 2 ];
  237.         let Bx = bComponents[ 0 ];
  238.         let By = bComponents[ 1 ];
  239.         let Bz = bComponents[ 2 ];
  240.  
  241.         let components = [];
  242.  
  243.         components[ 0 ] = (
  244.           ( Ay * Bz )
  245.           - ( Az * By )
  246.         );
  247.         components[ 1 ] = (
  248.           ( Az * Bx )
  249.           - ( Ax * Bz )
  250.         );
  251.         components[ 2 ] = (
  252.           ( Ax * By )
  253.           - ( Ay * Bx )
  254.         );
  255.  
  256.         let crossProduct = new Vector(
  257.           components
  258.         );
  259.  
  260.         return crossProduct;
  261.       }
  262.       default: {
  263.         throw Error(
  264.           'cross product only provided for 2 and 3'
  265.         );
  266.       }
  267.     }
  268.   }
  269.  
  270.   public static lerpBetweenVectors(
  271.     {
  272.       start
  273.     , end
  274.     , progress // ranges from 0.0 to 1.0
  275.     }: {
  276.       start: Vector
  277.     , end: Vector
  278.     , progress: number
  279.     }
  280.   ): Vector {
  281.     Vector.checkSameNumberOfComponents(
  282.       {
  283.         vectorA: start
  284.       , vectorB: end
  285.       }
  286.     );
  287.     Vector.checkLerpProgress(
  288.       progress
  289.     );
  290.  
  291.     let delta = Vector.subtractVectors(
  292.       {
  293.         vectorA: end
  294.       , vectorB: start
  295.       }
  296.     );
  297.     delta = delta.multiplyByScalar(
  298.       progress
  299.     );
  300.  
  301.     let result = Vector.addVectors(
  302.       {
  303.         vectorA: start
  304.       , vectorB: delta
  305.       }
  306.     );
  307.  
  308.     return result;
  309.   }
  310.  
  311.   private static checkSameNumberOfComponents(
  312.     {
  313.       vectorA
  314.     , vectorB
  315.     }: {
  316.       vectorA: Vector
  317.     , vectorB: Vector
  318.     }
  319.   ): void {
  320.     if (
  321.       vectorA.getNumberOfComponents()
  322.       !== vectorB.getNumberOfComponents()
  323.     ) {
  324.       throw Error(
  325.         'vectors have different number of components'
  326.       );
  327.     }
  328.   }
  329.   private static checkLerpProgress(
  330.     progress
  331.   ): void {
  332.     if (
  333.       progress < 0 || progress > 1
  334.     ) {
  335.       throw Error(
  336.         'progress out of valid range'
  337.       );
  338.     }
  339.   }
  340.  
  341.   private readonly components: number[];
  342.   private readonly numberOfComponents: number;
  343.   private magnitude: number;
  344.   private magnitudeSquared: number;
  345.  
  346.   public constructor(
  347.     components: number[]
  348.   ) {
  349.     this.checkComponents(
  350.       components
  351.     );
  352.  
  353.     this.components = components;
  354.     this.numberOfComponents = this.components.length;
  355.   }
  356.  
  357.   public getNumberOfComponents(): number {
  358.     return this.numberOfComponents;
  359.   }
  360.  
  361.   public getComponents(): number[] {
  362.     return this.components;
  363.   }
  364.  
  365.   public getComponent(
  366.     componentIndex: number
  367.   ): number {
  368.     this.checkComponentIndex(
  369.       componentIndex
  370.     );
  371.  
  372.     return this.components[ componentIndex ];
  373.   }
  374.  
  375.   public setComponent(
  376.     {
  377.       componentIndex
  378.     , value
  379.     }: {
  380.       componentIndex: number
  381.     , value: number
  382.     }
  383.   ): Vector {
  384.     this.checkComponentIndex(
  385.       componentIndex
  386.     );
  387.  
  388.     let numberOfComponents = this.getNumberOfComponents();
  389.     let components = [];
  390.    
  391.     for (
  392.       let i = 0;
  393.       i < numberOfComponents;
  394.       i++
  395.     ) {
  396.       if ( i === componentIndex ) {
  397.         components[ i ] = value;
  398.       }
  399.       else {
  400.         components[ i ] = this.components[ i ];
  401.       }
  402.     }
  403.  
  404.     let vector = new Vector(
  405.       components
  406.     );
  407.  
  408.     return vector;
  409.   }
  410.  
  411.   public getMagnitude(): number {
  412.     if (
  413.       this.magnitude === undefined
  414.     ) {
  415.       this.calculateMagnitude();
  416.     }
  417.  
  418.     return this.magnitude;
  419.   }
  420.  
  421.   public getMagnitudeSquared(): number {
  422.     if (
  423.       this.magnitudeSquared === undefined
  424.     ) {
  425.       this.calculateMagnitudeSquared();
  426.     }
  427.  
  428.     return this.magnitudeSquared;
  429.   }
  430.  
  431.   // scalar operations
  432.   public addScalar(
  433.     scalar: number
  434.   ): Vector {
  435.     let numberOfComponents = this.getNumberOfComponents();
  436.     let components = [];
  437.  
  438.     for (
  439.       let i = 0;
  440.       i < numberOfComponents;
  441.       i++
  442.     ) {
  443.       components[ i ] = (
  444.         this.components[ i ]
  445.         + scalar
  446.       );
  447.     }
  448.  
  449.     let result = new Vector(
  450.       components
  451.     );
  452.  
  453.     return result;
  454.   }
  455.   public subtractScalar(
  456.     scalar: number
  457.   ): Vector {
  458.     let numberOfComponents = this.getNumberOfComponents();
  459.     let components = [];
  460.  
  461.     for (
  462.       let i = 0;
  463.       i < numberOfComponents;
  464.       i++
  465.     ) {
  466.       components[ i ] = (
  467.         this.components[ i ]
  468.         - scalar
  469.       );
  470.     }
  471.  
  472.     let result = new Vector(
  473.       components
  474.     );
  475.  
  476.     return result;
  477.   }
  478.   public multiplyByScalar(
  479.     scalar: number
  480.   ): Vector {
  481.     let numberOfComponents = this.getNumberOfComponents();
  482.     let components = [];
  483.  
  484.     for (
  485.       let i = 0;
  486.       i < numberOfComponents;
  487.       i++
  488.     ) {
  489.       components[ i ] = (
  490.         this.components[ i ]
  491.         * scalar
  492.       );
  493.     }
  494.  
  495.     let result = new Vector(
  496.       components
  497.     );
  498.  
  499.     return result;
  500.   }
  501.   public divideByScalar(
  502.     scalar: number
  503.   ): Vector {
  504.     if ( scalar === 0 ) {
  505.       throw Error( 'divide by zero' );
  506.     }
  507.  
  508.     let numberOfComponents = this.getNumberOfComponents();
  509.     let components = [];
  510.  
  511.     for (
  512.       let i = 0;
  513.       i < numberOfComponents;
  514.       i++
  515.     ) {
  516.       components[ i ] = (
  517.         this.components[ i ]
  518.         / scalar
  519.       );
  520.     }
  521.  
  522.     let result = new Vector(
  523.       components
  524.     );
  525.  
  526.     return result;
  527.   }
  528.  
  529.   // vector operations
  530.   public addVector(
  531.     vector: Vector
  532.   ): Vector {
  533.     let result = Vector.addVectors(
  534.       {
  535.         vectorA: this
  536.       , vectorB: vector
  537.       }
  538.     );
  539.  
  540.     return result;
  541.   }
  542.   public subtractVector(
  543.     vector: Vector
  544.   ): Vector {
  545.     let result = Vector.subtractVectors(
  546.       {
  547.         vectorA: this
  548.       , vectorB: vector
  549.       }
  550.     );
  551.  
  552.     return result;
  553.   }
  554.   public multiplyVector(
  555.     vector: Vector
  556.   ): Vector {
  557.     let result = Vector.multiplyVectors(
  558.       {
  559.         vectorA: this
  560.       , vectorB: vector
  561.       }
  562.     );
  563.  
  564.     return result;
  565.   }
  566.   public divideVector(
  567.     vector: Vector
  568.   ): Vector {
  569.     let result = Vector.divideVectors(
  570.       {
  571.         vectorA: this
  572.       , vectorB: vector
  573.       }
  574.     );
  575.  
  576.     return result;
  577.   }
  578.  
  579.   public normalize(): Vector {
  580.     let magnitude = this.getMagnitude();
  581.  
  582.     switch ( magnitude ) {
  583.       case 0: {
  584.         throw Error(
  585.           'magnitude of zero'
  586.         );
  587.       }
  588.       case 1: {
  589.         return this;
  590.       }
  591.       default: {
  592.         let inverseMagnitude = 1 / magnitude;
  593.         let result = this.multiplyByScalar(
  594.           inverseMagnitude
  595.         );
  596.  
  597.         return result;
  598.       }
  599.     } // switch
  600.   }
  601.  
  602.   private calculateMagnitude(): void {
  603.     this.magnitude = Math.sqrt(
  604.       this.getMagnitudeSquared()
  605.     );
  606.   }
  607.   private calculateMagnitudeSquared(): void {
  608.     this.magnitudeSquared = Vector.dotProductOfVectors(
  609.       {
  610.         vectorA: this
  611.       , vectorB: this
  612.       }
  613.     );
  614.   }
  615.  
  616.   private checkComponents(
  617.     components: number[]
  618.   ): void {
  619.     if (
  620.       components.length < 2
  621.     ) {
  622.       throw Error(
  623.         'number of components is less than the minimum of 2'
  624.       );
  625.     }
  626.   }
  627.   private checkComponentIndex(
  628.     componentIndex: number
  629.   ): void {
  630.     if (
  631.       componentIndex >= this.getNumberOfComponents()
  632.       || componentIndex < 0
  633.     ) {
  634.       throw Error(
  635.         'index out of bounds'
  636.       );
  637.     }
  638.   }
  639. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement