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
    arrow-up
    11
    ·
    2 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@fedia.io
      link
      fedilink
      arrow-up
      7
      ·
      2 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.

    • Lazycog@sopuli.xyz
      link
      fedilink
      arrow-up
      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.

    • sip@programming.dev
      link
      fedilink
      arrow-up
      5
      ·
      2 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.