给定一个二维多边形的顶点,我需要找到该多边形在X
轴上的最小投影。
我可以将多边形旋转到任意角度。
起初,我认为至少有一条多边形的边会与X
轴对齐,但这是不正确的。
该多边形可以是凸多边形或凹多边形。
给定一个二维多边形的顶点,我需要找到该多边形在X
轴上的最小投影。
我可以将多边形旋转到任意角度。
起初,我认为至少有一条多边形的边会与X
轴对齐,但这是不正确的。
该多边形可以是凸多边形或凹多边形。
设X(i, alpha)为顶点i绕alpha旋转后的X坐标。
我们始终假设-PI <= alpha <= PI。
如果对于所有j,X(i, alpha)>=X(j, alpha),则令i=rightmost(alpha)。 如果对于除一个之外的所有j,X(i, alpha)>=X(j,alpha),则令i=second_rightmost(alpha)。同样地,定义leftmost()和second_leftmost()。
让我们证明以下结论:如果X(i, alpha) >= X(j, alpha),且X(i, beta) >= X(j, beta),且beta-alpha < PI,则对于[alpha, beta]中的所有gamma,都有X(i, gamma) >= X(j, gamma)。实际上,X(i, alpha)=x[i]*cos(alpha)-y[i] * sin(alpha),其中(x[i], y[i])是顶点i的初始位置。因此,X(i, a) - X(j, a) = c1*cos(a)-c2*sin(a),其中c1=x[i]-x[j],c2=y[i]-y[j]。令f(a)=X(i,a)-Y(i,a)。函数f是连续的,并且当tan(a)=c1/c2时,它会改变符号,即a=atan2(c1,c2)+PI*n。如果beta-alpha
现在我们有:
这足以通过二分搜索获得哪个区间中哪个点是最右边的。通过角度的符号反转,我们可以得到最左边的点区间。由于我们知道每个点在哪个区间是最左边的,也是最右边的,因此我们可以计算出区间之间的边界值,并选择最小值。