Check out the Pastebin Gadgets Shop. We have thousands of fun, geeky & affordable gadgets on sale :-)Want more features on Pastebin? Sign Up, it's FREE!
tweet

# Circle In View

By: ClickerMonkey on Jun 28th, 2013  |  syntax: Java  |  size: 1.89 KB  |  views: 88  |  expires: Never
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
1. /**
2.  * Returns whether a circle is within view of an object at the origin
3.  * facing some direction.
4.  *
5.  * @param origin
6.  *      The origin of the view.
7.  * @param direction
8.  *      The direction of the view, must be a normalized vector.
9.  * @param fov
10.  *      The vector where x=cos(FOV/2) and y=sin(FOV/2), must be normalized by definition.
11.  * @param circle
12.  *      The center of the circle.
14.  *      The radius of the circle.
15.  * @param entirely
16.  *      True if this method should return whether the circle is completely
17.  *      within view, or false if this method should return whether the circle
18.  *      is partially within view.
19.  * @return
20.  *      True if the target is in view, otherwise false.
21.  */
22. public static boolean isCircleInView( Vector origin, Vector direction, Vector fov, Vector circle, float radius, boolean entirely )
23. {
24.         // Calculate upper and lower vectors
25.         // Calculate forward vector between target and origin
26.         // Rotate forward by upper, resulting vector.y is the distance from upper to target
27.         // Rotate forward by lower, resulting vector.y is the distance from lower to target
28.         // If it doesn't matter if it's entirely in view, add radius*2 to the distances.
29.
30.         float fovy = Math.abs( fov.y );
31.         float dxfx = direction.x * fov.x;
32.         float dxfy = direction.x * fovy;
33.         float dyfx = direction.y * fov.x;
34.         float dyfy = direction.y * fovy;
35.         float upperX = (dxfx - dyfy);
36.         float upperY = (dxfy + dyfx);
37.         float lowerX = (dxfx + dyfy);
38.         float lowerY = (dyfx - dxfy);
39.         float forwardX = circle.x - origin.x;
40.         float forwardY = circle.y - origin.y;
41.         float upperDist = (upperX * forwardY + upperY * forwardX);
42.         float lowerDist =-(lowerX * forwardY + lowerY * forwardX);
43.
44.         if (!entirely)
45.         {
46.                 upperDist += radius * 2;
47.                 lowerDist += radius * 2;
48.         }
49.
50.         return (lowerDist >= radius && upperDist >= radius) || // FOV <= 90
51.                          (fov.x < 0 && (upperDist >= radius || lowerDist >= radius)); // FOV >= 90
52. }
clone this paste RAW Paste Data
Top