2017-02-23 185 views
1

問題是:給定第一行上畫布(換句話說,二維數組)的高度(h)和寬度(w);並且中心(x,y)和圓的半徑(r)的座標將打印畫布。如果二維數組的元素在圓圈內,則打印#,否則打印.。下面是我嘗試過的,但對於我的生活,我無法弄清楚爲什麼2D矩陣只包含. s。請拋出一些光:打印矩陣

#include <math.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <limits.h> 
#include <stdbool.h> 

typedef struct point { 
    int x; 
    int y; 
} point; 

float distance(point p, point q) { 
    return sqrt((p.x - q.x)*(p.x - q.x) + (p.y - q.y)*(p.y - q.y)); 
} 

int withinCircle(point circleCentre, point p, int radius) { 
    float dist = distance(circleCentre, p); 
    if (!(dist > (float) radius)) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

int main(void){ 
    point pixel; 
    int w, h; 
    scanf("%d %d",&w,&h); 
    char *canvas = malloc(w * h); 

    int circleX, circleY; 
    int r; 
    scanf("%d %d %d",&circleX,&circleY,&r); 
    point circleCentre; 
    circleCentre.x = circleX; circleCentre.y = circleY; 

    for (int i = 0; i < h; i++) { 
     for (int j = 0; j < w; j++) { 
      pixel.x = j; pixel.y = i; 
      if (withinCircle(circleCentre, pixel, r)) { 
       *(canvas + i + j) = '#'; 
      } else { 
       *(canvas + i + j) = '.'; 
      } 
     } 
    } 

    for (int i = 0; i < h; i++) { 
     for (int j = 0; j < w; j++) { 
       printf("%c", *(canvas + i + j)); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 

輸出(20和16是所述寬度(w)和分別高度(h)9,6和5是圓的X座標(X)中,Y座標。 (y)和半徑(r)):

20 16 
9 6 5 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
.................... 
+0

一個固定的現場演示,你在哪裏打印傳單W ,你的代碼中的h,x,y和r?或者這只是一個假設,這些價值真的在那裏?因爲你讓它看起來像印刷品。 –

+2

'*(canvas + i + j)'---->'*(canvas + j +(i * w))'....'i'必須是行寬的倍數 – LPs

回答

5

原因是這樣的:*(canvas + i + j)

假設i == 1j == 1(第二行,第二個元素)。在您的連續陣列中,位置爲1*w + 1,但是*(canvas + i + j)會爲您提供位置1 + 1

所以i應該由w相乘, '跳過' i行(每個長度w的):

*(canvas + i*w + j)

你可以看到ideone

+1

只是想寫這個。打敗了我。 –

+1

我也是。我評論說同樣的。 ;)+1 – LPs

+0

會發生)也許我只是讀得更快) –