Вектор будет center + (cos(angle), sin(angle))*magnitude
. Учитывая, что вы хотите пересечь это с квадратом, вам нужно определить величину. Вы можете получить это с помощью квадрата с:
float abs_cos_angle= fabs(cos(angle));
float abs_sin_angle= fabs(sin(angle));
if (width/2/abs_cos_angle <= height/2/abs_sin_angle)
{
magnitude= fabs(width/2/abs_cos_angle);
}
else
{
magnitude= height/2/abs_sin_angle;
}
Однако, cos (угол) или sin (угол) могут быть равны нулю, поэтому вы должны вычесть это умножение, чтобы получить:
float abs_cos_angle= fabs(cos(angle));
float abs_sin_angle= fabs(sin(angle));
if (width/2*abs_sin_angle <= height/2*abs_cos_angle)
{
magnitude= width/2/abs_cos_angle;
}
else
{
magnitude= height/2/abs_sin_angle;
}
И вы можете получить тривиальную точку отсюда.
РЕДАКТИРОВАТЬ: Вот фрагмент, который вы можете оставить на месте, чтобы убедиться, что это работает с текущим принятым ответом:
double magnitude;
double abs_cos_angle= fabs(cos(angle));
double abs_sin_angle= fabs(sin(angle));
if (width/2*abs_sin_angle <= height/2*abs_cos_angle)
{
magnitude= width/2/abs_cos_angle;
}
else
{
magnitude= height/2/abs_sin_angle;
}
double check_x= x + cos(angle)*magnitude;
double check_y= y + sin(angle)*magnitude;
printf(" a = %d deg: x = %lf; y = %lf\n",(int)(angle/pi*180),check_x,check_y);
Очевидно, что это относится к выровненному по оси прямоугольнику. Вы можете сделать нечто подобное, найдя самое близкое пересечение между вектором тестирования и каждым ребром в многоугольнике. (Вы можете оптимизировать это дальше, но это оставлено читателю в качестве упражнения.)