CAD-Drawing
view release on metacpan or search on metacpan
lib/CAD/Drawing.pm view on Meta::CPAN
## print "$obj->{addr}{layer}\n";
# print "pretty color: $obj->{color}\n";
$obj->{pts} = [map({[@{$_}]} @$points)];
return($obj->{addr});
} # end subroutine addline definition
########################################################################
=head2 add_x
Adds an "X" to the drawing, with the intersection at @pt and each of the
two legs having $length at $opt{ang}.
@lines = $drw->add_x(\@pt, $length, \%opt);
=cut
sub add_x {
my $self = shift;
my ($pt, $length, $opt) = @_;
my %options;
(ref($opt) eq "HASH") && (%options = %$opt);
my $ang = $options{ang};
if(defined($ang)) {
my @ick = ($ang, 0);
checkarcangs(\@ick);
$ang = $ick[0];
}
else {
$ang = 0;
}
my @diff = map({$length * $_} cos($ang), sin($ang));
my @pts = (
[map({$pt->[$_] + $diff[$_]} 0..1)],
[map({$pt->[$_] - $diff[$_]} 0..1)],
);
my @ret = ($self->addline(\@pts, {%$opt}));
push(@ret, $self->addline(\@pts, {%$opt}));
$self->Rotate($ret[1], "90d", $pt);
## print "adding lines at $ret[0]{id} $ret[1]{id}\n";exit;
return(@ret);
} # end subroutine add_x definition
########################################################################
=head2 add_fake_ray
Adds an open polyline which has a small hook (nubbin) at one end. This
can be used to represent a directional line (vector.)
$drw->add_fake_ray(\@pts, \%opts);
Options are the same as for addpolygon but closed is forced to false.
=cut
sub add_fake_ray {
my $self = shift;
my ($points, $opt) = @_;
my %opts;
(ref($opt) eq "HASH") && (%opts = %$opt);
# maybe we should allow three, since we actually use three?
(scalar(@$points) == 2) or croak("cannot draw ray without 2 points");
# use a percentage of length, with a 15deg rotation ccw from
# reversed direction (later, add options.)
my $portion = 0.05;
my $rotate = $pi / 12;
my $rev = NewVec(line_vec(@$points)->ScalarMult($portion * -1));
my $length = $rev->Length();
my $ang = $rev->Ang() + $rotate;
my $vec = unit_angle($ang);
$vec = NewVec($vec->ScalarMult($length));
my @end = $vec->Plus($points->[1]);
$opts{closed} = 0;
return($self->addpolygon([@$points, \@end], \%opts));
} # end subroutine add_fake_ray definition
########################################################################
=head2 addpolygon
Add a polyline through (2D) @points.
%opts = ( closed => BOOLEAN );
$drw->addpolygon(\@points, \%opts);
=cut
sub addpolygon {
my $self = shift;
my ($points, $opts) = @_;
(ref($points) eq "ARRAY") or carp("$points is not ARRAY\n");
(scalar(@$points) > 1) or
carp("cannot draw pline without 2 or more points");
my $obj;
($obj, $opts) = $self->setdefaults("plines", $opts);
$obj->{pts} = [map({[@{$_}]} @$points)];
## defined($opts->{closed}) && print "closed is $obj->{closed}\n";
unless(defined($opts->{closed})) {
## print "closing\n";
($#$points > 1) && ($obj->{closed} = 1);
}
return($obj->{addr});
} # end subroutine addpolygon definition
########################################################################
=head2 addrec
A shortcut to addpolygon. Specify the opposite corners with @rec, which
will look like a diagonal line of the rectangle.
@rec = ( [$x1, $y1], [$x2, $y2] );
$drw->addrec(\@rec, $opts);
=cut
sub addrec {
my $self = shift;
my ($rec, $opts) = @_;
(ref($opts) eq "HASH") || ($opts = {});
my @rec = @$rec; # expect this to be of the form: ([x,y],[x,y])
my @points = (
[ $rec[0][0], $rec[0][1] ],
[ $rec[1][0], $rec[0][1] ],
[ $rec[1][0], $rec[1][1] ],
[ $rec[0][0], $rec[1][1] ]
( run in 1.116 second using v1.01-cache-2.11-cpan-39bf76dae61 )