How can I define lines so when I click on the screen, my program knows whether I clicked on A B or C?

  • BougieBirdie
    link
    fedilink
    English
    112 days ago

    My approach would involve using some kind of polygon library. When you draw lines, you’re really defining polygons within your canvas. In the case of regions B and C, the edge of the screen make up the rest of the polygon.

    Once you have your polygons defined, you can compare the coordinates of the click event to the polygons. With a good library, it should be fairly trivial to check if a point is within a polygon.

    In the case of region A, you’d find that a click is inside both region A and region B, so I guess I’d also check to see if there are multiple polygons a click could be inside. If there are, then you need to also see if a polygon is inside another polygon to determine the specific polygon clicked. This is also made much simpler by using a good library

    • magic_lobster_party
      link
      fedilink
      72 days ago

      Adding to this: if you can’t use a polygon library, it’s quite easy to check if a point is inside a polygon. Just count the number of polygon edges is above the point (have a separate count for each polygon).

      If the number is odd, then the point is inside the polygon. If it’s even, then it’s outside.

      If there are multiple candidate polygons (which will happen with A in the example), pick the one with the closest edge to the point. Alternatively, pick the smallest polygon.

      See ray casting algorithm in this page: https://en.wikipedia.org/wiki/Point_in_polygon

      Just beware of floating point precision when implementing the algoritm.

      But use a polygon library first and foremost.

    • @[email protected]
      link
      fedilink
      6
      edit-2
      2 days ago

      Good answer! I can’t recommend a library right now, but I recommend looking into the geometric term “Point in Polygon” to further read about this task/problem.

      Edit: wanted to clarify that I just wanted to give a better keyword for OP to search for a solution.

    • @[email protected]
      link
      fedilink
      52 days ago

      I do want to mention this is a rabbit hole, as a U shaped polygon can be tricky to check. so I strongly suggest using a library for checking point in polygon.

  • lime!
    link
    fedilink
    English
    52 days ago

    what environment is this? where is this going to be used?

    • @Test_Tickles
      link
      42 days ago

      Seriously! How can we even make a suggestion without knowing some basic info like language or API. Even ancient Win32 (using C, C#, or VB6) has the ability to create regions and test to see if a given point is inside a specific region.

  • @[email protected]
    link
    fedilink
    English
    42 days ago

    One simple way should be to “colour” the areas as A,B,C [1]. Assuming you are working with a bitmap, just use a 1:1 2d char array to represent it, with the values in each cell corresponding to each pixel in the image. You can then check the value corresponding to the point that was clicked. This can be simplified by instead mapping it 1.5:1 or 2:1 or further, depending upon your requirement.

    Another way: If you are using an SVG, you are probably going for lower RAM usage and don’t want an array as big as the image dimensions, in which case, you will have to assign sides of every separate path (border). Then whenever there is a click, you can calculate where it lies WRT each path. This would be more useful if the number of paths is low, but you care more about user clicking very close to the borders and you are using higher precision when calculating the position. But having too many border paths will make the computation time longer, while at least keeping the total RAM usage low.


    Please note, I have never implemented a solution to this before and just gave the first solution I came up with, that I thought, could be done using C++. You might want to wait for ppl with higher XP to give their answers, or if this is a competition problem, their recommended answer.


    1. Using an algorithm similar to what the Fill Paint tools use ↩︎