#!/usr/bin/perl -w

use 5.034;

my (@x, @y, @z);

for (0, 1){
    $x[$_] = ($_ == 0) ? 1 : 0;
    $y[$_] = ($_ == 0) ? 1 : 0;
    $z[$_] = ($_ == 0) ? 1 : 0;
}


my $N = 100;                   # N número de puntos de datos

my %point;
for (1 .. $N){
    $point{ rand() }{ rand() }{ rand() } = 1;
}

say "Data loaded";

my $P = 1_000;                  # P puntos interiores de retícula objetivo

# =====================================================

for my $i ( keys %point ){
    for my $j ( keys %{ $point{$i} }){
	for my $k ( keys %{ $point{$i}{$j} } ){
	    $x[0] = $i if ($i <= $x[0]);
	    $y[0] = $j if ($j <= $y[0]);
	    $z[0] = $k if ($k <= $z[0]);
	    $x[1] = $i if ($i > $x[1]);
	    $y[1] = $j if ($j > $y[1]);
	    $z[1] = $k if ($k > $z[1]);
	}
    }
}

my $c = 0;
my @vert;
my ($sumx, $sumy, $sumz);
say "VÉRTICES DEL POLITOPO CONTENEDOR CONVEXO";
for my $i (0, 1){
    for my $j (0, 1){
	for my $k (0, 1){
	    say "$x[$i] $y[$j] $z[$k]";
	    $vert[$c] = "$x[$i] : $y[$j] : $z[$k]";
	    $sumx += $x[$i];
	    $sumy += $y[$j];
	    $sumz += $z[$k];
	    $c++;
	}
    }
}
say "$c vértices";
$c--;

my $count = 0;
say "DISTANCIAS ENTRE ELLOS";
for my $i (0 .. $c){
    for my $j (0 .. $c){
	next if ($j >= $i);
	say "$i, $j -> ". dist($i, $j) . "";
	$count++;
    }
}
say "$count segmentos";

$x[2] = $sumx / $c;
$y[2] = $sumy / $c;
$z[2] = $sumz / $c;

say "Media aritmética vértices contenedor $x[2] $y[2] $z[2]";
$vert[$c+1] = "$x[2] : $y[2] : $z[2]";

my @radius;
# my ($imax, $ii);
say "DISTANCIAS AL CENTRO";
for my $i (0 .. $c){
    my $d = dist($i, $c+1);
    push @radius , $d;
    say "$i => $d";
#    if ($d > $imax){
#	$imax = $d;
#	$ii = $i;
#    }	
}

my $asignados = 1 + int ($P / $c);     # para cada vértice  
my @w = proportion();
say "PUNTOS INTERIORES GENERADOS";
for my $i (0 .. $c){
    my @vec = vectores ($i);     # vértice i
    my ($a, $b, $c) = split / \: /, $vert[$i];
    for (1 .. $asignados){
	say "". ($a + $w[$_-1]*$vec[0]) . " " . ($b + $w[$_-1]*$vec[1]) . " " . ($c + $w[$_-1]*$vec[2]) . "";
    }
}

exit 3;


sub dist {
    my ($i, $j) = @_;
    my ($xi, $yi, $zi) = split / \: /, $vert[$i];
    my ($xj, $yj, $zj) = split / \: /, $vert[$j];
    
    my $r = ($xi - $xj)**2 + ($yi - $yj)**2 + ($zi - $zj)**2;
    $r = $r ** (1/3);
    return $r;
}

sub vectores {
    my ($j) = shift;
    my ($xi, $yi, $zi) = split / \: /, $vert[$c+1];
    my ($xj, $yj, $zj) = split / \: /, $vert[$j];
    
    my $m = $xi-$xj;
    my $n = $yi-$yj;
    my $p = $zi-$zj;
    return ($m, $n, $p);
}

sub proportion {
    my @peso;
    my $s;
    for my $i (1 .. $asignados){
	$s += $i;	
    }
    for my $i (1 .. $asignados){
	push @peso , ($i / $s) ;
    }
    return @peso;
}




__END__
  
Ecuación de la recta:
  
(x, y, z) = (x0, y0, z0) + t * (x1-x0, y1-y0, z1-z0)
  
a) ( (x-x0)/(x1-x0) , (y-y0)/(y1-y0), (z-z0)/(z1-z0) ) = ( t, t, t )
  
b) ( x, y, z ) = ( t*(x1-x0) + x0, t*(y1-y0) + y0, t*(z1-z0) + z0 )
  
Interesa más la forma b) porque para sucesivos t (de un signo) obtengo paralelos hiperplanos
pero el problema reside en que si quiero M número de puntos tengo que relacionarlo
  con $count segmentos

Me interesan los t que no producen puntos fuera del politopo contenedor y eso se 
  mira fácilmente en que ningún x,y,z pueden estar por encima de su máximo o por 
  debajo de su mínimo. Solo un signo es bueno y hay que ver cuál.
  
Después, en sucesivos t con escala logarítmica inversa ir generando puntos. De fuera a 
  adentro se supone que va a resultar con más puntos en la zona "central", por acumulación.
  Se supone que se puede parar en la media aritmética de los xi,yi,zi vértices.
  Después, por distancias, calcular la t máxima
Se supone que el número de los t efectivos son $P/$c

Cuando se tienen $P puntos válidos, se para  
  

