Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何检查直线多边形是否相交_Arrays_C_Algorithm_Geometry_Polygon - Fatal编程技术网

Arrays 如何检查直线多边形是否相交

Arrays 如何检查直线多边形是否相交,arrays,c,algorithm,geometry,polygon,Arrays,C,Algorithm,Geometry,Polygon,我正在尝试用C语言创建一个程序,以检查直线多边形的直线是否在任何点相交。 我只需要在任何点都不相交的简单直线多边形。它可以是逆时针或顺时针 方向值将小于10。NS方向必须与WE方向交替,反之亦然 正在传递的输入是来自输入文件的方向形式,例如:;也如图所示: S2E4S2E4N2W4N2W4 我尝试将点存储在二维数组中,并检查每个点是否为真,但我无法确定在逆时针方向和顺时针方向的情况下如何移动,因为这些点可能是N4 E6或S4 W6。在这种情况下,如果我在值为N-4(x,y)=(0,4)时进行加

我正在尝试用C语言创建一个程序,以检查直线多边形的直线是否在任何点相交。
我只需要在任何点都不相交的简单直线多边形。它可以是逆时针或顺时针

方向值将小于10。NS方向必须与WE方向交替,反之亦然

正在传递的输入是来自输入文件的方向形式,例如:;也如图所示:

S2E4S2E4N2W4N2W4

我尝试将点存储在二维数组中,并检查每个点是否为真,但我无法确定在逆时针方向和顺时针方向的情况下如何移动,因为这些点可能是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;
}
int-arr[10][10];
int xPrime=0,yPrime=0;
布尔检查连续性(整数y,常量字符*dir){
如果(strcmp(dir,“S”)==0){
y=-y;
cols=y;
int j;
对于(j=cols;j>=0;j--){
if(arr[xPrime][j]==1&&j!=yPrime){
返回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;
对于(j=cols;j>=0;j--){
如果(arr[j][yPrime]==1&&j!=xPrime&&(j!=0&&yPrime!=0)){
返回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;

对于(j=0;j而言,存储实际多边形可能比存储所有可能的多边形更容易 平面的点。这样我们就不受 点阵列(代码中的arr)。请参见此工作示例:

  • 多边形存储在int数组p={0,0,x1,y1,x2,y2,…}

  • 线段是两点多边形。函数“交点”检查 两个这样的线段Q和P相交; 如果是,则返回交点坐标

  • 它使用助手函数“between”来检查一个数字是否介于其他两个数字之间

  • 函数“next”计算多边形的下一个点,假设 输入以字符字符串形式提供(例如:“S2E4S2E4N2W4N2W4”)

  • 在函数main中,我们现在循环所有段,并检查它们是否与 以前的任何一个

    当然,应该在某个时候检查输入是否正常等

#包括
#包括
#包括
无效的
下一步(常量字符*s,
int*v)
{
v[2]=v[0];
v[3]=v[1];
int step=s[1]-“0”;
开关(s[0]){
案例S:v[3]=步进;中断;
案例“N”:v[3]+=步进;中断;
案例“W”:v[2]=阶跃;中断;
案例“E”:v[2]+=步进;中断;
}
}
int
在(int x,
INTA,
int b)
{

返回a=a&&x=b&&x一种方法是选择数组的中心作为零点。您可以使用负索引,只要它们在分配的内存范围内。请提供您已经编写的代码。这不仅表明您已对此进行了处理,而且有助于我们在您的sty中提供答案您可以迭代输入字符串并累积给定的坐标增量,以确定每个顶点的坐标。然后在给定链中建立一个线段列表。最后应用所述的线段交点检测算法,例如在@Ahsan Ali中-首先,您必须进行clear任何方向上的输入运动是否有任何限制,如果有,限制是什么。限制是,在某些情况下,我们应该与SNIt交替的方向检测交叉点,但当多边形完全从南部以外的地方开始时失败。例如“N4E6S4W6”程序不会失败,但会将多边形的最终闭合步骤报告为交点。如果要避免此情况,则不要将第一个和最后一个线段相互检查。这可以通过将内部循环中的条件更改为
If(!(k==n-1&&j==0)&&intersection…
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void
next(           const char *s,
                int *v          )
{
        v[2] = v[0]; 
        v[3] = v[1];
        int step = s[1] - '0';
        switch(s[0]) {
        case 'S': v[3] -= step; break;
        case 'N': v[3] += step; break;
        case 'W': v[2] -= step; break;
        case 'E': v[2] += step; break;
        }
}


int
between(        int x,
                int a,
                int b           )
{
        return a < b ? x >= a && x <= b : x >= b && x <= a;
}

int
intersection(   int *P,
                int *Q,
                int *R          )
{
        if(P[0] == P[2] && Q[1] == Q[3]){  // P vertical, Q horizontal (w.l.o.g.)
                if(between(P[0], Q[0], Q[2]) && between(Q[1], P[1], P[3])){
                        R[0] = P[0]; 
                        R[1] = Q[1]; 
                        return 1;
                } else
                        return 0;
        }else if(Q[0] == Q[2] && P[1] == P[3])
                return intersection(Q, P, R);
        else return 0;
}

int
main() {
        char *s = "S2E4S2E4N2W4N2W4";
        
        int n = strlen(s) / 2,                                  // number of steps
                *P = calloc((n + 1) * 2, sizeof(int)),          // polygon
                R[2];                                           // intersection
        if(!P) exit(137);
        
        for(int k = 0; k < n; k++){
                next(s + 2 * k, P + 2 * k);
                for(int j = 0; j < k - 1; j++) {
                        if(intersection(P + k * 2, P + j * 2, R)) {
                                printf("Intersection at: %d, %d\n", R[0], R[1]);
                                exit(0);
                        }
                }
        }
        printf("No intersection\n");
}