该向量将是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);
显然,这适用于轴对齐的矩形。您可以通过查找测试向量与多边形中每条边之间最近的交点来执行类似的操作。 (您可以进一步优化,但这留给读者作为练习。)