C 语言 检测点是否在凸边行内侧,学校算法作业一部分 检测是否是凸边行

P = (p0,.......pn-1)是一个有n个点的集合 属于 R^2。

下面给了一个算法过程,请问是否正确地确定P是否是逆时针顺序的凸多边形的边界?

Right应该是代入三点,检测三点位置是不是一个点在另外两点的右边
但我不太理解第三行p(i+1) mod n 和p(i+2)mod n是什么意思,请问是什么意思?

图片说明

p(i+1) mod n 和 p(i+2)mod n是因为除了前n-2组点:(p(0),p(1),p(2)), (p(1),p(2),p(3)),...(p(n-3),p(n-2),p(n-1))以外, 我们依然要检测两组点(p(n-2),p(n-1),p(0))(此时i=n-2, (i+1)mod n=n-1,(i+2)mod n=0)和(p(n-1),p(0),p(1))(此时i=n-1, (i+1)mod n=0, (i+2)mod n =1)的right函数返回值,从图形上看就是一个“环”首尾相衔接的部分也需要检测。如果不用mod, 那对这两组点的第一组当i=n-2时,则i+2=n,超过n-1, 第二组当i=n-1时,则i+1=n, i+2=n+1, 也都超过了n-1, 而下标超过n-1的点是不存在的。所以用mod就能把下标超过n-1的点转化成头端点,效果上就达到了检测首尾衔接部分的两组点。

但这个算法本身不正确,或者说不完整,在run isConvex()之前,先要对n-1个坐标点排序。一个排序规则可以是:先找出横坐标最小的点为p(0), 再计算其余各点与p(0)连线与x轴正向的夹角, 按夹角从小到大的顺序排序其余各点p(1)....p(n-1), 最后将排好序的n个点作为isConvex()的参数。

right函数是神马?

(i+1)mod n是为了保证i+1是<n的。如果点数超过n没有意义了

朋友,以下是我的分析,仅供参考,对错可以讨论(就是瞎jb乱说)
这题问你,如果点集P是凸包络边缘,那么这个算法是否定义正确。

你的问题是p(i+1) mod n 和p(i+2)mod n是什么意思
数学上的意思是取模,就是p(i+1)/n取整的操作。我不太明白 点/点集长度 这是什么操作。因为平面上的点包含两个坐标。我们做图像处理,一定使用convex来标识一个点,包含x和y轴的信息。
所以p(i+1) mod n 和p(i+2)mod n除了数学上的意义,物理意义没法帮你,我也不知道是个啥

再说我对这题的回答,我会回答:这个定义是错的
原因是,我们假设Right这个函数可以正确的判断算个点的位置关系,然后输出true或者false。
那么对于i=0到i=n-1,没问题,这些点都给判断了。
但是对于首尾三个点,这个for循环就没考虑到。什么叫首尾三个点,就是指:n-1,0,1这三个点。
因为凸包络多边形是一个闭合多边形。如果任取一个点作为i=0的点,那么这个函数定义只考虑了顺势正一圈的点的判断,没有考虑最后一点同第一点的判断。

此外,看到上面一楼的回答,要考虑排序问题,是的,作为有两个坐标的二维平面凸包络,任选一个点开始排序,你会发现很难保证两个坐标都单调递增或递减。当然我不认为这个因素是这道题想问的。哈哈哈哈

以上,希望有能帮到你的地方吧