# Skewing and unskewing factors for 2, 3, and 4 dimensions
use constant {
F2 => 0.5 * (sqrt(3.0) - 1.0),
F3 => 1.0 / 3.0,
F4 => (sqrt(5.0) - 1.0) / 4.0,
G2 => (3.0 - sqrt(3.0)) / 6.0,
G3 => 1.0 / 6.0,
G4 => (5.0 - sqrt(5.0)) / 20.0,
};
####
F2 => (sqrt(3.0) - 1.0) / 2.0,
F3 => (sqrt(4.0) - 1.0) / 3.0,
F4 => (sqrt(5.0) - 1.0) / 4.0,
G2 => (3.0 - sqrt(3.0)) / 6.0, #/3*2
G3 => (4.0 - sqrt(4.0)) / 12.0, #/4*3 #1.0 / 6.0,
G4 => (5.0 - sqrt(5.0)) / 20.0, #/5*4
####
sub FFactor
{
my $numDimensions = shift;
return sqrt($numDimensions+1) -1 / $numDimensions;
}
sub GFactor
{
my $numDimensions = shift;
return ($numDimensions+1 -sqrt($numDimensions+1))/($numDimensions*$numDimensions+1);
}
####
my $N = 256;
my @pic = ();
for my $i (1 .. $N)
{
my $x = $i / 1;
my @row = ();
for my $j (1 .. $N)
{
my $y = $j / 1;
my $pixel;
#$pixel = (((noise $x/$_, $y/$_)+ 1) / 2 * 256) for (512);
$pixel = 1;
#my $decay = .25;
#$pixel = $pixel*(1-$decay) + (((noise $x/$_, $y/$_)+ 1) / 2 * 256*$decay) for reverse (512, 128, 64, 16, );#4);
$pixel *= (((noise $x/$_, $y/$_)+ 1) / 2) ** .5 for reverse (512, 128, 64, 32, );#4);
push @row, int($pixel*256);
}
push @pic, \@row;
}
BMP32bit('test.bmp', [0,$N-1,0,$N-1], \@pic, \@pic, \@pic);
sub BMP32bit
{
my $filename = shift;
my $coords = shift // [0,0,0,0];
my @channels = @_[0..3];
open my $outFH, '>', $filename or die "Can't open $filename for write: $!\n";
binmode $outFH;
my ($top, $bottom, $left, $right) = (map {$_ // 0} @$coords);
my ($width, $height) = (abs($left-$right)+1, abs($top-$bottom)+1);
print "Image size ($width, $height)\n";
my $filesize = 0x36 + $height*4 * $width; #scalar $image->{channels}{red_top};
# BMP Header
print $outFH pack('A2LSSL', 'BM', $filesize, 0,0, 0x36);
# DIB header
print $outFH pack('LLLSSLLLLLL', 40, $width, $height , 1, 32, 0, $filesize-0x36, 7874, 7874, 0, 0); #7874 pixels per meter == 200 dpi
for (0..3)
{
$channels[$_] = [] unless ref($channels[$_]) eq 'ARRAY';
}
for my $row ($top > $bottom ? ($bottom..$top) : (reverse $top..$bottom))
{
for my $col ( $left > $right ? ($right..$left) : (reverse $left..$right))
{
print $outFH pack('C4',
$channels[0][$col][$row]//0,
$channels[1][$col][$row]//0,
$channels[2][$col][$row]//0,
$channels[3][$col][$row]//0xff,
);
}
}
}