chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
package ui
|
||||
|
||||
import "strings"
|
||||
|
||||
// renderBinary draws streaming columns of 0s and 1s that scroll at speeds
|
||||
// proportional to each band's energy. Higher energy produces more 1s (active
|
||||
// data) and brighter coloring, creating a raw data-stream aesthetic.
|
||||
func (v *Visualizer) renderBinary(bands []float64) string {
|
||||
height := v.Rows
|
||||
lines := make([]string, height)
|
||||
bandCount := len(bands)
|
||||
|
||||
for row := range height {
|
||||
var sb, run strings.Builder
|
||||
tag := -1
|
||||
col := 0
|
||||
for b := range bandCount {
|
||||
w := visBandWidth(bandCount, b)
|
||||
for range w {
|
||||
energy := bands[b]
|
||||
|
||||
// Scroll speed per column: higher energy = faster data flow.
|
||||
speed := max(1, 4-int(energy*3))
|
||||
scroll := int(v.frame) / speed
|
||||
|
||||
// Bit value from position hash (time-independent; scroll creates motion).
|
||||
h := scatterHash(b, row+scroll, col, 0)
|
||||
oneProb := energy*0.6 + 0.15
|
||||
|
||||
var ch byte
|
||||
if h < oneProb {
|
||||
ch = '1'
|
||||
} else {
|
||||
ch = '0'
|
||||
}
|
||||
|
||||
// 1s on high-energy bands glow bright; 0s stay dim.
|
||||
var newTag int
|
||||
if ch == '1' && energy > 0.4 {
|
||||
newTag = 2
|
||||
} else if ch == '1' || energy > 0.3 {
|
||||
newTag = 1
|
||||
} else {
|
||||
newTag = 0
|
||||
}
|
||||
if newTag != tag {
|
||||
flushStyleRun(&sb, &run, tag)
|
||||
tag = newTag
|
||||
}
|
||||
run.WriteByte(ch)
|
||||
col++
|
||||
}
|
||||
if b < bandCount-1 {
|
||||
if tag != -1 {
|
||||
flushStyleRun(&sb, &run, tag)
|
||||
tag = -1
|
||||
}
|
||||
run.WriteByte(' ')
|
||||
col++
|
||||
}
|
||||
}
|
||||
flushStyleRun(&sb, &run, tag)
|
||||
lines[row] = sb.String()
|
||||
}
|
||||
return strings.Join(lines, "\n")
|
||||
}
|
||||
Reference in New Issue
Block a user