Here is an interesting exercise:
Let P be a simple, but not necessarily convex, polygon and q an arbitrary point not necessarily in P.
Design an efficient algorithm to find a line segment originating from q that intersects the maximum number of edges of P.
In other words, if standing at point q, in what direction should you aim a gun so the bullet will go through the largest number of walls?
A bullet through a vertex of P gets credit for only one wall.
An O(n log n) algorithm is possible. n is the number of vertices or edges, as it is a polygon, number of edges roughly equals to number of vertices.
Here is my thought:
Connect q with all vertices (let's say there are N vertices) in P first. There will be N lines, or N-1 pairs of lines.
The final shooting line must be in between these pairs. So we must find the pair that contains the largest number of edges.
I don't think this solution is O(n log n).
Any ideas?
I used algorithm of Boris Stitnicky and wrote my solution in Java. But I chose counterclockwise direction, and to check what point of an interval is the start point and what point is the end of an interval I used the cross product. You can find it here: https://github.com/Katkov/algorithms/blob/master/BulletAgainstWalls.java
Well, first transform the points coordinates into a polar system centered at P.
O(nlog(n)). We are sorting them by their angle (φ) coordinate from the smallest φ up, making sure that in case of equal φ coordinate, heads are considered smaller than butts (this is important to comply with the last rule of the problem). O(nlog(n)). Now would you tell me why are you asking this kind of questions?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With