Point
NAME
Pop::Point
SYNOPSIS
use Pop::Point :operators;
my $a = Pop::Point.new: 3, 4;
my $b = $a.add: 4;
say $a.length; # OUTPUT: 5
say ~$a.normal; # OUTPUT: (0.6, 0.8)
say $a == $a * -1; # True: they have the same length
say $a ~~ $a * -1; # False: they are different points
say $a === $a * 1; # True: point are immutable value objects
DESCRIPTION
Pop::Point is a basic, immutable 2D vector class in common use throughout Pop.
Methods in this class aim to cover the common use cases in Pop, and will in
some cases (eg. angle
) adjust their results so they are more convenient to
use in that context. It does not aim to be a generic point class.
For performance reasons, Pop::Point objects store their component values as floating point numbers.
Pop::Point objects are value objects.
Coercions
Single Real
values, or lists of two of them, can be coerced into
Pop::Point objects. When coercing a single numeric value, it will be used
for both components.
When using a Pop::Point object in a numeric context , it will be converted
to a number by calling lenght
. Calling list
(either directly or
indirectly via eg. |
) will return the values of the components as a list.
When coercing a Pop::Point to Bool
, it will be True
if any of its
components has a non-zero value.
Operators
The following operators will be exported if Pop::Point is imported with the
:operators
tag:
multi infix:<cmp> ( Pop::Point, Pop::Point )
Compares the length of both points
multi infix:<+> ( Pop::Point, Pop::Point )
multi infix:<-> ( Pop::Point, Pop::Point )
multi infix:<*> ( Pop::Point, Pop::Point )
multi infix:</> ( Pop::Point, Pop::Point )
Call add
, sub
, mul
, and div
with the second point on the first.
multi infix:<+> ( Pop::Point, Real )
multi infix:<-> ( Pop::Point, Real )
multi infix:<*> ( Pop::Point, Real )
multi infix:</> ( Pop::Point, Real )
Call add
, sub
, mul
, and div
with the numeric on the point.
multi infix:<⨯> ( Pop::Point, Pop::Point )
multi infix:<⋅> ( Pop::Point, Pop::Point )
Call cross
and dot
with the second point on the first.
multi infix:<+> ( Pop::Point, ( Real, Real ) )
multi infix:<-> ( Pop::Point, ( Real, Real ) )
multi infix:<*> ( Pop::Point, ( Real, Real ) )
multi infix:</> ( Pop::Point, ( Real, Real ) )
Call add
, sub
, mul
, and div
with the numeric list on the point.
METHODS
new
method new (
Real $x,
Real $y = $x,
) returns Pop::Point
Takes two positional Real
arguments and constructs a new Pop::Point object
with them set as the X and Y components respectively. If called with a single
value instead, this value will be used for both components.
zero
method zero () returns Pop::Point
Constructs a Pop::Point object with both components set to 0. This point will
evaluate to false if coerced to a Bool
.
x
method x () returns Num
Returns the X component for this point.
y
method y () returns Num
Returns the Y component for this point.
length
method length () returns Num
Returns the length of this Pop::Point object, when treated as 2D vector.
normal
method normal () returns Pop::Point
Returns a Pop::Point object with the same direction as the original, but with a length of 1.
floor
method floor () returns Pop::Point
Returns a Pop::Point object with both components rounded down.
round
method round () returns Pop::Point
Returns a Pop::Point object with both components rounded to their nearest integer.
ceiling
method ceiling () returns Pop::Point
Returns a Pop::Point object with both components rounded up.
angle
multi method angle () returns Num
multi method angle (
Pop::Point:D $reference,
) returns Num
Gives the angle in radians relative to the zero point, or to the point that is passed as argument. The angle will be returned in such a way that it is directly usable with the SDL coordinate system, where the Y-axis increases down.
This means that 0 will point right, π will point left, π/2 will point down, and -π/2 will point up.
add
multi method add (
Num(Real) $x,
Num(Real) $y = $x,
) returns Pop::Point
multi method add (
Pop::Point:D $other,
) returns Pop::Point
If called with a Pop::Point object, add the components of the argument to those of the invocant and return them in a new Pop::Point object.
If called with two numeric values, they will be added to the X and Y components respectively. If only one value is provided, it will be used for both components.
mul
multi method mul (
Num(Real) $x,
Num(Real) $y = $x,
) returns Pop::Point
multi method mul (
Pop::Point:D $other,
) returns Pop::Point
If called with a Pop::Point object, multiply the components of the argument with those of the invocant and return them in a new Pop::Point object.
If called with two numeric values, they will be added to the X and Y components respectively. If only one value is provided, it will be used for both components.
sub
multi method sub (
Num(Real) $x,
Num(Real) $y = $x,
) returns Pop::Point
multi method sub (
Pop::Point:D $other,
) returns Pop::Point
If called with a Pop::Point object, subtract the components of the argument from those of the invocant and return them in a new Pop::Point object.
If called with two numeric values, they will be added to the X and Y components respectively. If only one value is provided, it will be used for both components.
div
multi method div (
Num(Real) $x,
Num(Real) $y = $x,
) returns Pop::Point
multi method div (
Pop::Point:D $other,
) returns Pop::Point
If called with a Pop::Point object, divide the components of the invocant by those of the argument and return them in a new Pop::Point object.
If called with two numeric values, they will be added to the X and Y components respectively. If only one value is provided, it will be used for both components.
cross
method cross (
Pop::Point:D $other,
) returns Num
Called with a Pop::Point object, return the cross product of both vectors.
dot
method dot (
Pop::Point:D $other,
) returns Num
Called with a Pop::Point object, return the dot product of both vectors.
ACKNOWLEDGEMENTS
This class takes a lot of the basic infrastructure code from the Point class by Joshua Yeshouroun.
COPYRIGHT AND LICENSE
Copyright 2021 José Joaquín Atria
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.