#include<stdio.h>
double Xmin, Ymin, Xmax, Ymax, X1, Y1, X2, Y2, gradient;
int answer;
double Max(double num1, double num2)
{
if (num1 < num2)
return num2;
return num1;
}
double Min(double num1, double num2)
{
if (num1 < num2)
return num1;
return num2;
}
int main(void)
{
freopen("input.txt", "r", stdin);
int T;
double temp1, temp2, temp;
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++)
{
answer = 0;
scanf("%lf%lf%lf%lf", &Xmin, &Ymin, &Xmax, &Ymax);
scanf("%lf%lf%lf%lf", &X1, &Y1, &X2, &Y2);
if (X1 == X2)//수직선
{
temp1 = Max(Y1, Y2), temp2 = Min(Y1, Y2);
for (double i = temp2; i <= temp1; i++)
{
if (X1 == Xmax || X1 == Xmin)
{
if (i <= Ymax && i >= Ymin)
answer++;
}
else if (X1 > Xmin && X1 < Xmax)
{
if (i == Ymax || i == Ymin)
answer++;
}
else
break;
}
if (X1 == Xmax || X1 == Xmin)
if (answer > 1)
answer = 4;
}
else if (Y1 == Y2) // 수평선
{
temp1 = Max(X1, X2), temp2 = Min(X1, X2);
for (double i = temp2; i <= temp1; i++)
{
if (Y1 == Ymax || Y1 == Ymin)
{
if (i <= Xmax && i >= Xmin)
answer++;
}
else if (Y1 < Ymax && Y1>Ymin)
{
if (i == Xmax || i == Xmin)
answer++;
}
else
break;
}
if (Y1 == Ymax || Y1 == Ymin)
if (answer > 1)
answer = 4;
}
else // 기울기를 비교해서 풀이함
{
temp1 = Max(X1, X2), temp2 = Min(X1, X2);
gradient = (Y1 - Y2) / (X1 - X2);
if (temp1 >= Xmin && temp2 <= Xmin)
{
temp = gradient * Xmin - gradient * X1 + Y1;
if (temp <= Ymax && temp >= Ymin)
answer++;
}
if (temp1 >= Xmax && temp2 <= Xmax)
{
temp = gradient * Xmax - gradient * X1 + Y1;
if (temp <= Ymax && temp >= Ymin)
answer++;
}
temp1 = Max(Y1, Y2), temp2 = Min(Y1, Y2);
if (temp1 >= Ymax && temp2 <= Ymax)
{
temp = Ymax / gradient - Y1 / gradient + X1;
if (temp > Xmin && temp < Xmax)
answer++;
}
if (temp1 >= Ymin && temp2 <= Ymin)
{
temp = Ymin / gradient - Y1 / gradient + X1;
if (temp > Xmin && temp < Xmax)
answer++;
}
}
printf("#%d %d\n", tc, answer);
}
}
댓글