--- /dev/null
+Locations, angles, etc.
+
+ Key type is a `loc', which is a named location (absolute, 2D) and
+ direction (at the location). Angles are generally positive
+ anticlockwise; bearings are angles measured from East. The origin is
+ at the South-West.
+
+Syntaxes
+ New location
+ <identifier>
+ Existing location
+ [-]<identifier> (- means reverse the sense)
+ Quantity (length/angle)
+ <number>[<unit>]
+ Angle units: d (degrees,default) r (radians)
+ Length units: mm (default) cm m
+ Identifiers (of locs and objects) start with lc letter, then
+ alphanums and underscores
+
+Commands
+
+ abs P X Y A
+ Defines loc P given coordinates (distances) and absolute bearing
+
+ rel F T L R A
+ Defines loc T: start at loc F, go forward L, translate right R,
+ turn left A.
+
+ extend F T len L [R] length L
+ extend F T upto U [R] s.t. perpendicular at T passes through U
+ extend F T ang A R subtending directionally A
+ extend F T uptoang A R s.t. direction at T is A
+ extend F T parallel U R s.t. direction at T is same as at U
+ Draws an arc or line from loc F, defining the other end as loc T.
+ If length R specified, draws an arc of radius R; R +ve curves to the
+ right; R -ve to the left.
+
+ defobj O
+ [commands]
+ enddef
+ Defines the object O. Inside the definition, the commands do not
+ draw when the object is being defined. The object has its own
+ coordinate space and its own location namespace.
+
+ obj[flip] O A F [P]
+ Places an instance of object O. The loc defined inside O as F
+ (`formal parameter', F must be just <identifier>) is placed at
+ existing loc A (`actual parameter'). If prefix P (syntax is that of
+ an identifier) is specified, each other loc L inside O is exported
+ into the global namespace as a new loc PL. If `flip' is used then
+ the object is placed with object-space y coordinates negated (ie, it
+ is mirrored so that the object's North exchanges with South).
my ($to, $endstatuses, $ctr,$from,$fromsense, $radius,$delta) = @_;
# does parametric_segment to draw an arc centred on $ctr
# from $from with radius $radius (this must be consistent!)
- # and subtending an angle $delta.
+ # and directionally-subtending an angle $delta.
# sets $to->... to be the other end, and returns $to
# $fromsense is 1 or -1, and affects only the interpretation
# of $from->{A} (not the result).
}
sub cmd_join {
- my ($from,$to,$how);
+ my ($from,$to,$how,$radius);
$from= can(\&cva_idex);
$to= can(\&cva_idex);
- $how= can(cvam_enum(qw(arcs arcsm)));
+ $how= can(cvam_enum(qw(arcs arcsline arcline)));
+ if ($how eq 'arcsline') {
+ $radius= can(\&cva_len);
+ }
+
my ($sigma,$distfact, $theta,$phi, $a,$b,$c,$d2, $r,$cfrom);
$sigma= v_bearing($from,$to);
$distfact= v_dist($from,$to);
$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});
+ } elsif ($how eq 'len') {
+ } else {
+ die "len of straight spec by angle";
}
printf DEBUG "len $len\n";
$to->{X}= $from->{X} + $len * cos($from->{A});