Files
wehub-resource-sync ead81af521
CI / go (push) Waiting to run
CI / build (darwin, macos-14) (push) Waiting to run
CI / build (windows, windows-2025) (push) Waiting to run
Deploy to GitHub Pages / deploy (push) Failing after 0s
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

67 lines
1.5 KiB
Go

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")
}