根据半径计算从正方形中心到边缘的矢量

Jam*_*ett 3 math 2d vector

给定一个正方形(由x,y,宽度,高度描述)和一个角度(以弧度表示),我需要计算一个起始于正方形中心的矢量,并终止于与给定角度的正方形边缘碰撞的点.

我真的最感兴趣的是它碰撞的那一点,如果这样可以让计算更有效率让我知道.

这可以推广到矩形吗?一般多边形怎么样?

MSN*_*MSN 7

矢量将是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;
}
Run Code Online (Sandbox Code Playgroud)

但是,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;
}
Run Code Online (Sandbox Code Playgroud)

你可以从中轻而易举地得到终点.

编辑:这是一个片段,您可以使用当前接受的答案验证这是否有效:

    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);
Run Code Online (Sandbox Code Playgroud)

显然,这适用于轴对齐的矩形.您可以通过查找测试向量与多边形中每条边之间最近的交点来执行类似的操作.(您可以进一步优化,但这仍然是读者的练习.)