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; }