2007年1月21日 星期日

多媒體專題_5(魔術棒_1)

魔術棒_1:
首先我先宣告 tagPOINT ptCurrent;
宣告 tagPOINT Stack[STACKSIZE];
宣告 一個動態的二維陣列FLAG[ImageHeight][ImageWidth](初始為0);
宣告FLAG[][]是為了要儲存整張圖的處理狀態,
FLAG[][]為0 ->未做過處理,找出我按的,要比較的那個起始點的x、y,

再Image->OnMouseDown的事件中

ptCurrent.x= x; ptCurrent.y= y;
ptR = IMatrixR[x][y];
ptG = IMatrixG[x][y];
ptB = IMatrixB[x][y];
//我將我按的值assign給ptCurrent的x和y值
//在此我也可以知道起始點的ptR、ptG、ptB好做比較

找我們所按的初始點的相鄰像素

for(i=-1;i<=1;i++) //參考了小白的
for(j=-1;j<=1;j++)
{ x=ptCurrent.x + i;
y=ptCurrent.y + j;
if(FLAG[x][y]==0)
{
PushStack(x,y);
}
}

void PushStack(/*tagPOINT s*/int a, int b)
//s是一個指標?

{
tagPOINT s;
s.x = a; //對於s我不太了解所以把他換成x,y?可行?
s.y = b; //因為老師網誌中的h檔可放入指標、也可放兩個整數
if(iStackTop == STACKSIZE)
{
ShowMessage("overflow!");
exit(1);
}
else
{
Stack[iStackTop] = s;
iStackTop ++;
FLAG[s.x][s.y]=1
//這麼用對嘛? [s.x]、[s.y]
//FLAG[][]為1 ->已放入陣列中,在陣列中待處理
//有想要在這裡判斷出這點的R、G、B值
//然後和原點的R、G、B做比較,亦或是在PopStack()中再抓?
}
}

tagPOINT PopStack(void)
{
tagPOINT s;
s=Stack[iStackTop];
iStackTop --;
FLAG[s.x][s.y]=check(s.x,s.y);
return s;
//return我們pop出的這個數去做判斷
//判斷是否為相似的色相,並改變其FLAG[][]
}

找相似值:
要讓DIFFERENT = [(ptR-R)^2+(ptG-G)^2+(ptB-B)^2]^(1/2)
在我們所設定的範圍(RANGE)之內
如果DIFFERENT <= RANGE
則設定FLAGE[X][Y]= 2
FLAG[][]為2 ->已經處理過且為起始點的相似點,
如果DIFFERENT > RANGE 則
設定FLAG[X][Y]= 3
FLAG[][]為3 ->已經處理過但和起始點是相異點,

//以上這些我都還沒有判斷FLAG[][]為什麼時不需要做事等等...
//想了很久,整體感覺大概知道,但是拼湊不起來...
//關於那個iStackTop是指標!!->宣告全域 int iStackTop

沒有留言: