# $loc{$id}{Y}
# $loc{$id}{A} may be undef
+#$debug=1;
open DEBUG, ($debug ? ">&2" : ">/dev/null") or die $!;
+if ($debug) {
+ select(DEBUG); $|=1;
+ select(STDOUT); $|=1;
+}
+
sub canf ($$) {
my ($converter,$defaulter)=@_;
my ($spec,$v);
}
sub cva_idex ($) {
my ($sp,$id)=@_;
- my ($r);
+ my ($r,$d,$k);
$id=cva_idstr($sp);
die "unknown $id" unless defined $loc{$id};
$r= $loc{$id};
- printf DEBUG "%s %s %s\n", $id, join("|", keys %$r), $r->{A};
+ $d= "idex $id";
+ foreach $k (sort keys %$r) { $d .= " $k=$r->{$k}"; }
+ printf DEBUG "%s\n", $d;
return $r;
}
sub cva_idnew ($) {
dv('cmd_abs ','$nl',$nl,'\\%loc',\%loc);
}
+sub cmd_rel {
+ $from= can(\&cva_idex);
+ $to= can(\&cva_idnew);
+ $len= can(\&cva_len);
+ $right= can(\&cva_len);
+ $turn= cano(\&cva_ang, 0);
+ $to->{X}= $from->{X} + $len * cos($from->{A}) + $right * sin($from->{A});
+ $to->{Y}= $from->{Y} + $len * sin($from->{A}) - $right * cos($from->{A});
+ $to->{A}= $from->{A} + $turn;
+dv('cmd_abs ','$to',$to);
+}
+
sub evreff ($) {
my ($pfx) = @_;
$pfx . ($pfx =~ m/\}$|\]$/ ? '' : '->');
dv1($pfx,$expr.sprintf($ixfmt,evr($ix)),$v);
}
if (!$any) {
- printf DEBUG "%s%s= ".$ixfmt, $pfx, $expr, ' ';
+ printf DEBUG "%s%s= $ixfmt\n", $pfx, $expr, ' ';
}
1;
}
sub dv1 ($$$) {
- return unless $debug;
+ return ;0 unless $debug;
my ($pfx,$expr,$v) = @_;
$ref= ref $v;
#print STDERR "dv1 >$pfx|$ref<\n";
my ($a,$b,$p) = @_;
my ($q,$r) = 1.0-$p;
map { $r->{$_} = $q * $a->{$_} + $p * $b->{$_} } qw(X Y A);
- dv("loc_lin_comb ",'$a',$a,'$b',$b,'$p',$p,'$r',$r);
+# dv("loc_lin_comb ",'$a',$a,'$b',$b,'$p',$p,'$r',$r);
return $r;
}
foreach $zo (qw(0 1)) {
$prop= $zo ? $inunit : (1.0 - $inunit);
$ea_zo{X} += $prop * ($ends->[$zo]{X} - $across * sin($ends->[0]{A}));
- $ea_zo{Y} += $prop * ($ends->[$zo]{Y} - $across * cos($ends->[0]{A}));
+ $ea_zo{Y} += $prop * ($ends->[$zo]{Y} + $across * cos($ends->[0]{A}));
}
# dv("psu_coords ", '$ends',$ends, '$inunit',$inunit, '$across',$across,
# '\\%ea_zo', \%ea_zo);
my ($tickpitch)=($psu_ulen / $psu_ticksperu);
my ($sleeperctr)=($psu_ulen*0.5);
my ($sleeperend)=($psu_sleeperlen*0.5);
-print DEBUG "ps $p0 $p1\n";
+print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n";
for ($pa= $p0; $pa<$p1; $pa=$pb) {
$pb= $pa + $ppu;
$p= $pa; $ends[0]= @ends ? $ends[1] : &$calcfn;
$p= $pb; $ends[1]= &$calcfn;
-print DEBUG "pa $pa $ends[0]{X} $ends[0]{Y} $ends[0]{A}\n";
-print DEBUG "pb $pb $ends[1]{X} $ends[1]{Y} $ends[1]{A}\n";
+#print DEBUG "pa $pa $ends[0]{X} $ends[0]{Y} $ends[0]{A}\n";
+#print DEBUG "pb $pb $ends[1]{X} $ends[1]{Y} $ends[1]{A}\n";
$e= $pb<=$p1 ? 1.0 : ($p1-$pa)/$ppu;
o(" gsave\n");
o_path_begin();
}
sub cmd_extend {
- my ($from,$to);
+ my ($from,$to,$radius,$ctr,$beta,$ang,$how,$signum);
$from= can(\&cva_idex);
$to= can(\&cva_idnew);
- printf DEBUG "%s %s\n", join("|", keys %$from), join("|", values %$from);
+ printf DEBUG "from $from->{X} $from->{Y} $from->{A}\n";
die "no ang" unless defined $from->{A};
- $how= can(cvam_enum(qw(len upto ang)));
+ $how= can(cvam_enum(qw(len upto ang uptoang parallel)));
if ($how eq 'len') { $len= can(\&cva_len); }
- elsif ($how eq 'ang') { $ang= can(\&cva_ang); }
- elsif ($how eq 'upto') { $upto= can(\&cva_id); }
- $radius= cano(\&cva_ang, 'Inf'); # +ve is right hand bend
+ elsif ($how =~ m/ang$/) { $ang= can(\&cva_ang); }
+ elsif ($how eq 'parallel' || $how eq 'upto') { $upto= can(\&cva_idex); }
+ $radius= cano(\&cva_len, 'Inf'); # +ve is right hand bend
if ($radius eq 'Inf') {
print DEBUG "extend inf $len\n";
if ($how eq 'ang') { die "len of straight spec by angle"; }
if ($how eq 'upto') {
- $len= ($upto->{X} - $from->{X}) * cos($from->{a})
- + ($upto->{Y} - $from->{Y}) * sin($from->{a});
+ $len= ($upto->{X} - $from->{X}) * cos($from->{A})
+ + ($upto->{Y} - $from->{Y}) * sin($from->{A});
}
+ printf DEBUG "len $len\n";
$to->{X}= $from->{X} + $len * cos($from->{A});
$to->{Y}= $from->{Y} + $len * sin($from->{A});
$to->{A}= $from->{A};
loc_lin_comb($from, $to, $p);
});
} else {
+ print DEBUG "radius >$radius<\n";
$signum= $radius / abs($radius);
$ctr->{X}= $from->{X} + $radius * sin($from->{A});
$ctr->{Y}= $from->{Y} - $radius * cos($from->{A});
if ($how eq 'upto') {
$beta= atan2(-$signum * ($upto->{X} - $ctr->{X}),
$signum * ($upto->{Y} - $ctr->{Y}));
+ $beta_interval= 1.0;
+ } elsif ($how eq 'parallel') {
+ $beta= $upto->{A};
+ $beta_interval= 1.0;
+ } elsif ($how eq 'uptoang') {
+ $beta= $ang;
+ $beta_interval= 2.0;
+ } elsif ($how eq 'len') {
+ $beta= $from->{A} - $signum * $len / abs($radius);
+ $beta_interval= 2.0;
} else {
- if ($how eq 'len') { $ang= $len / abs($radius); }
$beta= $from->{A} - $signum * $ang;
+ $beta_interval= 2.0;
}
+ printf DEBUG "ctr->{Y}=$ctr->{Y} radius=$radius beta=$beta\n";
+ $beta += $signum * 4.0 * $pi;
+ for (;;) {
+ $delta= $beta - $from->{A};
+ last if $signum * $delta <= 0;
+ $beta -= $signum * $beta_interval * $pi;
+ }
+ printf DEBUG "ctr->{Y}=$ctr->{Y} radius=$radius beta=$beta\n";
$to->{A}= $beta;
- $to->{X}= $ctr->{X} + $radius * cos($beta);
- $to->{Y}= $ctr->{Y} - $radius * sin($beta);
-# parametric_segment(0, II, $radius);
+ $to->{X}= $ctr->{X} - $radius * sin($beta);
+ $to->{Y}= $ctr->{Y} + $radius * cos($beta);
+ parametric_segment(II, 0.0, 1.0, abs($radius*$delta), sub {
+ my ($beta) = $from->{A} + $delta * $p;
+ return { X => $ctr->{X} - $radius * sin($beta),
+ Y => $ctr->{Y} + $radius * cos($beta),
+ A => $beta }
+ });
}
- die "point only" unless defined $from->{A};
- join($from,$to);
+ printf DEBUG "to $to->{X} $to->{Y} $to->{A}\n";
}
sub cmd__do {
&{ "cmd_$cmd" };
}
-$ptscale= 72/25.4 * 0.1;
+$ptscale= 72/25.4 / 5.0;
o("%!\n".
" $ptscale $ptscale scale\n");
chomp; s/^\s+//; s/\s+$//;
@al= split /\s+/, $_;
next unless @al;
+ print DEBUG "=== @al\n";
$mark= 0;
cmd__do();
}