use strict;
use GDS2;
use strict;
use Getopt::Std;
use Math::Trig;

use feature qw(declared_refs refaliasing say);

require './MaskArea.pm';
require "../p5_gdsii/pm/text2gds.pm";

package round_track;
our($VERSION);
$VERSION = "2026-06-23 00:36" ; # written by emacs time-stamp
## $VERSION .= ' UTC';
my $PI = 3.1415926535;
# -----------------------------------------------------------------

use POSIX qw(floor ceil);

sub arc($$ $$ $$$){
    my ($ptr) = @_;
    my ($x)		= shift; # center coordinate x
    my ($y)		= shift; # center coordinate y

    my ($start_angle)	= shift; # in degree, counter clockwise,
    my ($end_angle)	= shift; # in degree, counter clockwise

    my ($radius)	= shift; # in micron
    my ($polygon_count)	= shift; # default 12;

    my ($direction)	= shift; # 0 counter clockwise, 1 clockwise

    if ($polygon_count eq '') { $polygon_count = 12;}
    my ($gds2File)	= shift;

    my (@PTR);
    if ($end_angle < $start_angle ) {
	my $t = $end_angle;
	$end_angle = $start_angle;
	$start_angle = $t;
	$direction = 1 - $direction; # toggle in this case
    }
    if ($end_angle == $start_angle) { $start_angle = 0; $end_angle = 360;}
    my ($step)		= 
    ($end_angle - $start_angle)/$polygon_count;
    my ($count)		= ceil((abs($end_angle - $start_angle))/$step);

    my (@seq);
#    if ($start_angle > $end_angle)  { @seq = reverse (0 .. $count);}
#    else 			    { @seq =          0 .. $count; }
#    print $count,"\n";
    foreach my $i (0 .. $count ){
	my $radian = ($start_angle + $i * $step) * $PI/180;
	push(@PTR, [
	     $x + $radius * cos($radian),
	     $y + $radius * sin($radian)]);
    }
    if ($direction){ @PTR = reverse @PTR ;}
    my @COORDS;
    foreach my $i (0 .. $count){    
	push(@COORDS, ($PTR[$i]->[0],
	               $PTR[$i]->[1] ) );
    }
    return @COORDS
}
1;
# -----------------------------------------------------------------	


#  argument for arc subroutine

#     my ($x)		= shift; # center coordinate x
#     my ($y)		= shift; # center coordinate y
# 
#     my ($start_angle)	= shift; # in degree, counter clockwise,
#     my ($end_angle)	= shift; # in degree, counter clockwise
# 
#     my ($radius)	= shift; # in micron
#     my ($polygon_count)	= shift; # default 12;
# 
#     my ($direction)	= shift; # 0 counter clockwise, 1 clockwise
# 
#     if ($polygon_count eq '') { $polygon_count = 12;}
#     my ($gds2File)	= shift;

sub segment_block($$$$$ $$$$$ $) {
    my $start	= shift;
    my $end	= shift;
    my $diameter= shift;
    my $width	= shift;
    my $rate    = shift;

    my $L10     = shift;
    my $box_layer = shift;
    my $frame    = shift; 
    my $text_layer = shift;
    my $serial      = shift;
    my $gds2File = shift;
    my $layer    = int($diameter);

    my $polygon  = 36;

    my $F2        =  $frame/2 * $rate;
# --------------------------------------------------
#           this format is important
# --------------------------------------------------
    $width = 0.5;  # XXXXXXXXXXXXXXXXX
    my $name	= sprintf("round_track-%02.1f-%2.1f-%02d", 
			  $diameter, $width, $serial);
#    printf("%04d %s\n ", __LINE__, $name);
    my $radius = $diameter/2 ;

    $gds2File -> printBgnstr(-name => $name.'-perf');
# -----------------------------------------------
    $gds2File -> printBoundary( -xy =>
  [ 
  arc (0, 0, $start, $end, $radius + $width/2, $polygon, 1),
  arc (0, 0, $start, $end, $radius - $width/2, $polygon, 0),
  ],
  -layer => $layer
	);
   $gds2File -> printEndstr;

    # set the coords of center:
    # original coordinate origin is the center of the arch, but it should 
    # be shifted (located) in the center of the shape)

    my $angle		= ($start + $end) / 2;
    my ($x) =   $radius * cos($angle * $PI/180);
    my ($y) =   $radius * sin($angle * $PI/180);
    $gds2File -> printBgnstr(-name => $name);
    $gds2File -> printSref  (-name => $name. '-perf',
			     -xy =>[ -$x, -$y]);
    text2gds::text_flat(0, 0, $text_layer, 0.005 * $rate, sprintf("%03.1f-%03.1f",$start, $end),  $gds2File);
#   text2gds::text_flat(0.2, 0, 10, 0.005, $start,  $gds2File);
#   text2gds::text_flat(0.4, 0, 10, 0.005, $end,    $gds2File);
    $gds2File -> printBoundary(-xy => [-$F2,-$F2,
					    $F2,-$F2,
					    $F2, $F2,
					   -$F2, $F2],
				   -layer=> $box_layer);

   $gds2File -> printEndstr;
#    text2gds::text_flat( $x, $y - $radius * 2.2 - 0.1, 3, 0.005, $name, $gds2File);    
#    my($x, $y, $layer, $dotsize, $text, $gds2File) = @_;
#    print __LINE__. ' ', $name, "\n";

    return $name;
}

