Bucket computation, cutting array with lines












3












$begingroup$


Given an NxN array, drawing a line from the edge's midpoint to the opposite field how can the N buckets be found covering the majority of the line's path?



A visual aid:
enter image description here



Is there a better way to this than computing the linear equation and iteratively advancing in tiny steps to check which bucket we fall on? If not what is the lower limit step size to choose?










share|cite|improve this question









$endgroup$

















    3












    $begingroup$


    Given an NxN array, drawing a line from the edge's midpoint to the opposite field how can the N buckets be found covering the majority of the line's path?



    A visual aid:
    enter image description here



    Is there a better way to this than computing the linear equation and iteratively advancing in tiny steps to check which bucket we fall on? If not what is the lower limit step size to choose?










    share|cite|improve this question









    $endgroup$















      3












      3








      3





      $begingroup$


      Given an NxN array, drawing a line from the edge's midpoint to the opposite field how can the N buckets be found covering the majority of the line's path?



      A visual aid:
      enter image description here



      Is there a better way to this than computing the linear equation and iteratively advancing in tiny steps to check which bucket we fall on? If not what is the lower limit step size to choose?










      share|cite|improve this question









      $endgroup$




      Given an NxN array, drawing a line from the edge's midpoint to the opposite field how can the N buckets be found covering the majority of the line's path?



      A visual aid:
      enter image description here



      Is there a better way to this than computing the linear equation and iteratively advancing in tiny steps to check which bucket we fall on? If not what is the lower limit step size to choose?







      algorithms computational-geometry






      share|cite|improve this question













      share|cite|improve this question











      share|cite|improve this question




      share|cite|improve this question










      asked Jan 16 at 9:03









      KilianKilian

      1183




      1183






















          2 Answers
          2






          active

          oldest

          votes


















          1












          $begingroup$

          For the considered line you know the start position (xs, ys) and the end (xe, ye). For instance on the N=7 visual you provide, let's take the first upper left line:



          xs = 0
          ys = 4.5
          xe = 7
          ye = 2.5
          (I use coordinates right, down starting from upper left corner).


          Let's take a parameter t of the linear position on the line with t=0 on start and t=1 on end. You know how many verticals or horizontals your line crosses and at which t value. In our exemple:




          • 6 verticals crossed at t = v/7 with v=1 to 6 (not counting outlines).

          • 2 horizontal crossed at t = 0.25 and t = 0.75.


          Now just sort t increasing all these crossings:



          (1/7, V), (0.25, H) (2/7, V), (3/7, V), (4/7, V), (5/7, V), (0.75, H), (6/7, V).


          They correspond to cell change starting in cell (1, 5) to cell (7, 3). So you can compute the relative length of the line in each cell. For instance:



          cell (1, 5) L = 1/7-0 = 1/7
          cell (2, 5) L = 0.25-1/7
          ...


          And you know how to select the X pixels now.






          share|cite|improve this answer









          $endgroup$













          • $begingroup$
            Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
            $endgroup$
            – Kilian
            Jan 16 at 11:03






          • 1




            $begingroup$
            Ingenious but this seems much less efficient than Bresenham.
            $endgroup$
            – David Richerby
            Jan 16 at 11:26










          • $begingroup$
            It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
            $endgroup$
            – Vince
            Jan 16 at 13:26



















          1












          $begingroup$

          You probably want to look at Bresenham's line drawing algorithm. Rather than moving along the line itself, you move along the $x$-coordinates a "pixel" (i.e., array entry) at a time and compute which $y$-value puts the greatest part of the line in the pixel $(x,y)$.






          share|cite|improve this answer









          $endgroup$













            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "419"
            };
            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%2fcs.stackexchange.com%2fquestions%2f102929%2fbucket-computation-cutting-array-with-lines%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1












            $begingroup$

            For the considered line you know the start position (xs, ys) and the end (xe, ye). For instance on the N=7 visual you provide, let's take the first upper left line:



            xs = 0
            ys = 4.5
            xe = 7
            ye = 2.5
            (I use coordinates right, down starting from upper left corner).


            Let's take a parameter t of the linear position on the line with t=0 on start and t=1 on end. You know how many verticals or horizontals your line crosses and at which t value. In our exemple:




            • 6 verticals crossed at t = v/7 with v=1 to 6 (not counting outlines).

            • 2 horizontal crossed at t = 0.25 and t = 0.75.


            Now just sort t increasing all these crossings:



            (1/7, V), (0.25, H) (2/7, V), (3/7, V), (4/7, V), (5/7, V), (0.75, H), (6/7, V).


            They correspond to cell change starting in cell (1, 5) to cell (7, 3). So you can compute the relative length of the line in each cell. For instance:



            cell (1, 5) L = 1/7-0 = 1/7
            cell (2, 5) L = 0.25-1/7
            ...


            And you know how to select the X pixels now.






            share|cite|improve this answer









            $endgroup$













            • $begingroup$
              Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
              $endgroup$
              – Kilian
              Jan 16 at 11:03






            • 1




              $begingroup$
              Ingenious but this seems much less efficient than Bresenham.
              $endgroup$
              – David Richerby
              Jan 16 at 11:26










            • $begingroup$
              It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
              $endgroup$
              – Vince
              Jan 16 at 13:26
















            1












            $begingroup$

            For the considered line you know the start position (xs, ys) and the end (xe, ye). For instance on the N=7 visual you provide, let's take the first upper left line:



            xs = 0
            ys = 4.5
            xe = 7
            ye = 2.5
            (I use coordinates right, down starting from upper left corner).


            Let's take a parameter t of the linear position on the line with t=0 on start and t=1 on end. You know how many verticals or horizontals your line crosses and at which t value. In our exemple:




            • 6 verticals crossed at t = v/7 with v=1 to 6 (not counting outlines).

            • 2 horizontal crossed at t = 0.25 and t = 0.75.


            Now just sort t increasing all these crossings:



            (1/7, V), (0.25, H) (2/7, V), (3/7, V), (4/7, V), (5/7, V), (0.75, H), (6/7, V).


            They correspond to cell change starting in cell (1, 5) to cell (7, 3). So you can compute the relative length of the line in each cell. For instance:



            cell (1, 5) L = 1/7-0 = 1/7
            cell (2, 5) L = 0.25-1/7
            ...


            And you know how to select the X pixels now.






            share|cite|improve this answer









            $endgroup$













            • $begingroup$
              Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
              $endgroup$
              – Kilian
              Jan 16 at 11:03






            • 1




              $begingroup$
              Ingenious but this seems much less efficient than Bresenham.
              $endgroup$
              – David Richerby
              Jan 16 at 11:26










            • $begingroup$
              It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
              $endgroup$
              – Vince
              Jan 16 at 13:26














            1












            1








            1





            $begingroup$

            For the considered line you know the start position (xs, ys) and the end (xe, ye). For instance on the N=7 visual you provide, let's take the first upper left line:



            xs = 0
            ys = 4.5
            xe = 7
            ye = 2.5
            (I use coordinates right, down starting from upper left corner).


            Let's take a parameter t of the linear position on the line with t=0 on start and t=1 on end. You know how many verticals or horizontals your line crosses and at which t value. In our exemple:




            • 6 verticals crossed at t = v/7 with v=1 to 6 (not counting outlines).

            • 2 horizontal crossed at t = 0.25 and t = 0.75.


            Now just sort t increasing all these crossings:



            (1/7, V), (0.25, H) (2/7, V), (3/7, V), (4/7, V), (5/7, V), (0.75, H), (6/7, V).


            They correspond to cell change starting in cell (1, 5) to cell (7, 3). So you can compute the relative length of the line in each cell. For instance:



            cell (1, 5) L = 1/7-0 = 1/7
            cell (2, 5) L = 0.25-1/7
            ...


            And you know how to select the X pixels now.






            share|cite|improve this answer









            $endgroup$



            For the considered line you know the start position (xs, ys) and the end (xe, ye). For instance on the N=7 visual you provide, let's take the first upper left line:



            xs = 0
            ys = 4.5
            xe = 7
            ye = 2.5
            (I use coordinates right, down starting from upper left corner).


            Let's take a parameter t of the linear position on the line with t=0 on start and t=1 on end. You know how many verticals or horizontals your line crosses and at which t value. In our exemple:




            • 6 verticals crossed at t = v/7 with v=1 to 6 (not counting outlines).

            • 2 horizontal crossed at t = 0.25 and t = 0.75.


            Now just sort t increasing all these crossings:



            (1/7, V), (0.25, H) (2/7, V), (3/7, V), (4/7, V), (5/7, V), (0.75, H), (6/7, V).


            They correspond to cell change starting in cell (1, 5) to cell (7, 3). So you can compute the relative length of the line in each cell. For instance:



            cell (1, 5) L = 1/7-0 = 1/7
            cell (2, 5) L = 0.25-1/7
            ...


            And you know how to select the X pixels now.







            share|cite|improve this answer












            share|cite|improve this answer



            share|cite|improve this answer










            answered Jan 16 at 10:35









            VinceVince

            47926




            47926












            • $begingroup$
              Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
              $endgroup$
              – Kilian
              Jan 16 at 11:03






            • 1




              $begingroup$
              Ingenious but this seems much less efficient than Bresenham.
              $endgroup$
              – David Richerby
              Jan 16 at 11:26










            • $begingroup$
              It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
              $endgroup$
              – Vince
              Jan 16 at 13:26


















            • $begingroup$
              Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
              $endgroup$
              – Kilian
              Jan 16 at 11:03






            • 1




              $begingroup$
              Ingenious but this seems much less efficient than Bresenham.
              $endgroup$
              – David Richerby
              Jan 16 at 11:26










            • $begingroup$
              It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
              $endgroup$
              – Vince
              Jan 16 at 13:26
















            $begingroup$
            Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
            $endgroup$
            – Kilian
            Jan 16 at 11:03




            $begingroup$
            Thanks. Let me take a closer look at it and I'll accept your answer once I got it translated into code
            $endgroup$
            – Kilian
            Jan 16 at 11:03




            1




            1




            $begingroup$
            Ingenious but this seems much less efficient than Bresenham.
            $endgroup$
            – David Richerby
            Jan 16 at 11:26




            $begingroup$
            Ingenious but this seems much less efficient than Bresenham.
            $endgroup$
            – David Richerby
            Jan 16 at 11:26












            $begingroup$
            It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
            $endgroup$
            – Vince
            Jan 16 at 13:26




            $begingroup$
            It is more or less the same but it allows vectorial computation. Do not forget that when I say "sort", this can be done implicetly as both horizontal list and vertical list are already sorted. Bresenham is more interesting if you care on where exactly is the crossing point.
            $endgroup$
            – Vince
            Jan 16 at 13:26











            1












            $begingroup$

            You probably want to look at Bresenham's line drawing algorithm. Rather than moving along the line itself, you move along the $x$-coordinates a "pixel" (i.e., array entry) at a time and compute which $y$-value puts the greatest part of the line in the pixel $(x,y)$.






            share|cite|improve this answer









            $endgroup$


















              1












              $begingroup$

              You probably want to look at Bresenham's line drawing algorithm. Rather than moving along the line itself, you move along the $x$-coordinates a "pixel" (i.e., array entry) at a time and compute which $y$-value puts the greatest part of the line in the pixel $(x,y)$.






              share|cite|improve this answer









              $endgroup$
















                1












                1








                1





                $begingroup$

                You probably want to look at Bresenham's line drawing algorithm. Rather than moving along the line itself, you move along the $x$-coordinates a "pixel" (i.e., array entry) at a time and compute which $y$-value puts the greatest part of the line in the pixel $(x,y)$.






                share|cite|improve this answer









                $endgroup$



                You probably want to look at Bresenham's line drawing algorithm. Rather than moving along the line itself, you move along the $x$-coordinates a "pixel" (i.e., array entry) at a time and compute which $y$-value puts the greatest part of the line in the pixel $(x,y)$.







                share|cite|improve this answer












                share|cite|improve this answer



                share|cite|improve this answer










                answered Jan 16 at 11:25









                David RicherbyDavid Richerby

                67.5k15102193




                67.5k15102193






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Computer Science 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.


                    Use MathJax to format equations. MathJax reference.


                    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%2fcs.stackexchange.com%2fquestions%2f102929%2fbucket-computation-cutting-array-with-lines%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

                    MongoDB - Not Authorized To Execute Command

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

                    Npm cannot find a required file even through it is in the searched directory