this post was submitted on 13 Jan 2025
26 points (96.4% liked)
Learn Programming
1684 readers
22 users here now
Posting Etiquette
-
Ask the main part of your question in the title. This should be concise but informative.
-
Provide everything up front. Don't make people fish for more details in the comments. Provide background information and examples.
-
Be present for follow up questions. Don't ask for help and run away. Stick around to answer questions and provide more details.
-
Ask about the problem you're trying to solve. Don't focus too much on debugging your exact solution, as you may be going down the wrong path. Include as much information as you can about what you ultimately are trying to achieve. See more on this here: https://xyproblem.info/
Icon base by Delapouite under CC BY 3.0 with modifications to add a gradient
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
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
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.
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.
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.