Итак, я занимался поиском и поиском других сайтов, моя консоль заполнена всеми этими предупреждениями. Просто немного не уверен, как исправить этот метод в целом. Кроме того, я надеюсь, что мой код не расплывчатый, так как я не слишком уверен, достаточно ли здесь кода. Независимо от этого здесь проблема. Некоторое время я пытался интегрировать скрипт Perl в мой модуль. Сам скрипт работает, но не в модуле. Сообщение об ошибке при попытке запустить именно этот метод:
sub generate_pillars_shape{
my $d=$_[4];
@X_values=$_[0]/$d..$_[1]/$d;
@X_values=map{$_*$d} @X_values;
@Y_values=$_[2]/$d..$_[3]/$d;
@Y_values=map{$_*$d} @Y_values;
for $i (0..$#X_values){
@Y=(@Y,@Y_values);
for $j (0..$#Y_values){
$X[$i*($#Y_values+1)+$j]= $X_values[$i];
}
}
return (\@X,\@Y);
}
Весь код состоит из этого:
use 5.010;
use Math::Trig ':radial';
use Math::Trig;
use List::Util qw(max min);
my $min_X=0;
my $max_X=60;
my $min_Y=0;
my $max_Y=60;
my $distance=10;
my @X_values;
my @Y_values;
my $i;
my $j;
#The minimum angle from horizontl your printer can make, in degrees
my $min_angle= 30;
#Ignore the next line, it is not an input parame
my @Z;
my ($X_ref,$Y_ref)= generate_pillars_shape($min_X,$max_X,$min_Y,$max_Y,$distance);my @X=@$X_ref;my @Y=@{$Y_ref};
for my $i (0..$#X){
$Z[$i]=20;#The function that defined the height of each point. This setting wil give you a flat roof. For a more advanced tree, try:
#$Z[$i]=-0.01*$X[$i]**2+0.2*$Y[$i]-0.005*$Y[$i]**2+20;
}
#End of input parameters.
my $min_radian = deg2rad($min_angle);
my $b = tan($min_radian);
@Z=map{$_/$b} @Z;
while ($#X>0){
my ($I,$J)=find_min_dist(\@X,\@Y,\@Z);
my ($X_branch,$Y_branch,$Z_branch)=find_branch($X[$I],$Y[$I],$Z[$I],$X[$J],$Y[$J],$Z[$J]);
my @X_list= ($X_branch,$X[$I],$X[$J]);
my @Y_list= ($Y_branch,$Y[$I],$Y[$J]);
my @Z_list= ($Z_branch,$Z[$I],$Z[$J]);
for my $j (0..$#Y_list){
if (abs($X_list[my $j]) < 0.001){
$X_list[$j]=0;
}
if (abs($Y_list[my $j]) < 0.001){
$Y_list[$j]=0;
}
if (abs($Z_list[my $j]) < 0.001){
$Z_list[$J]=0;
}
}
branch (\@X_list,\@Y_list,\@Z_list);
splice (@X,$I,1,$X_branch);
splice (@X,$J,1);
splice (@Y,$I,1,$Y_branch);
splice (@Y,$J,1);
splice (@Z,$I,1,$Z_branch);
splice (@Z,$J,1);
}
sub generate_pillars_shape{
my $d=$_[4];
@X_values=$_[0]/$d..$_[1]/$d;
@X_values=map{$_*$d} @X_values;
@Y_values=$_[2]/$d..$_[3]/$d;
@Y_values=map{$_*$d} @Y_values;
for $i (0..$#X_values){
@Y=(@Y,@Y_values);
for $j (0..$#Y_values){
$X[$i*($#Y_values+1)+$j]= $X_values[$i];
}
}
return (\@X,\@Y);
}
sub branch{
my @X=@{ $_[0] };
my @Y=@{ $_[1] };
my @Z=@{ $_[2] };
@Z=map{$_*$b}@Z;
for my $i (1..$#X){
my ($rho, $theta, $phi) = cartesian_to_spherical($X[$i]-$X[0],$Y[$i]-$Y[0],$Z[$i]-$Z[0]);
$phi = rad2deg($phi);
if (abs($phi)<0.001){$phi=0;}
$theta = rad2deg($theta)+90;
if (abs($theta)<0.001){$theta=0;}
if (abs($rho)>0.001){}
}
}
sub find_min_dist{
my @X=@{ $_[0] };
my @Y=@{ $_[1] };
my @Z=@{ $_[2] };
my $min_dist=($X[0]-$X[1])**2+($Y[0]-$Y[1])**2+($Z[0]-$Z[1])**2;
my $max_Z=$Z[0];
my $I=0;
my $J=1;
for my $i (1..$#Z){
if ($Z[$i]>=$max_Z){
$max_Z=$Z[$i];
my $I=$i;}
}
for my $j (0..$#X){
if ($j!=$I){
my $dist=(($X[$I]-$X[$j])**2+($Y[$I]-$Y[$j])**2+($Z[$I]-$Z[$j])**2);
if ($min_dist>$dist){
$min_dist=$dist;
my $J=$j;
}}}
return ($I,$J);
}
sub find_branch{
my $X1=$_[0];
my $Y1=$_[1];
my $Z1=$_[2];
my $X2=$_[3];
my $Y2=$_[4];
my $Z2=$_[5];
my $rXY=sqrt(($X1-$X2)**2+($Y1-$Y2)**2);
if (abs($Z1-$Z2) < $rXY) {
my $Z_branch=($Z1+$Z2-$rXY)/2;
my $a=($Z1-$Z_branch)/$rXY;
my $X_branch=(1-$a)*$X1+$a*$X2;
my $Y_branch=(1-$a)*$Y1+$a*$Y2;
}
elsif ($Z1 < $Z2) {
my $X_branch=$X1;
my $Y_branch=$Y1;
my $Z_branch=$Z1;
}
else {
my $X_branch=$X2;
my $Y_branch=$Y2;
my $Z_branch=$Z2;
}
return my($X_branch,$Y_branch,$Z_branch);
}
Я надеюсь, что это объясняет общую ситуацию, любая помощь будет оценена. Спасибо.