2017-01-16 54 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

謝謝你的幫助,多虧了你,我設法讓我的項目得到了一個地方(不幸的是不是一個完整的解決方案),但足夠通過。 –