use Image::Magick;







# 0)Input
# 0.1) counting variable, folders, file
$p = '1'; #counting variable
$sourcefolder_path = "C:/ART/IM_PlaneCovering/1_Sourceimages/";
$sourcefile_name = 'image.jpg'; 
$p3m1_resultfolder_path = "C:/ART/IM_PlaneCovering/2_Tiles/2_03_p3m1-Tiles/";



# 0.2) definition of lokal parameters
$triangle_width_min_Faktor = 0.4;
$triangle_width_max_Faktor = 0.6;




# 1) definition of PerlMagick objects
$image_p3m1 = new Image::Magick;
$p3m1_mask = new Image::Magick;
$transparent_extention = new Image::Magick;




# 2) inilisation of random number generator
srand;





# 3) open the source image 
$sourcefile_fullname = $sourcefolder_path . $sourcefile_name; 
$image_p3m1->Read("$sourcefile_fullname");




# 4) local parameter calculations: $triangle_width = $triangle_height, $x1, $y1 
$image_width = $image_p3m1->Get('columns'); 
$image_height = $image_p3m1->Get('rows'); 
if ($image_width < $image_height) {$image_min = $image_width} else {$image_min = $image_height}; 
$triangle_width_min = $triangle_width_min_Faktor * $image_min;
$triangle_width_max = $triangle_width_max_Faktor * $image_min;
$triangle_width = $triangle_width_min + (int(rand($triangle_width_max - $triangle_width_min)) + 1); 
if ($triangle_width % 2 == 0) {$triangle_width++};
$triangle_height = int(1/2 * sqrt(3) * $triangle_width)+1; 
$x_allowed = $image_width - $triangle_width;
$y_allowed = $image_height - $triangle_height;
$x1 = int(rand($x_allowed))+1;
$y1 = int(rand($y_allowed))+1;




# 5) Generate mask p3m1_mask
#convert -size {$triangle_width}x{$triangle_height} xc:none -fill red -draw "polyline 0,0 $triangle_width,0 int(1/2 * $triangle_width)+1,$triangle_height" p3m1_mask.png
$p3m1_mask->Set(size=>"$triangle_width x $triangle_height");
$p3m1_mask->Read('xc:none');
$triangle_halfwidth = int(1/2 * $triangle_width)+1; 
$p3m1_mask->Draw(primitive=>'polyline', points=>"0,0 $triangle_width,0 $triangle_halfwidth,$triangle_height", fill=>'red');




# 6) Generate image_p3m1
#convert image.jpg -crop {$triangle_width}x{$triangle_height}+{$x1}+{$y1} -background none +repage image_p3m1.png
$image_p3m1->Crop(geometry=>"$triangle_width x $triangle_height+$x1+$y1"); 



# 7) Generate G1, G2, G6, G5
# 7.1) Generate  p3m1_G1
#composite p3m1_mask.png image_p3m1.png -matte -compose Dst_In -background none +repage p3m1_G1.png
$p3m1_G1 = $p3m1_mask->Clone();
$p3m1_G1->Composite(image=>$image_p3m1, compose=>in, color=>'transparent', matte=>'true');



# 7.2) Generation of p3m1_G2
#convert p3m1_G1.png -flop -rotate -60 p3m1_G6b.png
#convert p3m1_G2b.png -gravity NorthEast -crop {$triangle_width}x{$triangle_height}+0+0 -background none +repage p3m1_G2.png
$p3m1_G2 = $p3m1_G1->Clone();
$p3m1_G2->Flop();
$p3m1_G2->Rotate(degrees=>60, color=>'transparent');
$p3m1_G2_width_rotated = $p3m1_G2->Get('columns'); 
$p3m1_G2_cropwidth = $p3m1_G2_width_rotated - $triangle_width; 
$p3m1_G2->Crop(geometry=>"$triangle_width x $triangle_height + $p3m1_G2_cropwidth+0", background=>'transparent');




# 7.3) Generation of p3m1_G6
#convert p3m1_G1.png -flop -rotate -60 p3m1_G6b.png
#convert p3m1_G6b.png -crop {$triangle_width}x{$triangle_height}+0+0 -background none +repage p3m1_G6.png
$p3m1_G6 = $p3m1_G1->Clone();
$p3m1_G6->Flop();
$p3m1_G6->Rotate(degrees=>-60, color=>'transparent');
$p3m1_G6->Crop(geometry=>"$triangle_width x $triangle_height+0+0", background=>'transparent');




# 7.4) Generation of p3m1_G5
#convert p3m1_G6.png -flip  p3m1_G5.png
$p3m1_G5 = $p3m1_G6->Clone();
$p3m1_G5->Flip();





