Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
28.57% covered (danger)
28.57%
8 / 28
66.67% covered (warning)
66.67%
4 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Vector
28.57% covered (danger)
28.57%
8 / 28
66.67% covered (warning)
66.67%
4 / 6
64.48
0.00% covered (danger)
0.00%
0 / 1
 fromArray
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 setV
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getV
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setMatrixV
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 cosine
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
42
 cross3
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Jingga
4 *
5 * PHP Version 8.1
6 *
7 * @package   phpOMS\Math\Matrix
8 * @copyright Dennis Eichhorn
9 * @license   OMS License 2.0
10 * @version   1.0.0
11 * @link      https://jingga.app
12 */
13declare(strict_types=1);
14
15namespace phpOMS\Math\Matrix;
16
17/**
18 * Vector class
19 *
20 * @package phpOMS\Math\Matrix
21 * @license OMS License 2.0
22 * @link    https://jingga.app
23 * @since   1.0.0
24 */
25final class Vector extends Matrix
26{
27    /**
28     * Create vector from array
29     *
30     * @param array $vector Matrix array
31     *
32     * @return self
33     *
34     * @since 1.0.0
35     */
36    public static function fromArray(array $vector) : self
37    {
38        $v = new self(\count($vector), 1);
39        $v->setMatrixV($vector);
40
41        return $v;
42    }
43
44    /**
45     * Set vector value
46     *
47     * @param int       $m     Position to set
48     * @param int|float $value Value to set
49     *
50     * @return void
51     *
52     * @since 1.0.0
53     */
54    public function setV(int $m, int | float $value) : void
55    {
56        parent::set($m , 0, $value);
57    }
58
59    /**
60     * Get vector value
61     *
62     * @param int $m Position to get
63     *
64     * @return int|float
65     *
66     * @since 1.0.0
67     */
68    public function getV(int $m) : int | float
69    {
70        return parent::get($m, 0);
71    }
72
73    /**
74     * Set matrix
75     *
76     * @param array<int, int|float> $vector 1-Dimensional array
77     *
78     * @return Vector
79     *
80     * @since 1.0.0
81     */
82    public function setMatrixV(array $vector) : self
83    {
84        foreach ($vector as $key => $value) {
85            $this->setV($key, $value);
86        }
87
88        return $this;
89    }
90
91    /**
92     * Angle between two vectors
93     *
94     * @param self $v Vector
95     *
96     * @return float
97     *
98     * @since 1.0.0
99     */
100    public function cosine(self $v) : float
101    {
102        $dotProduct = 0.0;
103        for ($i = 0; $i < $this->m; ++$i) {
104            $dotProduct += $this->matrix[$i][0] * $v->matrix[$i][0];
105        }
106
107        $sumOfSquares = 0;
108        foreach ($this->matrix as $value) {
109            $sumOfSquares += $value[0] * $value[0];
110        }
111        $magnitude1 = \sqrt($sumOfSquares);
112
113        $sumOfSquares = 0.0;
114        foreach ($v->matrix as $value) {
115            $sumOfSquares += $value[0] * $value[0];
116        }
117        $magnitude2 = \sqrt($sumOfSquares);
118
119        if ($magnitude1 === 0.0 || $magnitude2 === 0.0) {
120            return \PHP_FLOAT_MAX;
121        }
122
123        return $dotProduct / ($magnitude1 * $magnitude2);
124    }
125
126    /**
127     * Calculate the cross product
128     *
129     * @param self $vector 3 Vector
130     *
131     * @return Vector
132     *
133     * @since 1.0.0
134     */
135    public function cross3(self $vector) : self
136    {
137        $crossArray = [
138            $this->getV(1) * $vector->getV(2) - $this->getV(2) * $vector->getV(1),
139            $this->getV(2) * $vector->getV(0) - $this->getV(0) * $vector->getV(2),
140            $this->getV(0) * $vector->getV(1) - $this->getV(1) * $vector->getV(0),
141        ];
142
143        return self::fromArray($crossArray);
144    }
145}