I am currently working on a program that uses Bresenham’s line algorithm in order to plot the points between two 3D points.

I found the following article from geeksforgeeks which describes the process of the algorithm. The conditional logic provided only works for the X-Driving axis.

Image of Bresenham X-Drive Instructions from geeksforgeeks

How would I change the else if logic in order to account for a y or z driving axis? I don’t completely understand why math works, but I need to use it for a program I am writing.

The values of pk+1 would be the following for plotting with a y-axis drive (my best guess):

(x, y+1, z)

(x+1, y+1, z)

(x+1, y+1, z+1)

(x, y+1, z+1)

When it comes to condiations:

`pyk < 0 and pzk < 0`

(x-drive)

Would change into:

`pxk < 0 and pzk < 0`

(y-drive)

However, a condiation such as:

`pyk > 0 and pzk < 0`

(x-drive)

Could have two possiblities:

`pxk > 0 and pzk < 0`

(y-drive)

or

`pxk < 0 and pzk > 0`

(y-drive)

How would I know which one to pick?

The geeksforgeeks website provides a working python program (with code) that uses different logic to accomplish the same result, but I am not sure if converting that program into JS is considered plagiarism.

If you are interested in the program I have so far created to test this, here is it below:

I have so far created a javascript program to follow this algorithm, but have so far only programmed it for x-drive. Note: This repl.it has a 2d variant at the top and at the bottom has a 3d variant which is what I am currently working on.

https://replit.com/@Michael_Nicol/Bresenhams-Algorithm#index.js

```
let p1 = [0, 0, 0]
let p2 = [20, 20, 10]
// Highest value of x will activate the x -drive, highest value of y will activate the y drive, etc in the p2 coordinate. Best to keep p1 0 for now.
function brensen3d(p1, p2) {
let dx = Math.abs(p2[0] - p1[0])
let dy = Math.abs(p2[1] - p1[1])
let dz = Math.abs(p2[2] - p1[2])
let xc = p2[0] > p1[0] ? 1 : -1
let yc = p2[1] > p1[1] ? 1 : -1
let zc = p2[2] > p1[2] ? 1 : -1
let pointList = [[...p1]]
let pk = [...p1]
console.log(dx, dy, dz)
if (dx >= dy && dx >= dz) {
console.log("dx drive")
let pyk = (2 * dy) - dx
let pzk = (2 * dz) - dx
for (let k = 0; k < dx - 1; k++) {
pk[0] += xc
pyk += (2 * dy)
pzk += (2 * dz)
if (pyk > 0 && pzk < 0) {
pk[1] += yc;
pyk -= (2 * dx)
} else if (pyk === 0) {
pk[2] += zc;
pzk -= (2 * dx)
} else {
pk[1] += yc;
pk[2] += zc;
pyk -= (2 * dx)
pzk -= (2 * dx)
}
pointList.push([...pk])
}
} else if (dy >= dx && dy >= dz) {
console.log("dy drive")
let pxk = (2 * dx) - dy
let pzk = (2 * dz) - dy
for (let k = 0; k < dy - 1; k++) {
pk[1] += yc
pxk += (2 * dx)
pzk += (2 * dz)
if (pxk < 0 && pzk < 0) {
// condiation body
}
// missing condiation
pointList.push([...pk])
}
} else if (dz >= dy && dz >= dx) {
console.log("dz drive")
let pxk = (2 * dx) - dz
let pyk = (2 * dy) - dz
for (let k = 0; k < dz - 1; k++) {
pk[2] += zc
pxk += (2 * dx)
pyk += (2 * dy)
if (pxk < 0 && pyk < 0) {
// conditaion body
}
// missing condiation
pointList.push([...pk])
}
}
pointList.push([...p2])
return pointList
}
```

I also asked this question on math stack overflow

But I am not sure if that is the correct place to receive a response.