예제 #1
0
bool triangle3<T>::get_intersection_with_line(const vec3<T>& linePoint, const vec3<T>& lineVect, vec3<T>& outIntersection) const
{
	if (get_intersection_of__plane_with_line(linePoint, lineVect, outIntersection))
		return is_point_inside(outIntersection);

	return false;
}
bool
MapArea::isPointerClose(int x, int y, int * vic_code, int * vic_data)
   // (x, y) are screen coords
{
   if (!mapper) return 0;

   GRect brect=gmap_area->get_bound_rect();
   mapper->map(brect);
   
   int xmin=brect.xmin, ymin=brect.ymin;
   int xmax=brect.xmax, ymax=brect.ymax;
   int dx=xmax-xmin, dy=ymax-ymin;
   
   if (x<xmin-MOUSE_SENS || x>xmax+MOUSE_SENS ||
       y<ymin-MOUSE_SENS || y>ymax+MOUSE_SENS) return 0;
   
   if (ma_isPointerClose(x, y, vic_code, vic_data)) return 1;
   
   if ((xmin-x)*(xmin-x)+(ymin-y)*(ymin-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=TOP_LEFT;
      return 1;
   }
   if ((xmin+dx/2-x)*(xmin+dx/2-x)+(ymin-y)*(ymin-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=TOP;
      return 1;
   }
   if ((xmax-x)*(xmax-x)+(ymin-y)*(ymin-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=TOP_RIGHT;
      return 1;
   }
   if ((xmax-x)*(xmax-x)+(ymin+dy/2-y)*(ymin+dy/2-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=RIGHT;
      return 1;
   }
   if ((xmax-x)*(xmax-x)+(ymax-y)*(ymax-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=BOTTOM_RIGHT;
      return 1;
   }
   if ((xmin+dx/2-x)*(xmin+dx/2-x)+(ymax-y)*(ymax-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=BOTTOM;
      return 1;
   }
   if ((xmin-x)*(xmin-x)+(ymax-y)*(ymax-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=BOTTOM_LEFT;
      return 1;
   }
   if ((xmin-x)*(xmin-x)+(ymin+dy/2-y)*(ymin+dy/2-y)<MOUSE_SENS*MOUSE_SENS)
   {
      if (vic_code) *vic_code=LEFT;
      return 1;
   }
   mapper->unmap(x, y);
   if (is_point_inside(x, y))
   {
      if (vic_code) *vic_code=INSIDE;
      return 1;
   }
   return 0;
}