A Spiral of numbers
up vote
11
down vote
favorite
I am trying to produce a spiral of numbers from 1 through 101 with the following properties:
-- multiples of 5 are in a node shaped like pentagon
-- there is a special starburst node at numbers 3, 6, 11, 13, 17, 23, 29, 37, 43, 52, 56, 61, 63, 68, 69, 71, 72, 80, 91, 99.
(I think one could use the shapes.geometric
library to achieve both of these if only I could figure out how to switch styles at specific values of x
in the loop below.)
Here is where I am (with help from here):
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes.geometric}
usetikzlibrary{calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
begin{document}
hspace{0pt} vfill
begin{center}
newcounter{cntRoot}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
setcounter{cntRoot}{x}
addtocounter{cntRoot}{1}
node[fill=white,draw,circle,inner sep=1pt] at (c)
{$thecntRoot$};
coordinate (b) at (c);
};
end{tikzpicture}
end{center}
vfill
end{document}
I tried to implement ideas from this answer without much success. Any help would be much appreciated!
tikz-pgf tikz-styles
add a comment |
up vote
11
down vote
favorite
I am trying to produce a spiral of numbers from 1 through 101 with the following properties:
-- multiples of 5 are in a node shaped like pentagon
-- there is a special starburst node at numbers 3, 6, 11, 13, 17, 23, 29, 37, 43, 52, 56, 61, 63, 68, 69, 71, 72, 80, 91, 99.
(I think one could use the shapes.geometric
library to achieve both of these if only I could figure out how to switch styles at specific values of x
in the loop below.)
Here is where I am (with help from here):
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes.geometric}
usetikzlibrary{calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
begin{document}
hspace{0pt} vfill
begin{center}
newcounter{cntRoot}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
setcounter{cntRoot}{x}
addtocounter{cntRoot}{1}
node[fill=white,draw,circle,inner sep=1pt] at (c)
{$thecntRoot$};
coordinate (b) at (c);
};
end{tikzpicture}
end{center}
vfill
end{document}
I tried to implement ideas from this answer without much success. Any help would be much appreciated!
tikz-pgf tikz-styles
add a comment |
up vote
11
down vote
favorite
up vote
11
down vote
favorite
I am trying to produce a spiral of numbers from 1 through 101 with the following properties:
-- multiples of 5 are in a node shaped like pentagon
-- there is a special starburst node at numbers 3, 6, 11, 13, 17, 23, 29, 37, 43, 52, 56, 61, 63, 68, 69, 71, 72, 80, 91, 99.
(I think one could use the shapes.geometric
library to achieve both of these if only I could figure out how to switch styles at specific values of x
in the loop below.)
Here is where I am (with help from here):
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes.geometric}
usetikzlibrary{calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
begin{document}
hspace{0pt} vfill
begin{center}
newcounter{cntRoot}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
setcounter{cntRoot}{x}
addtocounter{cntRoot}{1}
node[fill=white,draw,circle,inner sep=1pt] at (c)
{$thecntRoot$};
coordinate (b) at (c);
};
end{tikzpicture}
end{center}
vfill
end{document}
I tried to implement ideas from this answer without much success. Any help would be much appreciated!
tikz-pgf tikz-styles
I am trying to produce a spiral of numbers from 1 through 101 with the following properties:
-- multiples of 5 are in a node shaped like pentagon
-- there is a special starburst node at numbers 3, 6, 11, 13, 17, 23, 29, 37, 43, 52, 56, 61, 63, 68, 69, 71, 72, 80, 91, 99.
(I think one could use the shapes.geometric
library to achieve both of these if only I could figure out how to switch styles at specific values of x
in the loop below.)
Here is where I am (with help from here):
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes.geometric}
usetikzlibrary{calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
begin{document}
hspace{0pt} vfill
begin{center}
newcounter{cntRoot}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
setcounter{cntRoot}{x}
addtocounter{cntRoot}{1}
node[fill=white,draw,circle,inner sep=1pt] at (c)
{$thecntRoot$};
coordinate (b) at (c);
};
end{tikzpicture}
end{center}
vfill
end{document}
I tried to implement ideas from this answer without much success. Any help would be much appreciated!
tikz-pgf tikz-styles
tikz-pgf tikz-styles
edited Dec 3 at 4:19
asked Dec 3 at 4:14
kan
3,19312155
3,19312155
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
21
down vote
accepted
I am sure that there is a more efficient way of dealing with your starbursts (for example, using LaTeX3), but the code below deals with them by first defining a comma separated list of special numbers and them looping through all of them to see if there is a match. The numbers mod 5
are easy to deal with using pgfmathparseresult
.
The end result is then:
Here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
newififnotfound% to mark the stars as we print them
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
node[fill=white,draw,regular polygon, regular polygon sides=5,inner sep=1pt] at (c) {$x$};
else
notfoundtrue% this will mark any starbursts
foreach y in starbursts {% check for stars
ifnumx=y% a star is born!
node[fill=white,draw,starburst,inner sep=1pt] at (c) {$x$};
globalnotfoundfalse% need global as inside a loop
fi
}
ifnotfound% we have not printed a node yet
node[fill=white,draw,circle,inner sep=1pt] at (c) {$x$};
fi
fi
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT
Here's a LaTeX3 version. The code is much neater but it is also slower in the sense that my laptop returns the following timings:
tikz: real 2.436 user 2.136 sys 0.281 pcpu 99.18
tikz: real 2.479 user 2.169 sys 0.294 pcpu 99.34
expl: real 2.557 user 2.250 sys 0.293 pcpu 99.45
expl: real 2.552 user 2.238 sys 0.301 pcpu 99.49
The output is the same as above. Here's the revised code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
usepackage{expl3}
ExplSyntaxOn
clist_new:N l_starbursts
clist_set:Nn l_starbursts {3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
newcommandSetNode[1]{
int_compare:nTF { int_mod:nn { #1 } { 5 } = 0 }
{tikzset{mynode/.append~style={regular~polygon, regular~polygon~sides=5}}}
{
clist_if_in:NoTF l_starbursts {#1}
{tikzset{mynode/.append~style={starburst}}}
{tikzset{mynode/.append~style={circle}}}
}
}
cs_generate_variant:Nn clist_if_in:NnTF {noTF}
ExplSyntaxOff
newififnotfound% to mark the stars as we print them
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT II
Here is a third "plain TeX" approach following jfbu's suggestion and where the stars take precedence over the hexagons (unlike above, as pointed out by sgmoye in the comments). I switched to plain TeX because, surprisingly, using LaTeX3 sequences in a similar fashion led to slower code. Perhaps clists would be better? It could also be that the first solution draws the nodes directly whereas solutions II and III use some tikzset{...}
trickery. Anyway, here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
defsetnextstar#1,#2!{%
ifrelaxdetokenize{#1}relaxgdefnextstar{200}elsegdefnextstar{#1}gdefstarbursts{#2}fi%
}
expandaftersetnextstarstarbursts,,!
newcommandSetNode[1]{
ifnum#1=nextstar
tikzset{mynode/.append style={starburst}}
expandaftersetnextstarstarbursts!
else
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
tikzset{mynode/.append style={regular polygon, regular polygon sides=5}}
else
tikzset{mynode/.append style={circle}}
fi
fi
}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
The output is slightly different in that 80
now has a star.
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: comparex
with the first: if<
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if>
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.
– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?
– sgmoye
Dec 3 at 12:11
|
show 4 more comments
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
21
down vote
accepted
I am sure that there is a more efficient way of dealing with your starbursts (for example, using LaTeX3), but the code below deals with them by first defining a comma separated list of special numbers and them looping through all of them to see if there is a match. The numbers mod 5
are easy to deal with using pgfmathparseresult
.
The end result is then:
Here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
newififnotfound% to mark the stars as we print them
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
node[fill=white,draw,regular polygon, regular polygon sides=5,inner sep=1pt] at (c) {$x$};
else
notfoundtrue% this will mark any starbursts
foreach y in starbursts {% check for stars
ifnumx=y% a star is born!
node[fill=white,draw,starburst,inner sep=1pt] at (c) {$x$};
globalnotfoundfalse% need global as inside a loop
fi
}
ifnotfound% we have not printed a node yet
node[fill=white,draw,circle,inner sep=1pt] at (c) {$x$};
fi
fi
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT
Here's a LaTeX3 version. The code is much neater but it is also slower in the sense that my laptop returns the following timings:
tikz: real 2.436 user 2.136 sys 0.281 pcpu 99.18
tikz: real 2.479 user 2.169 sys 0.294 pcpu 99.34
expl: real 2.557 user 2.250 sys 0.293 pcpu 99.45
expl: real 2.552 user 2.238 sys 0.301 pcpu 99.49
The output is the same as above. Here's the revised code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
usepackage{expl3}
ExplSyntaxOn
clist_new:N l_starbursts
clist_set:Nn l_starbursts {3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
newcommandSetNode[1]{
int_compare:nTF { int_mod:nn { #1 } { 5 } = 0 }
{tikzset{mynode/.append~style={regular~polygon, regular~polygon~sides=5}}}
{
clist_if_in:NoTF l_starbursts {#1}
{tikzset{mynode/.append~style={starburst}}}
{tikzset{mynode/.append~style={circle}}}
}
}
cs_generate_variant:Nn clist_if_in:NnTF {noTF}
ExplSyntaxOff
newififnotfound% to mark the stars as we print them
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT II
Here is a third "plain TeX" approach following jfbu's suggestion and where the stars take precedence over the hexagons (unlike above, as pointed out by sgmoye in the comments). I switched to plain TeX because, surprisingly, using LaTeX3 sequences in a similar fashion led to slower code. Perhaps clists would be better? It could also be that the first solution draws the nodes directly whereas solutions II and III use some tikzset{...}
trickery. Anyway, here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
defsetnextstar#1,#2!{%
ifrelaxdetokenize{#1}relaxgdefnextstar{200}elsegdefnextstar{#1}gdefstarbursts{#2}fi%
}
expandaftersetnextstarstarbursts,,!
newcommandSetNode[1]{
ifnum#1=nextstar
tikzset{mynode/.append style={starburst}}
expandaftersetnextstarstarbursts!
else
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
tikzset{mynode/.append style={regular polygon, regular polygon sides=5}}
else
tikzset{mynode/.append style={circle}}
fi
fi
}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
The output is slightly different in that 80
now has a star.
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: comparex
with the first: if<
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if>
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.
– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?
– sgmoye
Dec 3 at 12:11
|
show 4 more comments
up vote
21
down vote
accepted
I am sure that there is a more efficient way of dealing with your starbursts (for example, using LaTeX3), but the code below deals with them by first defining a comma separated list of special numbers and them looping through all of them to see if there is a match. The numbers mod 5
are easy to deal with using pgfmathparseresult
.
The end result is then:
Here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
newififnotfound% to mark the stars as we print them
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
node[fill=white,draw,regular polygon, regular polygon sides=5,inner sep=1pt] at (c) {$x$};
else
notfoundtrue% this will mark any starbursts
foreach y in starbursts {% check for stars
ifnumx=y% a star is born!
node[fill=white,draw,starburst,inner sep=1pt] at (c) {$x$};
globalnotfoundfalse% need global as inside a loop
fi
}
ifnotfound% we have not printed a node yet
node[fill=white,draw,circle,inner sep=1pt] at (c) {$x$};
fi
fi
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT
Here's a LaTeX3 version. The code is much neater but it is also slower in the sense that my laptop returns the following timings:
tikz: real 2.436 user 2.136 sys 0.281 pcpu 99.18
tikz: real 2.479 user 2.169 sys 0.294 pcpu 99.34
expl: real 2.557 user 2.250 sys 0.293 pcpu 99.45
expl: real 2.552 user 2.238 sys 0.301 pcpu 99.49
The output is the same as above. Here's the revised code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
usepackage{expl3}
ExplSyntaxOn
clist_new:N l_starbursts
clist_set:Nn l_starbursts {3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
newcommandSetNode[1]{
int_compare:nTF { int_mod:nn { #1 } { 5 } = 0 }
{tikzset{mynode/.append~style={regular~polygon, regular~polygon~sides=5}}}
{
clist_if_in:NoTF l_starbursts {#1}
{tikzset{mynode/.append~style={starburst}}}
{tikzset{mynode/.append~style={circle}}}
}
}
cs_generate_variant:Nn clist_if_in:NnTF {noTF}
ExplSyntaxOff
newififnotfound% to mark the stars as we print them
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT II
Here is a third "plain TeX" approach following jfbu's suggestion and where the stars take precedence over the hexagons (unlike above, as pointed out by sgmoye in the comments). I switched to plain TeX because, surprisingly, using LaTeX3 sequences in a similar fashion led to slower code. Perhaps clists would be better? It could also be that the first solution draws the nodes directly whereas solutions II and III use some tikzset{...}
trickery. Anyway, here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
defsetnextstar#1,#2!{%
ifrelaxdetokenize{#1}relaxgdefnextstar{200}elsegdefnextstar{#1}gdefstarbursts{#2}fi%
}
expandaftersetnextstarstarbursts,,!
newcommandSetNode[1]{
ifnum#1=nextstar
tikzset{mynode/.append style={starburst}}
expandaftersetnextstarstarbursts!
else
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
tikzset{mynode/.append style={regular polygon, regular polygon sides=5}}
else
tikzset{mynode/.append style={circle}}
fi
fi
}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
The output is slightly different in that 80
now has a star.
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: comparex
with the first: if<
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if>
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.
– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?
– sgmoye
Dec 3 at 12:11
|
show 4 more comments
up vote
21
down vote
accepted
up vote
21
down vote
accepted
I am sure that there is a more efficient way of dealing with your starbursts (for example, using LaTeX3), but the code below deals with them by first defining a comma separated list of special numbers and them looping through all of them to see if there is a match. The numbers mod 5
are easy to deal with using pgfmathparseresult
.
The end result is then:
Here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
newififnotfound% to mark the stars as we print them
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
node[fill=white,draw,regular polygon, regular polygon sides=5,inner sep=1pt] at (c) {$x$};
else
notfoundtrue% this will mark any starbursts
foreach y in starbursts {% check for stars
ifnumx=y% a star is born!
node[fill=white,draw,starburst,inner sep=1pt] at (c) {$x$};
globalnotfoundfalse% need global as inside a loop
fi
}
ifnotfound% we have not printed a node yet
node[fill=white,draw,circle,inner sep=1pt] at (c) {$x$};
fi
fi
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT
Here's a LaTeX3 version. The code is much neater but it is also slower in the sense that my laptop returns the following timings:
tikz: real 2.436 user 2.136 sys 0.281 pcpu 99.18
tikz: real 2.479 user 2.169 sys 0.294 pcpu 99.34
expl: real 2.557 user 2.250 sys 0.293 pcpu 99.45
expl: real 2.552 user 2.238 sys 0.301 pcpu 99.49
The output is the same as above. Here's the revised code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
usepackage{expl3}
ExplSyntaxOn
clist_new:N l_starbursts
clist_set:Nn l_starbursts {3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
newcommandSetNode[1]{
int_compare:nTF { int_mod:nn { #1 } { 5 } = 0 }
{tikzset{mynode/.append~style={regular~polygon, regular~polygon~sides=5}}}
{
clist_if_in:NoTF l_starbursts {#1}
{tikzset{mynode/.append~style={starburst}}}
{tikzset{mynode/.append~style={circle}}}
}
}
cs_generate_variant:Nn clist_if_in:NnTF {noTF}
ExplSyntaxOff
newififnotfound% to mark the stars as we print them
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT II
Here is a third "plain TeX" approach following jfbu's suggestion and where the stars take precedence over the hexagons (unlike above, as pointed out by sgmoye in the comments). I switched to plain TeX because, surprisingly, using LaTeX3 sequences in a similar fashion led to slower code. Perhaps clists would be better? It could also be that the first solution draws the nodes directly whereas solutions II and III use some tikzset{...}
trickery. Anyway, here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
defsetnextstar#1,#2!{%
ifrelaxdetokenize{#1}relaxgdefnextstar{200}elsegdefnextstar{#1}gdefstarbursts{#2}fi%
}
expandaftersetnextstarstarbursts,,!
newcommandSetNode[1]{
ifnum#1=nextstar
tikzset{mynode/.append style={starburst}}
expandaftersetnextstarstarbursts!
else
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
tikzset{mynode/.append style={regular polygon, regular polygon sides=5}}
else
tikzset{mynode/.append style={circle}}
fi
fi
}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
The output is slightly different in that 80
now has a star.
I am sure that there is a more efficient way of dealing with your starbursts (for example, using LaTeX3), but the code below deals with them by first defining a comma separated list of special numbers and them looping through all of them to see if there is a match. The numbers mod 5
are easy to deal with using pgfmathparseresult
.
The end result is then:
Here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
newififnotfound% to mark the stars as we print them
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
node[fill=white,draw,regular polygon, regular polygon sides=5,inner sep=1pt] at (c) {$x$};
else
notfoundtrue% this will mark any starbursts
foreach y in starbursts {% check for stars
ifnumx=y% a star is born!
node[fill=white,draw,starburst,inner sep=1pt] at (c) {$x$};
globalnotfoundfalse% need global as inside a loop
fi
}
ifnotfound% we have not printed a node yet
node[fill=white,draw,circle,inner sep=1pt] at (c) {$x$};
fi
fi
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT
Here's a LaTeX3 version. The code is much neater but it is also slower in the sense that my laptop returns the following timings:
tikz: real 2.436 user 2.136 sys 0.281 pcpu 99.18
tikz: real 2.479 user 2.169 sys 0.294 pcpu 99.34
expl: real 2.557 user 2.250 sys 0.293 pcpu 99.45
expl: real 2.552 user 2.238 sys 0.301 pcpu 99.49
The output is the same as above. Here's the revised code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
usepackage{expl3}
ExplSyntaxOn
clist_new:N l_starbursts
clist_set:Nn l_starbursts {3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
newcommandSetNode[1]{
int_compare:nTF { int_mod:nn { #1 } { 5 } = 0 }
{tikzset{mynode/.append~style={regular~polygon, regular~polygon~sides=5}}}
{
clist_if_in:NoTF l_starbursts {#1}
{tikzset{mynode/.append~style={starburst}}}
{tikzset{mynode/.append~style={circle}}}
}
}
cs_generate_variant:Nn clist_if_in:NnTF {noTF}
ExplSyntaxOff
newififnotfound% to mark the stars as we print them
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
EDIT II
Here is a third "plain TeX" approach following jfbu's suggestion and where the stars take precedence over the hexagons (unlike above, as pointed out by sgmoye in the comments). I switched to plain TeX because, surprisingly, using LaTeX3 sequences in a similar fashion led to slower code. Perhaps clists would be better? It could also be that the first solution draws the nodes directly whereas solutions II and III use some tikzset{...}
trickery. Anyway, here is the code:
documentclass[parskip]{scrartcl}
usepackage[margin=15mm]{geometry}
usepackage{stix}
usepackage{tikz}
usetikzlibrary{shapes,shapes.geometric,calc}
usepackage{pifont}
usepackage{wasysym}
usepackage{graphicx}
tikzset{
mynode/.style = {fill=white,draw,inner sep=1pt}
}
newcommandstarbursts{3,6,11,13,17,23,29,37,43,52,56,61,63,68,69,71,72,80,91,99}
defsetnextstar#1,#2!{%
ifrelaxdetokenize{#1}relaxgdefnextstar{200}elsegdefnextstar{#1}gdefstarbursts{#2}fi%
}
expandaftersetnextstarstarbursts,,!
newcommandSetNode[1]{
ifnum#1=nextstar
tikzset{mynode/.append style={starburst}}
expandaftersetnextstarstarbursts!
else
pgfmathparse{int(mod(x,5))}
ifnumpgfmathresult=0
tikzset{mynode/.append style={regular polygon, regular polygon sides=5}}
else
tikzset{mynode/.append style={circle}}
fi
fi
}
begin{document}
begin{tikzpicture}
coordinate (a) at (0,0);
coordinate (b) at (0:1);
foreach x in {1,...,100}{%
coordinate (c) at ($(b)!0.9cm!270:(a)$);
SetNode{x}
node[mynode] at (c) {$x$};
coordinate (b) at (c);
};
end{tikzpicture}
end{document}
The output is slightly different in that 80
now has a star.
edited Dec 3 at 13:08
answered Dec 3 at 5:29
Andrew
30.2k34380
30.2k34380
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: comparex
with the first: if<
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if>
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.
– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?
– sgmoye
Dec 3 at 12:11
|
show 4 more comments
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: comparex
with the first: if<
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if>
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.
– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?
– sgmoye
Dec 3 at 12:11
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
Thank you so much for your help! Much appreciated!
– kan
Dec 3 at 5:40
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
(Also, the comment "a star is born" had me giggling! We stan the talent!)
– kan
Dec 3 at 7:05
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
@kan Glad to be helpful and to amuse:)
– Andrew
Dec 3 at 9:56
you could have an evolving list (comma separated or whatever) of starbursts: compare
x
with the first: if <
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if >
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.– jfbu
Dec 3 at 10:53
you could have an evolving list (comma separated or whatever) of starbursts: compare
x
with the first: if <
do nothing, if equal do the "star is born" and suppress that (leading) entry from list, if >
you made a coding error somewhere. There should also be a flag to signal the starburst list is now empty.– jfbu
Dec 3 at 10:53
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,
80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?– sgmoye
Dec 3 at 12:11
I wondered what would happen if a number divisible by 5 were in the starburst list. Sure enough,
80
is just such a one: it is in the starburst list but is enclosed in a pentagon. Is this intended?– sgmoye
Dec 3 at 12:11
|
show 4 more comments
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f462906%2fa-spiral-of-numbers%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown