我现在不会发布任何代码,因为我不想解决作业/任务。不过,我会发布一些提示。
看看下面的图片:
我们怎样才能知道C
是边缘OA
和OB
和D
是外部之间?它很简单:我们比较一些角度:如果OC
和OA
之间的角度小于OB
和OA
之间的角度,那么C明显更接近于OA
,而不是OB
。
现在,我们如何才能知道只有一些向量的角度?我们可以使用单调的余弦:它随着参数的增加而减小。因此,OC
和OA
之间的角度的余弦大于OB
和OA
之间的角度的余弦,这又大于OD
和OA
之间的角度的余弦。
下一步是弄清楚如何计算余弦。矢量点产品有助于:它的值是角度乘积的余弦值,大于操作数长度的乘积。那就是:
cos(OC; OA) = dotproduct(OC; OA)/(length(OA) * length(OC))
在2D的dotproduct很简单:
dotproduct(OC; OA) = (C.x - O.x) * (A.x - O.x) + (C.x - O.x) * (A.x - O.x)
结合上述所有你应该有一个简单的测试,以检查你的观点是否在同样的情况C
或D
:比上一个边更靠近一个边。
现在,您必须对多边形的每个边重复此操作,然后完成。如果测试是谓词,则可以使用fold
执行此操作。
注意:这只适用于多边形是凸的。对于凹多边形,您需要添加更多测试。
秒注意:在图中,会发生什么,如果D
或C
或者两者都是OA
线以下?想想这个,并检查它是否意味着对上述fold
方法进行了一些更改。
后记:在几周内,我会发布一个完整的代码,假设任务结束。另外,那时我会在上面的注释中回答这个问题。
它是凸的还是凹的多边形?或者它只是一个简单的矩形? –
他们都是凹多边形,对不起,我甚至没有想过提及这一点。 – AdamMc331