2015-12-10 251 views
0

I'm繪製圓的時候試圖建立使用C.眼下I'm在屏幕上繪製圓工作256色VGA一個簡單的圖像編輯器(如油漆)。 I'm得到的問題是,當圓比屏幕不應該是繪製出現在屏幕的另一側的部分大。我有一個if語句來驗證像素是否在屏幕的繪圖區域。但我不明白爲什麼像素會進入屏幕的另一側。檢查屏幕邊界在VGA圖形

這是我得到的問題:

enter image description here

,這是畫圓和檢查範圍的代碼。我有一個函數get_xy(),它給我X,一個用於視頻存儲偏移y座標,我用這個座標來檢查像素將被繪製區域內繪製:

#define SCREEN_SIZE   (word)(SCREEN_WIDTH*SCREEN_HEIGHT) 
typedef unsigned char byte; 
typedef unsigned short word; 
typedef long   fixed16_16; 

fixed16_16 SIN_ACOS[1024]; 
byte *VGA=(byte *)0xA0000000L;   /* this points to video memory. */ 
word *my_clock=(word *)0x0000046C; /* this points to the 18.2hz system 
              clock. */ 
/************************************************************************** 
* circle               * 
* Draw circle                * 
**************************************************************************/ 

void circle(int x,int y, int radius, byte color) 
{ 
    fixed16_16 n=0,invradius=(1/(float)radius)*0x10000L; 
    long int dx=0,dy=radius-1; 
    int t[2]; 


    long int dxoffset,dyoffset,offset = (y<<8)+(y<<6)+x; 
    if(!(y>0 && y<180&&x>32 && x<=320)){return;} 
    while (dx<=dy) 
    { 
    dxoffset = (dx<<8) + (dx<<6); 
    dyoffset = (dy<<8) + (dy<<6); 
    get_xy(offset+dy-dxoffset,t); 

    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset+dy-dxoffset] = color; /* octant 0 */ 
    } 

    get_xy(offset+dx-dyoffset,t); 
    //printf("offset: %u \n",offset+dx-dyoffset); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset+dx-dyoffset] = color; /* octant 1 */ 
    } 

    get_xy(offset-dx-dyoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset-dx-dyoffset] = color; /* octant 2 */ 
    } 


    get_xy(offset-dy-dxoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset-dy-dxoffset] = color; /* octant 3 */ 
    } 


    get_xy(offset-dy+dxoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset-dy+dxoffset] = color; /* octant 4 */ 
    } 


    get_xy(offset-dx+dyoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset-dx+dyoffset] = color; /* octant 5 */ 
    } 

    get_xy(offset+dx+dyoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset+dx+dyoffset] = color; /* octant 6 */ 
    } 


    get_xy(offset+dy+dxoffset,t); 
    if(t[1]>0 && t[1]<180&&t[0]>32 && t[0] <=320){ /*Checking if is inside drawing area*/ 
     VGA[offset+dy+dxoffset] = color; /* octant 7 */ 
    } 

    dx = dx+1; 
    n+=invradius; 
    dy = (long int)((radius * SIN_ACOS[(long int)(n>>6)]) >> 16); 
    } 
} 

void get_xy(long int offset, int* a){ 
    int x,y; 
    int r[2]; 
    if(offset<0||offset>SCREEN_SIZE){ 
     a[0]=-500; 
     a[1]=-500; 
     //printf("grande"); 
    } 
    else{ 
     y = offset/((1<<8) + (1<<6)); 
     x = offset%((1<<8) + (1<<6)); 

     a[0] =x; 
     a[1]=y;  

    } 


} 
+0

使用'get_xy(長整型偏移...)'和'如果(偏移<0 ||偏移> SCREEN_SIZE){',以避免一個負數成爲一些無符號值。 – chux

+0

謝謝。我提出了建議的更改,但我仍然遇到同樣的問題。 –

+0

自信的代碼有一個問題與類型的變化 - 地方。祝你好運想法:看看'offset + dy-dxoffset'和其他的計算方式。 – chux

回答

0

dxoffset = (dx<<8) + (dx<<6); 
dyoffset = (dy<<8) + (dy<<6); 
get_xy(offset+dy-dxoffset,t); 

是確定的,但邊界檢查需要在(X + DX)&(Y + DY) 形成偏移之前完成。

如果邊界檢查上x+dxy+dy等做(這是正確的),是不是需要在所有get_xy()