Want more features on Pastebin? Sign Up, it's FREE!
Guest

Circle In View

By: ClickerMonkey on Jun 28th, 2013  |  syntax: Java  |  size: 1.89 KB  |  views: 82  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
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.
  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. }
clone this paste RAW Paste Data