Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | package Pastel::Geometry::Point;\r |
2 | @ISA = ("Pastel::Mixin::Mixin");\r | |
3 | use strict;\r | |
4 | \r | |
5 | sub new \r | |
6 | {\r | |
7 | my( $class) = shift;\r | |
8 | my $self = {};\r | |
9 | bless $self, ref($class) || $class;\r | |
10 | $self = $self->_init(@_);\r | |
11 | return $self;\r | |
12 | }\r | |
13 | \r | |
14 | sub _init\r | |
15 | {\r | |
16 | my ($self) = shift;\r | |
17 | \r | |
18 | if (@_ == 1){ #If only one parameter left after shifting\r | |
19 | \r | |
20 | if(ref($_[0]) =~ /Point/i){\r | |
21 | $self-> _clone_point($_[0]);\r | |
22 | return $self;\r | |
23 | } \r | |
24 | else{\r | |
25 | return undef;\r | |
26 | }\r | |
27 | } \r | |
28 | else {\r | |
29 | my ($x, $y) = $self->_rearrange(["X", "Y"], @_);\r | |
30 | \r | |
31 | $self->{x} = $x ? $x : 0;\r | |
32 | $self->{y} = $y ? $y :0;\r | |
33 | return $self;\r | |
34 | }\r | |
35 | }\r | |
36 | \r | |
37 | sub _clone_point {\r | |
38 | my $self = shift;\r | |
39 | $self->{x} = $_[0]->get_x();\r | |
40 | $self->{y} = $_[0]->get_y();\r | |
41 | }\r | |
42 | \r | |
43 | sub get_x {\r | |
44 | my $self = shift;\r | |
45 | return $self->{x};\r | |
46 | }\r | |
47 | \r | |
48 | sub get_y {\r | |
49 | my $self = shift;\r | |
50 | return $self->{y};\r | |
51 | }\r | |
52 | \r | |
53 | sub set_x {\r | |
54 | my $self = shift;\r | |
55 | my ($x) = $self->_rearrange(["X"], @_);\r | |
56 | $self->{x} = $x;\r | |
57 | }\r | |
58 | \r | |
59 | sub set_y {\r | |
60 | my $self = shift;\r | |
61 | my ($y) = $self->_rearrange(["Y"], @_);\r | |
62 | $self->{y} = $y;\r | |
63 | }\r | |
64 | sub move {\r | |
65 | my $self = shift;\r | |
66 | my ($x, $y) = $self->_rearrange(["X", "Y"], @_);\r | |
67 | $self->{x} = $x;\r | |
68 | $self->{y} = $y;\r | |
69 | }\r | |
70 | \r | |
71 | sub translate {\r | |
72 | my $self = shift;\r | |
73 | my ($x, $y) = $self->_rearrange(["X", "Y"], @_);\r | |
74 | $self->{x} += $x;\r | |
75 | $self->{y} += $y;\r | |
76 | }\r | |
77 | \r | |
78 | sub set_location {\r | |
79 | my $self = shift;\r | |
80 | $self->move(@_);\r | |
81 | }\r | |
82 | \r | |
83 | sub equals {\r | |
84 | my $self = shift;\r | |
85 | my $x = $_[0]->get_x();\r | |
86 | my $y = $_[0]->get_y();\r | |
87 | if ( ($self->{x} == $x) && ($self->{y} == $y) ){\r | |
88 | return 1;\r | |
89 | } \r | |
90 | else {\r | |
91 | return undef;\r | |
92 | }\r | |
93 | }\r | |
94 | \r | |
95 | sub to_string {\r | |
96 | my $self = shift;\r | |
97 | my $r = ref($self)."[x=".$self->{x}.",y=".$self->{y}."]";\r | |
98 | return $r;\r | |
99 | }\r | |
100 | \r | |
101 | \r | |
102 | sub distance {\r | |
103 | my ($self, @args) = @_;\r | |
104 | =head1 \r | |
105 | if (($_[0] =~ /:point/i) || (ref($_[0]) =~ /:point/i)){\r | |
106 | ($self, @args) = @_;\r | |
107 | }\r | |
108 | else {\r | |
109 | @args = @_;\r | |
110 | }\r | |
111 | =cut \r | |
112 | my $d = undef;\r | |
113 | if (@args == 1){ #Passed a reference\r | |
114 | \r | |
115 | my $x = $args[0]->get_x();\r | |
116 | my $y = $args[0]->get_y();\r | |
117 | $d =_calculate_distance ($self->{x}, $self->{y},\r | |
118 | $x, $y);\r | |
119 | }\r | |
120 | elsif (@args == 2) {\r | |
121 | $d = _calculate_distance($self->{x}, $self->{y}, @args);\r | |
122 | }\r | |
123 | else {\r | |
124 | \r | |
125 | my ($x1, $y1, $x2, $y2) = \r | |
126 | Pastel::Mixin::Mixin::_rearrange("static",["X1","Y1","X2","Y2"],@_);\r | |
127 | \r | |
128 | $d = _calculate_distance($x1, $y1, $x2, $y2);\r | |
129 | \r | |
130 | }\r | |
131 | return $d;\r | |
132 | }\r | |
133 | \r | |
134 | sub _calculate_distance {\r | |
135 | my ($x1, $y1, $x2, $y2) = @_;\r | |
136 | return sqrt ( ($x1 - $x2)**2 + ($y1 - $y2)**2 );\r | |
137 | }\r | |
138 | \r | |
139 | 1;\r | |
140 | \r |