Types/Wave/get_Vector3.ps1

<#
.SYNOPSIS
    Gets Wave Vector
.DESCRIPTION
    Gets a Wave as a series of Vectors.

    We can think of a wave as a series of vectors.

    Each sample in the wave travels one distance along the X axis,
    and up or down along the along the Y axis.

    We can also think of the length of the line between
    X and Y as the depth (Z) of the wave,
    and thus view each Wave as a series of 3D vectors.
.NOTES
    Thinking of waves this way provides some benefits.

    This will write progress as it calculates and
    cache the vectors in memory after they are calculated.
#>

if ($this.'#Vector3') { return $this.'#Vector3' }
[double[]]$Samples = $this.Samples
$lastSample = 0

$progress = [Ordered]@{
    Id = Get-Random    
    Activity = "Vectoring"    
}
$sampleRate = $this.SampleRate
$SampleCount = $samples.Length

[Numerics.Vector3[]]$vector3 = @(
    for ($index = 0; $index -lt $samples.Length;$index++) {
        $delta = $samples[$index] - $lastSample
        $length = [Math]::Sqrt(($delta * $delta) + 1)        

        if (-not ($index % 64kb)) {
            $progress.Status = "$index / $($SampleCount)"
            $progress.PercentComplete = ($index * 100 / $SampleCount)
            $progress.SecondsRemaining = (($SampleCount - $index) * (1 / $SampleRate))
            Write-Progress @progress
        }
        
        [Numerics.Vector3]::new(1, $delta, $(
            $length * $(
                if ($delta -gt 0) { 1 }
                elseif ($delta -lt 0) { -1 }
                else { 0 }    
            )
        ))                
        
        $lastSample = $samples[$index]
    }
)

$this | Add-Member NoteProperty '#Vector3' $vector3 -Force

return $vector3