# Finding the Middle Point of a Line Segment

PHPThe vector operations are often used in 3D programming. For example, given a line segment with the start point, \(P_1\), and the end point, \(P_2\), it is easy to find the point \(P\) along the line segment \(P_1\)\(P_2\) at the distance \(d\) away from \(P_1\) by using the vector operations. First, we get the vector \(\vec{v}=P_2-P_1\). The unit vector of \(\vec{v}\) is \(\hat{u}=\frac{\vec{v}}{\|\vec{v}\|}\). Then we can get the point \(P\) as \(P=P_1+d\hat{u}\). By using this way, we can easily find the points that divide a line segment into equal parts.

The following codes define the function `getPoints($p1, $p2, $parts)`

that gets all the points that divide a line segment into equal parts regarding the start point `$p1`

,
the end point `$p2`

and the amount of equal parts `$parts`

as we want.

```
require_once 'SimpleVector3D.php';
use CodeBilby\SimpleVector3D;
function getPoints($p1, $p2, $parts)
{
$v = $p2->sub($p1);
$len = $v->len();
$norm = $v->normalize();
$array = array($p1);
$subsegment = $len / $parts;
for ($i = 1; $i < $parts; $i ++) {
$point = $p1->add($norm->scale($subsegment * $i));
array_push($array, $point);
}
array_push($array, $p2);
return $array;
}
```

In line 1, we use the SimpleVector3D class posted in
A Simple 3D Vector Class in PHP
for vector operations.
From line 7 to 9, we get the unit vector `$norm`

of `$v`

.
The length of the subsegment `$subsegment`

is got in line 13.
From line 15 to 18, we can get all the points based on the way we discussed.

We can use the function `getPoints($p1, $p2, $parts)`

like this:

```
$p1 = new SimpleVector3D([10, 20, 30]);
$p2 = new SimpleVector3D([190, 10, -40]);
$parts = 5;
$array = getPoints($p1, $p2, $parts);
echo 'Amount of parts: ' . $parts. '<br>';
for ($i = 0; $i < count($array); $i++) {
echo $array[$i]->toString().'<br>';
}
```

From line 1 to 3, we define the start point `$p1`

, the end point `$p2`

and the amount of the subsegments we want. The function `getPoints($p1, $p2, $parts)`

is called in line 5.
Finally, from line 7 to 10, the details of the returned points are printed out.

The output will be:

```
Amount of parts: 5
[10, 20, 30]
[46, 18, 16]
[82, 16, 2]
[118, 14, -12]
[154, 12, -26]
[190, 10, -40]
```