#! perl -slw
use strict;
use Data::Dump qw[ pp ];
use List::Util qw[ reduce ]; $a = $b;
use GD;
use constant { X => 0, Y=> 1, R => 2 };
sub rgb2n{ unpack 'N', pack 'CCCC', 0, @_ }
my $RED = rgb2n( 255, 0, 0 );
my $GREEN = rgb2n( 0, 255, 0 );
my $BLUE = rgb2n( 0, 0, 255 );
my $YELLOW = rgb2n( 255, 255, 0 );
my $MAGENTA = rgb2n( 255, 0, 255 );
my $CYAN = rgb2n( 0, 255, 255 );
my $WHITE = rgb2n( 255,255,255 );
## Brute force from MatLab code node:1065900
## fx = [0,cumsum(unifrnd(0,1,1,10))];
my @fx = @{ reduce( sub{ push @$a, $a->[-1]+$b; $a }, [ 0 ], map{ 1+ra
+nd 10 } 1..10 ) };
## tmp=unifrnd(1,10,1,1e5);
my @tmp = map{ 1+ rand 10 } 1 .. 1e5;
## ix=floor(tmp);
my @ix = map int, @tmp;
## dx=rem(tmp,1);
my @dx = map $_-int($_), @tmp;
## values = (fx(ix) + (fx(ix+1)-fx(ix)).*dx)./fx(end-1);
my @values = map{
( $fx[ $ix[$_] ] + ( $fx[ $ix[$_+1] ] - $fx[ $ix[$_] ] ) * $dx[$_]
+ ) / $fx[-1]
} 0 .. $#ix-1;
our $N //= 100;
our $X = our $Y //= 800;
## pick points from values
my @points = map[
int( $values[ rand @values ]*$X ), int( $values[ rand @values ]*$Y
+ )
], 1 .. $N;
my $im = GD::Image->new( 1000, 1000, 1 );
$im->fill( 0, 0, $WHITE );
$im->rectangle( 100, 100, 900, 900, 0 );
$im->filledArc( 100+$_->[X], 100+$_->[Y], 5, 5, 0, 360, $RED ) for @po
+ints;
open PNG, '>:raw', "$0.png" or die $!;
print PNG $im->png;
close PNG;
system "$0.png";
Does the conversion look right? Am I using the values correctly?
It produces datasets like this which doesn't appear to demonstrate much in the way of clumping. What did I do wrong?
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|