.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Math::PlanePath::PixelRings 3pm" .TH Math::PlanePath::PixelRings 3pm "2021-01-23" "perl v5.32.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Math::PlanePath::PixelRings \-\- pixellated concentric circles .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 3 \& use Math::PlanePath::PixelRings; \& my $path = Math::PlanePath::PixelRings\->new; \& my ($x, $y) = $path\->n_to_xy (123); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This path puts points on the pixels of concentric circles using the midpoint ellipse drawing algorithm. .PP .Vb 10 \& 63\-\-62\-\-61\-\-60\-\-59 5 \& / \e \& 64 . 40\-\-39\-\-38 . 58 4 \& / / \e \e \& 65 . 41 23\-\-22\-\-21 37 . 57 3 \& / / / \e \e \e \& 66 . 42 24 10\-\- 9\-\- 8 20 36 . 56 2 \& | / / / \e \e \e | \& 67 43 25 11 . 3 . 7 19 35 55 1 \& | | | | / \e | | | | \& 67 44 26 12 4 1 2 6 18 34 54 Y=0 \& | | | | \e / \& 68 45 27 13 . 5 . 17 33 53 80 \-1 \& | \e \e \e / / / | \& 69 . 46 28 14\-\-15\-\-16 32 52 . 79 \-2 \& \e \e \e / / / \& 70 . 47 29\-\-30\-\-31 51 . 78 \-3 \& \e \e / / \& 71 . 48\-\-49\-\-50 . 77 \-4 \& \e / \& 72\-\-73\-\-74\-\-75\-\-76 \-5 \& \& \-5 \-4 \-3 \-2 \-1 X=0 1 2 3 4 5 .Ve .PP The way the algorithm works means the rings don't overlap. Each is 4 or 8 pixels longer than the preceding. If the ring follows the preceding tightly then it's 4 longer, for example N=18 to N=33. If it goes wider then it's 8 longer, for example N=54 to N=80 ring. The average extra is approximately 4*\fBsqrt\fR\|(2). .PP The rings can be thought of as part-way between the diagonals like \&\f(CW\*(C`DiamondSpiral\*(C'\fR and the corners like \f(CW\*(C`SquareSpiral\*(C'\fR. .PP .Vb 5 \& * ** ***** \& * * * \& * * * \& * * * \& * * * \& \& diagonal ring corner \& 5 points 6 points 9 points .Ve .PP For example the N=54 to N=80 ring has a vertical part N=54,55,56 like a corner then a diagonal part N=56,57,58,59. In bigger rings the verticals are intermingled with the diagonals but the principle is the same. The number of vertical steps determines where it crosses the 45\-degree line, which is at R*\fBsqrt\fR\|(2) but rounded according to the midpoint algorithm. .SH "FUNCTIONS" .IX Header "FUNCTIONS" See \*(L"\s-1FUNCTIONS\*(R"\s0 in Math::PlanePath for behaviour common to all path classes. .ie n .IP """$path = Math::PlanePath::PixelRings\->new ()""" 4 .el .IP "\f(CW$path = Math::PlanePath::PixelRings\->new ()\fR" 4 .IX Item "$path = Math::PlanePath::PixelRings->new ()" Create and return a new path object. .ie n .IP """($x,$y) = $path\->n_to_xy ($n)""" 4 .el .IP "\f(CW($x,$y) = $path\->n_to_xy ($n)\fR" 4 .IX Item "($x,$y) = $path->n_to_xy ($n)" For \f(CW\*(C`$n < 1\*(C'\fR the return is an empty list, it being considered there are no negative points. .Sp The behaviour for fractional \f(CW$n\fR is unspecified as yet. .ie n .IP """$n = $path\->xy_to_n ($x,$y)""" 4 .el .IP "\f(CW$n = $path\->xy_to_n ($x,$y)\fR" 4 .IX Item "$n = $path->xy_to_n ($x,$y)" Return an integer point number for coordinates \f(CW\*(C`$x,$y\*(C'\fR. Each integer N is considered the centre of a unit square and an \f(CW\*(C`$x,$y\*(C'\fR within that square returns N. .Sp Not every point of the plane is covered (like those marked by a \*(L".\*(R" in the sample above). If \f(CW\*(C`$x,$y\*(C'\fR is not reached then the return is \f(CW\*(C`undef\*(C'\fR. .SH "SEE ALSO" .IX Header "SEE ALSO" Math::PlanePath, Math::PlanePath::Hypot, Math::PlanePath::MultipleRings .SH "HOME PAGE" .IX Header "HOME PAGE" .SH "LICENSE" .IX Header "LICENSE" Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Kevin Ryde .PP This file is part of Math-PlanePath. .PP Math-PlanePath is free software; you can redistribute it and/or modify it under the terms of the \s-1GNU\s0 General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. .PP Math-PlanePath is distributed in the hope that it will be useful, but \&\s-1WITHOUT ANY WARRANTY\s0; without even the implied warranty of \s-1MERCHANTABILITY\s0 or \s-1FITNESS FOR A PARTICULAR PURPOSE.\s0 See the \s-1GNU\s0 General Public License for more details. .PP You should have received a copy of the \s-1GNU\s0 General Public License along with Math-PlanePath. If not, see .