Test whether a circle fully lies within a polygon in TikZ












2














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}


enter image description here



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)?










share|improve this question


















  • 1




    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
    1 hour ago
















2














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}


enter image description here



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)?










share|improve this question


















  • 1




    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
    1 hour ago














2












2








2


0





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}


enter image description here



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)?










share|improve this question













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}


enter image description here



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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 2 hours ago









siracusa

4,94511228




4,94511228








  • 1




    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
    1 hour ago














  • 1




    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
    1 hour ago








1




1




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
1 hour 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
1 hour ago










1 Answer
1






active

oldest

votes


















2














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[nale path... line.



enter image description here



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}





share|improve this answer























    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
    });


    }
    });














    draft saved

    draft discarded


















    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









    2














    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[nale path... line.



    enter image description here



    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}





    share|improve this answer




























      2














      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[nale path... line.



      enter image description here



      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}





      share|improve this answer


























        2












        2








        2






        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[nale path... line.



        enter image description here



        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}





        share|improve this answer














        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[nale path... line.



        enter image description here



        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}






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 28 mins ago

























        answered 40 mins ago









        Paul Gaborit

        54.6k7139222




        54.6k7139222






























            draft saved

            draft discarded




















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            404 Error Contact Form 7 ajax form submitting

            How to know if a Active Directory user can login interactively

            TypeError: fit_transform() missing 1 required positional argument: 'X'