sub main ($$$ $$$ $) {
    my $L10      = shift;
    my $box_layer = shift;
    my $text_layer = shift;

    my $box_name    = shift;
    my $cross_name  = shift;
    my $S1234       = shift;

    my $gds2File = shift;

    my @NAMES_TO_PUSH;
my $rate = 1;
my ($delta_theta) = 18;  # degree (pitch) 
my ($polygons)    = 360 / $delta_theta;
my ($DIAMETER)      = 10 ;  # micron
my ($WIDTH)       = 0.5 ;# micron

# ---------------------------------------------------------------------

# ---------------------------------------------------------------------
    my $box_size = 2;
    my (@EXAMPLE10, @EXAMPLE75, @EXAMPLE05);
    my (@EXAMPLE95, @EXAMPLE90, @EXAMPLE80, @EXAMPLE70, @EXAMPLE60);
    my @CONFIG = (
    # diameter, width, count, frame size, example name
	[10.0,     0.5,    20, 2    ,     \@EXAMPLE10, 'Example10'],
#	[ 9.5,     0.5,    20, 2    ,     \@EXAMPLE95], #
	[ 9.0,     0.5,    20, 2    ,     \@EXAMPLE90, 'Example90'],
	[ 8.0,     0.5,    20, 2    ,     \@EXAMPLE80, 'Example80'], #
 	[ 7.0,     0.5,    20, 2    ,     \@EXAMPLE70, 'Example70'], #
 	[ 6.0,     0.5,    20, 2    ,     \@EXAMPLE60, 'Example60'], #
# 	[ 6.0,     0.5,    44, 0.9  ,     'Example75'],
#	[ 5.0,     0.5,    56, 0.53 ,     \@EXAMPLE05, 'Example05'],
	[ 5.0,     0.5,    20, 2    ,     \@EXAMPLE05, 'Example05'],
	);

    foreach my  $index ( 0..$#CONFIG) {
        my ($DIAMETER)    = $CONFIG[$index] -> [0];
        my ($WIDTH   )    = $CONFIG[$index] -> [1];
	my ($polygons)    = $CONFIG[$index] -> [2];
	my ($box_size)    = $CONFIG[$index] -> [3];
	my (\@NAMES  )    = $CONFIG[$index] -> [4];

	my ($delta_theta) =  360 / $polygons;
#	my @NAMES  = ();

	foreach my $i ( 0 .. $polygons - 1 ) {
        my $start = $i * $delta_theta;
	push (@NAMES,
	  segment_block( $start, $start + $delta_theta, $DIAMETER, $WIDTH, $rate,
			 $L10, $box_layer, $box_size, $text_layer, $i,
			 $gds2File));
	}
	my ($ptr) = $CONFIG[$index]-> [3];
   }

# ----------------------------------------------------------------
#$gds2File -> printBgnstr(-name => 'Example_10um');  # 4 degree x 90 pcs

my $radius = 5 * $rate;
my $angle_step = 360/18;

foreach my $i (0..$#CONFIG){
    my @NAMES = ();
    my $radius =     $CONFIG[$i] -> [0] / 2 ;
    my $count  =     $CONFIG[$i] -> [2];

    my $angle_step = 360 / $count;
    my $start_offset = $angle_step / 2;
 
  # ---------------------------------    
  #   one round track for each size
  # ---------------------------------
   $gds2File -> printBgnstr ( -name => $CONFIG[$i] -> [5]);
#   my @NAMES;
    \@NAMES = $CONFIG[$i] -> [4];

    foreach my $j ( 0 .. $#NAMES ) {

	my $name = $NAMES[$j];
	                    my $radian = ($angle_step * $j + $start_offset)  /180 * $PI ;
        my $x = $radius * cos ($radian);
        my $y = $radius * sin ($radian);
	$gds2File -> printSref(-name => $name, -xy => [$x, $y]);
    } 
                                               #layer , #dot size
    text2gds::text_flat( 0.2, $radius - 0.17 , 52, 0.03, sprintf("%2.1f", 2 * $radius), $gds2File);
    $gds2File -> printEndstr ();

 }
  # ---------------------------------    
  #         C O A X I A L 
  # ---------------------------------

    $gds2File -> printBgnstr (-name => 'coaxial10');
    foreach my $index (0..$#CONFIG){
	$gds2File -> printSref   (-name => $CONFIG[$index] -> [5],
				  -xy   => [0,0] );
    }
    $gds2File -> printEndstr;
# ----------------------------------------------------------------
}
1;
__END__

面積比(開口比) は 25% とのことです。

0.8um x 0.8um x 0.25 = 0.16 um^2

幅 0.4um の round track を作るとして、その面積の場合の長さは

(およそ)
0.16/0.4 -> 0.40um

半径 5 um の円の円周の長さは、2 π r で 31.4um
この長さを上記 0.40 で割ると 31.4/0.40  = 78.5

きりのいいところで 90 角形で 4 度となります。
