Protože se místo obdélníku kontroluje jenom levý horní roh.
Zkusil bych to spíše takto, obdélník musí mít hrany rovnoběžné s osami x a y a kruh se nesmí dostat dovnitř celý:
bool TestLineHorizontal(int x1, int x2, int y, int circle_x, int circle_y, int circle_d)
{
if (abs(circle_y - y) > circle_d) return false;
double temp = sqrt((double) (circle_d*circle_d - (y - circle_y)*(y - circle_y))) + circle_x;
return ((temp >= x1) && (temp <= x2));
}
bool TestLineVertical(int x, int y1, int y2, int circle_x, int circle_y, int circle_d)
{
if (abs(circle_x - x) > circle_d) return false;
double temp = sqrt((double) (circle_d*circle_d - (x - circle_x)*(x - circle_x))) + circle_y;
return ((temp >= y1) && (temp <= y2));
}
bool Test(int x1, int y1, int x2, int y2, int circle_x, int circle_y, int circle_d)
{
int z;
if (x2 < x1)
{
z = x1;
x1 = x2;
x2 = z;
}
if (y2 < y1)
{
z = y1;
y1 = y2;
y2 = z;
}
bool b1 = TestLineHorizontal(x1, x2, y1, circle_x, circle_y, circle_d);
bool b2 = TestLineHorizontal(x1, x2, y2, circle_x, circle_y, circle_d);
bool b3 = TestLineVertical(x1, y1, y2, circle_x, circle_y, circle_d);
bool b4 = TestLineVertical(x2, y1, y2, circle_x, circle_y, circle_d);
return (b1 || b2 || b3 || b4);
}
unsigned int main()
{
bool r = Test(4,4,8,8, 6,10,2);
printf("%d", (int) r);
}