# 8) Generate p3m1_tile_part
# 8.1) crop 1/2 G6 left
#convert p3m1_G6.png -gravity East -crop {int(1/2 * $triangle_width)+1}x{$triangle_height}+0+0 -background none +repage p3m1_G6h.png 
$p3m1_G6h = $p3m1_G6->Clone();
$p3m1_G6h->Crop(geometry=>"$triangle_halfwidth x $triangle_height + $triangle_halfwidth+0", background=>'transparent');




# 8.2) insert p3m1_G6h in G1 at the left side
#composite p3m1_G6h.png p3m1_G1.png -gravity West -compose Dst_Over -background none +repage p3m1_tile_part-1.png
$p3m1_tile_part = $p3m1_G1->Clone();
$p3m1_tile_part->Composite(image=>$p3m1_G6h, gravity=>West, compose=>over, color=>'transparent', matte=>'true');




# 8.3) extend p3m1_tile_part on the right with transparency
#convert -size {int(1/2 * $triangle_width) + 1}x{$triangle_height} xc:none transparent_extention.png
#convert p3m1_tile_part-1.png transparent_extention.png +append -background none +repage p3m1_tile_part-2.png
$transparent_extention->Set(size=>"$triangle_halfwidth x $triangle_height");
$transparent_extention->Read('xc:none');
$q = $p3m1_tile_part->Clone();
push(@$q, $transparent_extention); 
$p3m1_tile_part = $q->Append(stack=>'false'); 




# 8.4) insert G2 at the right side
#composite p3m1_G2.png p3m1_tile_part-2.png -gravity East -compose Dst_Over -background none +repage p3m1_tile_part-3.png
$p3m1_tile_part->Composite(image=>$p3m1_G2, gravity=>East, compose=>over, color=>'transparent', matte=>'true');





# 8.5) crop1/2 G5
# convert p3m1_G5.png -gravity West -crop {int(1/2 * $triangle_width)+1}x{$triangle_height}+0+0 -background none +repage p3m1_G5h.png 
$p3m1_G5h = $p3m1_G5->Clone();
$p3m1_G5h->Crop(geometry=>"$triangle_halfwidth x $triangle_height+0+0",background=>'transparent');



# 8.6) insert p3m1_G5h right in p3m1_tile_part
#composite p3m1_G5h.png p3m1_tile_part-3.png -gravity East -compose Dst_Over -background none +repage p3m1_tile_part.png
$p3m1_tile_part->Composite(image=>$p3m1_G5h, gravity=>East, compose=>over, color=>'transparent', matte=>'true');





# 9) Generate p3m1_tile
# 9.1) Generate p3m1_tile_part_flip
#convert p3m1_tile_part.png -flip -background none +repage p3m1_tile_part_flip.png
$p3m1_tile_part_flip = $p3m1_tile_part->Clone();
$p3m1_tile_part_flip->Flip();




# 9.2) Generate tile_row
#convert p3m1_tile_part.png p3m1_tile_part_flip.png +append -background none +repage p3m1_tile_row.png
$q = ();
$q = $p3m1_tile_part->Clone();
push(@$q, $p3m1_tile_part_flip); 
$p3m1_tile_row = $q->Append(stack=>'false'); 




# 9.3) Generate tile_row_flip
#convert p3m1_tile_row.png -flip -background none +repage p3m1_tile_row_flip.png
$p3m1_tile_row_flip = $p3m1_tile_row->Clone();
$p3m1_tile_row_flip->Flip();



# 9.4) Generate p3m1_tile
#convert p3m1_tile_row.png p3m1_tile_row_flip.png -append -background none +repage p3m1_tile.png
@$q = ();
$q = $p3m1_tile_row->Clone();
push(@$q, $p3m1_tile_row_flip); 
$p3m1_tile = $q->Append(stack=>'true'); 






# 10) generate name of result image
chop $sourcefile_name;
chop $sourcefile_name;
chop $sourcefile_name;
chop $sourcefile_name;

if ($p <= 9) {$resultimage_name = "p3m1_tile_" . $sourcefile_name . "-0" . $p . ".jpg"} 
	else {$resultimage_name = "p3m1_tile_" . $sourcefile_name . "-"  . $p . ".jpg"}; 

$resultimagepath_name = $p3m1_resultfolder_path . $resultimage_name; 





#11) save result image
$p3m1_tile->Write(filename=>"$resultimagepath_name", compression=>'JPEG', quality=>'95'); 




#print ("$triangle_width $triangle_height $x_allowed $y_allowed $x1 $y1");





