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?
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?