2017-01-16 91 views
1

我有这个家庭作业,我有点卡住它。创建n个随机点并创建四边形(卡住)C

创建n个随机点,用这些点创建2个四边形,其包围点的其余部分,和比较2种形状的区域中。(未图形化的解决方案,纯数学)

我无法弄清楚如何连接我的观点或如何告诉计算机哪些点要连接。我想也许找到最大和最小X和Y可以工作,但我没有得到比这更进一步。

谢谢!

void genp(int n,int** x,int** y); 
void rectangle(int n,int** x,int** y); 
void file(int n, int** x, int** y); 

int main() 
{ 
    int n; 
    printf("Please specify number of points!\n"); 
    scanf("%d", &n); 
    int *x; 
    int *y; 
    genp(n,&x,&y); 
    for (int i = 0; i < n; i++) 
    { 
     printf("x[%d]=%d\ty[%d]=%d\n", i, x[i], i, y[i]); 
    } 
    rectangle(n,&x,&y); 
    file(n,&x,&y); 
    free(x); 
    free(y); 
    return 0; 
} 

void genp(int n,int** x, int** y) 
{ 
    int r; 
    srand(time(NULL)); 
    *x = (int*)malloc(n * sizeof(int)); 
    *y = (int*)malloc(n * sizeof(int)); 
    for (int i = 0; i < n; i++) 
    { 
     r = rand(); 
     (*x)[i] = r; 
     r = rand(); 
     (*y)[i] = r; 
    } 
} 

void rectangle(int n,int** x,int **y) 
{ 
    int maxlocx,maxlocy,maxx,maxy,minx,miny,minlocx,minlocy; 
    int zerox=*x[0]; 
    int zeroy=*y[0]; 
    for(int i=0;i<n;i++) 
    { 
     if ((*x)[i]>zerox) 
     { 
      maxx=(*x)[i]; 
      maxlocx=i; 
     } 
     if ((*y)[i]>zeroy) 
     { 
      maxy=(*y)[i]; 
      maxlocy=i; 
     } 
    } 
    for (int i=0;i<n;i++) 
    { 
     if ((*x)[i]<zerox) 
     { 
      minx=(*x)[i]; 
      minlocx=i; 
     } 
     if ((*y)[i]<zeroy) 
     { 
      miny=(*y)[i]; 
      minlocy=i; 
     } 
    } 
    printf("\nThe max x:%d, corresponding y:%d\n",maxx,(*y)[maxlocx]); 
    printf("\nThe max y:%d, corresponding x:%d\n",maxy,(*x)[maxlocy]); 
    printf("\nThe min x:%d, corresponding y:%d\n",minx,(*y)[minlocx]); 
    printf("\nThe min y:%d, corresponding x:%d\n",miny,(*x)[minlocy]); 

    int area= 
} 

void file(int n,int** x,int** y) 
{ 
    FILE *f; 
    f=fopen("data.txt","w"); 
    fprintf(f,"n=%d\n",n); 
    for (int i=0;i<n;i++) 
    { 
     fprintf(f,"%d,%d\n",(*x)[i],(*y)[i]); 
    } 
    fclose(f); 
} 
+0

“如何连接我的观点”既模糊和宽泛。 “电脑”不需要连接点。你只需要某种数据结构来存储正确的数据来表示形状。例如,你可以有一个有序的x,y坐标的列表。还有很多其他的方法。或者,您可能会问,如何首先找到两个四边形的点。请澄清你的问题 - 这太不清楚了。 – kaylum

+0

虽然您的程序不需要生成图形输出,但手动操作几个图形示例可能会让您对程序如何选择点有所了解。 –

+0

然而,我自己想到了一些关于这个问题的信息,我没有理由相信有任何方法可以从你的随机集合中选择一些点作为两个四边形的顶点,这些四边形单独或共同覆盖所有剩余的点。如果你有理由有不同的想法,那么你可能已经提出了一个选择算法,或者至少有一个定理证明了如何去做。 –

回答

0

我想也许找到最大和最小的X和Y可以工作,但我并没有得到进一步的比。

这听起来对我来说是正确的,并且是我在阅读该问题陈述时首先想到的。

enter image description here

至于第二个四边形,也许你可以做一些事情就像是试图寻找与倾斜轴而非轴的边框是中并行的X和Y轴。例如,45度倾斜的边框应该是这样的:

enter image description here

我无法弄清楚如何连接我的观点或如何告诉指向连接电脑。

我有种感觉,你正试图找到你的一组点的Convex Hull。这将是一个比找到边界框更难的问题。 (它可能不是一个四边形反正)

enter image description here

+0

谢谢你的帮助,多亏了你,我设法让我的项目得到了一个地方(不幸的是不是一个完整的解决方案),但足够通过。 –