Barcode Compression Test
by skibulk
JavaScript
// (C) 2021 skibulk
console.clear();
// Compression Patterns
/*
{id: 11, cBits: [1,1], offsets:[0,0]},
{id: 12, cBits: [1,2], offsets:[1,1]},
{id: 21, cBits: [2,1], offsets:[2,2]},
{id: 13, cBits: [1,3], offsets:[0,1]},
{id: 22, cBits: [2,2], offsets:[0,2]},
{id: 31, cBits: [3,1], offsets:[1,0]},
{id: 23, cBits: [2,3], offsets:[1,2]},
{id: 32, cBits: [3,2], offsets:[2,0]},
{id: 33, cBits: [3,3], offsets:[2,1]},
*/
var patterns = [
{id: 0, cBits: [], offsets:[0]},
{id: 1, cBits: [1], offsets:[0]},
{id: 2, cBits: [2], offsets:[1]},
{id: 3, cBits: [3], offsets:[2]},
];
function generateBarcode(decimal){
var barcode = [];
var bars = [];
bars = decimal.toString(3).split('');
for(var bi=0; bi<bars.length; bi++) bars[bi]++;
barcode.data = bars.join('');
// console.log(barcode.data, bars);
// For each compression pattern
for(var pi=0; pi<patterns.length; pi++){
var pattern = patterns[pi];
// add compression pattern length
var barcodeLength = pattern.cBits.reduce((a, b) => a + b, 0);
// For each bar
for(var bi=0; bi<bars.length; bi++){
// Apply offset to bar
var offset = pattern.offsets[bi%pattern.cBits.length] | 0;
var newBar = bars[bi] + offset;
if(newBar > 3) newBar -= 3;
// console.log(bars[bi], offset, newBar);
barcodeLength += newBar;
}
barcode.push([pattern.id, barcodeLength]);
}
return barcode;
}
function trial(numBars){
// Generate a set of barcodes to analyze
var dataset = [];
/*
dataset = [
// Each "barcode" array is a collection of compression variations
[
[ 0, 21 ], // first item has no compression bits
[ 11, 21 ], // pattern id, barcodeLength
...
]
];
*/
// skip ahead to the correct number of digits
var start = parseInt("1".padEnd(numBars, "0"), 3);
for(var i=start; i<Math.pow(3, numBars); i++){
dataset.push(generateBarcode(i));
}
...