.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) .\" .\" 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 turned on, 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 .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Math::PlanePath::HypotOctant 3pm" .TH Math::PlanePath::HypotOctant 3pm "2014-08-30" "perl v5.20.1" "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::HypotOctant \-\- octant of points in order of hypotenuse distance .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 3 \& use Math::PlanePath::HypotOctant; \& my $path = Math::PlanePath::HypotOctant\->new; \& my ($x, $y) = $path\->n_to_xy (123); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This path visits an octant of integer points X,Y in order of their distance from the origin 0,0. The points are a rising triangle 0<=Y<=X, .PP .Vb 11 \& 8 | 61 \& 7 | 47 54 \& 6 | 36 43 49 \& 5 | 27 31 38 44 \& 4 | 18 23 28 34 39 \& 3 | 12 15 19 24 30 37 \& 2 | 6 9 13 17 22 29 35 \& 1 | 3 5 8 11 16 21 26 33 \& Y=0 | 1 2 4 7 10 14 20 25 32 ... \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& X=0 1 2 3 4 5 6 7 8 .Ve .PP For example N=11 at X=4,Y=1 is sqrt(4*4+1*1) = sqrt(17) from the origin. The next furthest from the origin is X=3,Y=3 at sqrt(18). .PP This octant is \*(L"primitive\*(R" elements X^2+Y^2 in the sense that it excludes negative X or Y or swapped Y,X. .SS "Equal Distances" .IX Subsection "Equal Distances" Points with the same distance from the origin are taken in anti-clockwise order from the X axis, which means by increasing Y. Points with the same distance occur when there's more than one way to express a given distance as the sum of two squares. .PP Pythagorean triples give a point on the X axis and also above. For example 5^2 == 4^2 + 3^2 has N=14 at X=5,Y=0 simply as 5^2 = 5^2 + 0 and then N=15 at X=4,Y=3 for the triple. Both are 5 away from the origin. .PP Combinations like 20^2 + 15^2 == 24^2 + 7^2 occur too, and also with three or more different ways to have the same sum distance. .SS "Even Points" .IX Subsection "Even Points" Option \f(CW\*(C`points => "even"\*(C'\fR visits just the even points, meaning the sum X+Y even, so X,Y both even or both odd. .PP .Vb 10 \& 12 | 66 \& 11 | points => "even" 57 \& 10 | 49 58 \& 9 | 40 50 \& 8 | 32 41 51 \& 7 | 25 34 43 \& 6 | 20 27 35 45 \& 5 | 15 21 29 37 \& 4 | 10 16 22 30 39 \& 3 | 7 11 17 24 33 \& 2 | 4 8 13 19 28 38 \& 1 | 2 5 9 14 23 31 \& Y=0 | 1 3 6 12 18 26 36 \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& X=0 1 2 3 4 5 6 7 8 9 10 11 12 .Ve .PP Even points can be mapped to all points by a 45 degree rotate and flip. N=1,3,6,12,etc on the X axis here is on the X=Y diagonal of all-points. And conversely N=1,2,4,7,10,etc on the X=Y diagonal here is on the X axis of all-points. .PP .Vb 2 \& all_X = (even_X + even_Y) / 2 \& all_Y = (even_X \- even_Y) / 2 \& \& even_X = (all_X + all_Y) \& even_Y = (all_X \- all_Y) .Ve .PP The sets of points with equal hypotenuse are the same in the even and all, but the flip takes them in reverse order. The first such reversal occurs at N=14 and N=15. In even-points they're at 7,1 and 5,5. In all-points they're at 5,0 and 4,3 and those two map 5,5 and 7,1, ie. the opposite way around. .SS "Odd Points" .IX Subsection "Odd Points" Option \f(CW\*(C`points => "odd"\*(C'\fR visits just the odd points, meaning sum X+Y odd, so X,Y one odd the other even. .PP .Vb 10 \& 12 | 66 \& 11 | points => "odd" 57 \& 10 | 47 58 \& 9 | 39 49 \& 8 | 32 41 51 \& 7 | 25 33 42 \& 6 | 20 26 35 45 \& 5 | 14 21 29 37 \& 4 | 10 16 22 30 40 \& 3 | 7 11 17 24 34 \& 2 | 4 8 13 19 28 38 \& 1 | 2 5 9 15 23 31 \& Y=0 | 1 3 6 12 18 27 36 \& +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& X=0 1 2 3 4 5 6 7 8 9 10 11 12 13 .Ve .PP The X=Y diagonal is excluded because it has X+Y even. .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::HypotOctant\->new ()""" 4 .el .IP "\f(CW$path = Math::PlanePath::HypotOctant\->new ()\fR" 4 .IX Item "$path = Math::PlanePath::HypotOctant->new ()" .PD 0 .ie n .IP """$path = Math::PlanePath::HypotOctant\->new (points => $str)""" 4 .el .IP "\f(CW$path = Math::PlanePath::HypotOctant\->new (points => $str)\fR" 4 .IX Item "$path = Math::PlanePath::HypotOctant->new (points => $str)" .PD Create and return a new hypot octant path object. The \f(CW\*(C`points\*(C'\fR option can be .Sp .Vb 3 \& "all" all integer X,Y (the default) \& "even" only points with X+Y even \& "odd" only points with X+Y odd .Ve .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)" Return the X,Y coordinates of point number \f(CW$n\fR on the path. .Sp For \f(CW\*(C`$n < 1\*(C'\fR the return is an empty list, it being considered the first point at X=0,Y=0 is N=1. .Sp Currently it's unspecified what happens if \f(CW$n\fR is not an integer. Successive points are a fair way apart, so it may not make much sense to give an X,Y position in between the integer \f(CW$n\fR. .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. .SH "FORMULAS" .IX Header "FORMULAS" The calculations are not very efficient currently. For each Y row a current X and the corresponding hypotenuse X^2+Y^2 are maintained. To find the next furthest a search through those hypotenuses is made seeking the smallest, including equal smallest, which then become the next N points. .PP For \f(CW\*(C`n_to_xy()\*(C'\fR an array is built in the object used for repeat calculations. For \f(CW\*(C`xy_to_n()\*(C'\fR an array of hypot to N gives a the first N of given X^2+Y^2 distance. A search is then made through the next few N for the case there's more than one X,Y of that hypot. .SH "OEIS" .IX Header "OEIS" Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include .Sp .RS 4 (etc) .RE .PP .Vb 5 \& points="all" \& A024507 X^2+Y^2 of all points not on X axis or X=Y diagonal \& A024509 X^2+Y^2 of all points not on X axis \& being integers occurring as sum of two non\-zero squares, \& with repetitions for multiple ways \& \& points="even" \& A036702 N on X=Y leading Diagonal \& being count of points norm<=k \& \& points="odd" \& A057653 X^2+Y^2 values occurring \& ie. odd numbers which are sum of two squares, \& without repetitions .Ve .SH "SEE ALSO" .IX Header "SEE ALSO" Math::PlanePath, Math::PlanePath::Hypot, Math::PlanePath::TriangularHypot, Math::PlanePath::PixelRings, Math::PlanePath::PythagoreanTree .SH "HOME PAGE" .IX Header "HOME PAGE" .SH "LICENSE" .IX Header "LICENSE" Copyright 2011, 2012, 2013, 2014 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 .