#!/usr/bin/perl

use Math::Complex;

# complex function:
#
# w(z) = z*(2/abs(z) - 1);
#

circle();
smiley();


sub circle() {
# create data points for a circle of radius 1 with center (0,0)

$r = 1 + 0*i;

for (my $angle=0; $angle < 360; $angle++) 
{
  $w = $r * exp(i*$angle/180*pi);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}
}

sub square() {
# create data points for a square centered at (0,0) of dimensions sq_x * sq_y

$sq_x = 1.25;
$sq_y = 1.25;

$r = $sq_x/2 - $sq_y/2*i;

for (my $step=0; $step <= 100; $step++) 
{
  $w = $r + $step/100*$sq_y*i;
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}

for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*pi/2);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}

for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*pi);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}


for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*3*pi/2);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}


# create data points after the transformation

for (my $step=0; $step <= 100; $step++) 
{
  $w = $r + $step/100*$sq_y*i;
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*pi/2);
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*pi);
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

for (my $step=0; $step <= 100; $step++) 
{
  $w = ($r + $step/100*$sq_y*i)*exp(i*3*pi/2);
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}
}


sub smiley() {
# create data point for a smiley

$r = 0.125 + 0*i;

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi) + 0.5 + 0.5*i;
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi) - 0.5 + 0.5*i;
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}

$r = 0 - 0.75*i;

for (my $angle=-45; $angle < 45; $angle++)
{
  $w = $r * exp(i*$angle/180*pi);
  #print $w,"\n";
  print Re($w)," ",Im($w),"\n";
}


# create transformed smiley

$r = 0.125 + 0*i;

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi) + 0.5 + 0.5*i;
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi) - 0.5 + 0.5*i;
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

for (my $angle=0; $angle < 360; $angle++)
{
  $w = $r * exp(i*$angle/180*pi);
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}

$r = 0 - 0.75*i;

for (my $angle=-45; $angle < 45; $angle++)
{
  $w = $r * exp(i*$angle/180*pi);
  $q = $w*(2/abs($w)-1),"\n";
  print Re($q)," ",Im($q),"\n";
}
}


