【发布时间】:2021-07-13 03:02:30
【问题描述】:
我正在尝试用 C 创建一个程序来检查直线多边形的线是否在任何点相互交叉。
我只需要在任何点都不相交的简单直线多边形。它可以是逆时针或顺时针。
方向值将小于 10。NS 方向必须与 WE 方向交替,反之亦然。
正在传递的输入是来自输入文件的方向形式,例如;并在图片中显示:
S 2 E 4 S 2 E 4 N 2 W 4 N 2 W 4
我试图将点存储在一个二维数组中,每个点都被检查为真,但我无法弄清楚在逆时针和顺时针方向的情况下如何移动,因为这些点可能是 N4 E6 或 S4 W6。在这种情况下,如果我在值为 N-4 (x,y) = (0,4) 时添加并在 S-4 (x,y) = (0,-4) 时减去,则在使用它时会失败数组中的索引。
int arr[10][10];
int xPrime = 0, yPrime = 0;
bool checkContinuity(int y, const char * dir ){
if(strcmp(dir, "S")==0){
y = -y;
cols = y;
int j;
for(j = cols; j >= 0; j--){
if(arr[xPrime][j] == 1 && j != yPrime){
return false;
}
arr[xPrime][j] = 1;
printf(" %d ", j);
}
yPrime -= y;
if(yPrime < 0)
yPrime = -yPrime;
}
else if(strcmp(dir, "W")==0){
y = -y;
cols = y;
int j;
for(j = cols; j >= 0; j--){
if(arr[j][yPrime] == 1 && j != xPrime && (j != 0 && yPrime != 0)){
return false;
}
arr[j][yPrime] = 1;
printf(" %d ", j);
}
xPrime -= y;
if(xPrime < 0)
xPrime = -xPrime;
}
else if(strcmp(dir, "N")==0){
cols = y;
int j;
for(j = 0; j <= cols; j++){
if(arr[xPrime][j] == 1)
return false;
arr[xPrime][j] = 1;
printf(" %d ", j);
}
yPrime += y;
}
else if(strcmp(dir, "E")==0){
cols = y;
int j;
for(j = 0; j <= cols; j++){
if(arr[j][yPrime] == 1 && j != xPrime)
return false;
arr[j][yPrime] = 1;
printf(" %d ", j);
}
xPrime += y;
}
else
return false;
return true;
}
【问题讨论】:
-
一种方法是选择数组的中心作为零点。您可以使用负索引,只要它们在分配的内存范围内。
-
请提供您已经编写的代码。这不仅表明您已经为此工作,而且这将帮助我们以您的编码风格提供答案,使其更具可读性
-
您可以遍历输入字符串并累积给定的坐标增量以确定每个顶点的坐标。然后在给定链中构建线段列表。最后应用线段的交叉点检测算法,如所述,例如在ics.uci.edu/~goodrich/teach/geom/notes/LineSweep.pdf
-
@Ahsan Ali - 首先你必须明确输入运动在任何方向上是否有任何限制,如果有,限制是什么。
-
限制是方向WE应该和SN交替
标签: arrays c algorithm geometry polygon