Test whether a circle fully lies within a polygon in TikZ
Given the following TikZ picture with an irregularly shaped polygon:
documentclass{article}
usepackage{tikz}
begin{document}
begin{tikzpicture}
path[draw=blue] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (3.5,0.4) {};
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (1.03,1.3) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (3.3,2) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (0.7,1.8) {};
end{tikzpicture}
end{document}
The two green circles in the picture lie completely inside the polygon, while the red ones lie partially or fully outside. Is there a way to automate that "ownership" test in TikZ? I know algorithms exist for such kind of tests, but does TikZ already provide this or similar features (e.g. tests for single points)?
tikz-pgf
add a comment |
Given the following TikZ picture with an irregularly shaped polygon:
documentclass{article}
usepackage{tikz}
begin{document}
begin{tikzpicture}
path[draw=blue] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (3.5,0.4) {};
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (1.03,1.3) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (3.3,2) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (0.7,1.8) {};
end{tikzpicture}
end{document}
The two green circles in the picture lie completely inside the polygon, while the red ones lie partially or fully outside. Is there a way to automate that "ownership" test in TikZ? I know algorithms exist for such kind of tests, but does TikZ already provide this or similar features (e.g. tests for single points)?
tikz-pgf
2
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use theeven odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.
– Andrew
10 hours ago
add a comment |
Given the following TikZ picture with an irregularly shaped polygon:
documentclass{article}
usepackage{tikz}
begin{document}
begin{tikzpicture}
path[draw=blue] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (3.5,0.4) {};
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (1.03,1.3) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (3.3,2) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (0.7,1.8) {};
end{tikzpicture}
end{document}
The two green circles in the picture lie completely inside the polygon, while the red ones lie partially or fully outside. Is there a way to automate that "ownership" test in TikZ? I know algorithms exist for such kind of tests, but does TikZ already provide this or similar features (e.g. tests for single points)?
tikz-pgf
Given the following TikZ picture with an irregularly shaped polygon:
documentclass{article}
usepackage{tikz}
begin{document}
begin{tikzpicture}
path[draw=blue] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (3.5,0.4) {};
node [circle,draw=none,fill=green,inner sep=0pt,minimum size=0.3cm] at (1.03,1.3) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (3.3,2) {};
node [circle,draw=none,fill=red,inner sep=0pt,minimum size=0.3cm] at (0.7,1.8) {};
end{tikzpicture}
end{document}
The two green circles in the picture lie completely inside the polygon, while the red ones lie partially or fully outside. Is there a way to automate that "ownership" test in TikZ? I know algorithms exist for such kind of tests, but does TikZ already provide this or similar features (e.g. tests for single points)?
tikz-pgf
tikz-pgf
asked 11 hours ago
siracusa
4,95011228
4,95011228
2
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use theeven odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.
– Andrew
10 hours ago
add a comment |
2
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use theeven odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.
– Andrew
10 hours ago
2
2
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use the
even odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.– Andrew
10 hours ago
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use the
even odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.– Andrew
10 hours ago
add a comment |
1 Answer
1
active
oldest
votes
Here is a solution. The c
point is an arbitrary point outside of the polygon. The quality of the result depends on the accuracy of the intersection calculation.
Note: to remove help lines, you can comment the draw[help lines,...
line and uncomment the path[name path...
line.
documentclass[tikz]{standalone}
usetikzlibrary{intersections}
defmycircles{
{c1/red/3.5,0.4},{c2/blue/1.03,1.3},
{c3/violet/3.3,2},{c4/lime/0.7,1.8},
{c5/orange/2,0.55}%
}
begin{document}
begin{tikzpicture}
path[draw=blue,name path=polygon] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
foreach cname/ccolor/ccoord in mycircles {
node [circle,name path global=cname,draw=none,fill=ccolor,minimum size=3mm] (cname) at (ccoord) {};
}
begin{scope}[overlay]
coordinate (c) at (-100,300);
foreach cname/ccolor/ccoord in mycircles {
draw[help lines,dashed,name path global=line-cname] (cname.center) -- (c);
%path[name path global=line-mypath] (mypath.center) -- (c);
}
end{scope}
coordinate (text) at (0,0);
foreach cname/ccolor/ccoord in mycircles {
path[%
name intersections={of=polygon and cname,total=npc},
name intersections={of=polygon and line-cname,total=nplc},
]
pgfextra{
node[align=flush left,at=(text),anchor=north west,node font=scriptsize,inner sep=.1em] (desc) {
pgfmathsetmacromypartial{int((npc != 0)}
pgfmathsetmacromyin{int(mod(nplc,2)!=0)}
pgfmathsetmacromytexti{mypartial==1?"intersects":(myin==1?"is in":"is out")}
pgfmathsetmacromytextii{myin==1?"center is in":"center is out")}
ccolor{} circle mytexti{} (mytextii)
};
coordinate (text) at (desc.south west);
};
}
end{tikzpicture}
end{document}
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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%2f467358%2ftest-whether-a-circle-fully-lies-within-a-polygon-in-tikz%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Here is a solution. The c
point is an arbitrary point outside of the polygon. The quality of the result depends on the accuracy of the intersection calculation.
Note: to remove help lines, you can comment the draw[help lines,...
line and uncomment the path[name path...
line.
documentclass[tikz]{standalone}
usetikzlibrary{intersections}
defmycircles{
{c1/red/3.5,0.4},{c2/blue/1.03,1.3},
{c3/violet/3.3,2},{c4/lime/0.7,1.8},
{c5/orange/2,0.55}%
}
begin{document}
begin{tikzpicture}
path[draw=blue,name path=polygon] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
foreach cname/ccolor/ccoord in mycircles {
node [circle,name path global=cname,draw=none,fill=ccolor,minimum size=3mm] (cname) at (ccoord) {};
}
begin{scope}[overlay]
coordinate (c) at (-100,300);
foreach cname/ccolor/ccoord in mycircles {
draw[help lines,dashed,name path global=line-cname] (cname.center) -- (c);
%path[name path global=line-mypath] (mypath.center) -- (c);
}
end{scope}
coordinate (text) at (0,0);
foreach cname/ccolor/ccoord in mycircles {
path[%
name intersections={of=polygon and cname,total=npc},
name intersections={of=polygon and line-cname,total=nplc},
]
pgfextra{
node[align=flush left,at=(text),anchor=north west,node font=scriptsize,inner sep=.1em] (desc) {
pgfmathsetmacromypartial{int((npc != 0)}
pgfmathsetmacromyin{int(mod(nplc,2)!=0)}
pgfmathsetmacromytexti{mypartial==1?"intersects":(myin==1?"is in":"is out")}
pgfmathsetmacromytextii{myin==1?"center is in":"center is out")}
ccolor{} circle mytexti{} (mytextii)
};
coordinate (text) at (desc.south west);
};
}
end{tikzpicture}
end{document}
add a comment |
Here is a solution. The c
point is an arbitrary point outside of the polygon. The quality of the result depends on the accuracy of the intersection calculation.
Note: to remove help lines, you can comment the draw[help lines,...
line and uncomment the path[name path...
line.
documentclass[tikz]{standalone}
usetikzlibrary{intersections}
defmycircles{
{c1/red/3.5,0.4},{c2/blue/1.03,1.3},
{c3/violet/3.3,2},{c4/lime/0.7,1.8},
{c5/orange/2,0.55}%
}
begin{document}
begin{tikzpicture}
path[draw=blue,name path=polygon] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
foreach cname/ccolor/ccoord in mycircles {
node [circle,name path global=cname,draw=none,fill=ccolor,minimum size=3mm] (cname) at (ccoord) {};
}
begin{scope}[overlay]
coordinate (c) at (-100,300);
foreach cname/ccolor/ccoord in mycircles {
draw[help lines,dashed,name path global=line-cname] (cname.center) -- (c);
%path[name path global=line-mypath] (mypath.center) -- (c);
}
end{scope}
coordinate (text) at (0,0);
foreach cname/ccolor/ccoord in mycircles {
path[%
name intersections={of=polygon and cname,total=npc},
name intersections={of=polygon and line-cname,total=nplc},
]
pgfextra{
node[align=flush left,at=(text),anchor=north west,node font=scriptsize,inner sep=.1em] (desc) {
pgfmathsetmacromypartial{int((npc != 0)}
pgfmathsetmacromyin{int(mod(nplc,2)!=0)}
pgfmathsetmacromytexti{mypartial==1?"intersects":(myin==1?"is in":"is out")}
pgfmathsetmacromytextii{myin==1?"center is in":"center is out")}
ccolor{} circle mytexti{} (mytextii)
};
coordinate (text) at (desc.south west);
};
}
end{tikzpicture}
end{document}
add a comment |
Here is a solution. The c
point is an arbitrary point outside of the polygon. The quality of the result depends on the accuracy of the intersection calculation.
Note: to remove help lines, you can comment the draw[help lines,...
line and uncomment the path[name path...
line.
documentclass[tikz]{standalone}
usetikzlibrary{intersections}
defmycircles{
{c1/red/3.5,0.4},{c2/blue/1.03,1.3},
{c3/violet/3.3,2},{c4/lime/0.7,1.8},
{c5/orange/2,0.55}%
}
begin{document}
begin{tikzpicture}
path[draw=blue,name path=polygon] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
foreach cname/ccolor/ccoord in mycircles {
node [circle,name path global=cname,draw=none,fill=ccolor,minimum size=3mm] (cname) at (ccoord) {};
}
begin{scope}[overlay]
coordinate (c) at (-100,300);
foreach cname/ccolor/ccoord in mycircles {
draw[help lines,dashed,name path global=line-cname] (cname.center) -- (c);
%path[name path global=line-mypath] (mypath.center) -- (c);
}
end{scope}
coordinate (text) at (0,0);
foreach cname/ccolor/ccoord in mycircles {
path[%
name intersections={of=polygon and cname,total=npc},
name intersections={of=polygon and line-cname,total=nplc},
]
pgfextra{
node[align=flush left,at=(text),anchor=north west,node font=scriptsize,inner sep=.1em] (desc) {
pgfmathsetmacromypartial{int((npc != 0)}
pgfmathsetmacromyin{int(mod(nplc,2)!=0)}
pgfmathsetmacromytexti{mypartial==1?"intersects":(myin==1?"is in":"is out")}
pgfmathsetmacromytextii{myin==1?"center is in":"center is out")}
ccolor{} circle mytexti{} (mytextii)
};
coordinate (text) at (desc.south west);
};
}
end{tikzpicture}
end{document}
Here is a solution. The c
point is an arbitrary point outside of the polygon. The quality of the result depends on the accuracy of the intersection calculation.
Note: to remove help lines, you can comment the draw[help lines,...
line and uncomment the path[name path...
line.
documentclass[tikz]{standalone}
usetikzlibrary{intersections}
defmycircles{
{c1/red/3.5,0.4},{c2/blue/1.03,1.3},
{c3/violet/3.3,2},{c4/lime/0.7,1.8},
{c5/orange/2,0.55}%
}
begin{document}
begin{tikzpicture}
path[draw=blue,name path=polygon] (0,3) -- (5,4) -- (3,2) -- (4,0) -- (1,1) -- cycle;
foreach cname/ccolor/ccoord in mycircles {
node [circle,name path global=cname,draw=none,fill=ccolor,minimum size=3mm] (cname) at (ccoord) {};
}
begin{scope}[overlay]
coordinate (c) at (-100,300);
foreach cname/ccolor/ccoord in mycircles {
draw[help lines,dashed,name path global=line-cname] (cname.center) -- (c);
%path[name path global=line-mypath] (mypath.center) -- (c);
}
end{scope}
coordinate (text) at (0,0);
foreach cname/ccolor/ccoord in mycircles {
path[%
name intersections={of=polygon and cname,total=npc},
name intersections={of=polygon and line-cname,total=nplc},
]
pgfextra{
node[align=flush left,at=(text),anchor=north west,node font=scriptsize,inner sep=.1em] (desc) {
pgfmathsetmacromypartial{int((npc != 0)}
pgfmathsetmacromyin{int(mod(nplc,2)!=0)}
pgfmathsetmacromytexti{mypartial==1?"intersects":(myin==1?"is in":"is out")}
pgfmathsetmacromytextii{myin==1?"center is in":"center is out")}
ccolor{} circle mytexti{} (mytextii)
};
coordinate (text) at (desc.south west);
};
}
end{tikzpicture}
end{document}
edited 8 hours ago
answered 9 hours ago
Paul Gaborit
54.6k7139222
54.6k7139222
add a comment |
add a comment |
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%2f467358%2ftest-whether-a-circle-fully-lies-within-a-polygon-in-tikz%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
2
As far as I am aware, tikz does not provide any tools for this sort of thing but, visually, you could use the
even odd rule
(section 15.5.2 of the manual) to test this. Of this would almost certainly be subject to rounding errors.– Andrew
10 hours ago