Advertisement
ClickerMonkey

Circle In View

Jun 28th, 2013
2,330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.89 KB | None | 0 0
  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.
  13.  * @param radius
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement