線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5174
推到 Plurk!
推到 Facebook!

ScanLine的用法

答題得分者是:taishyang
yana125
一般會員


發表:16
回覆:17
積分:6
註冊:2006-10-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-29 11:24:54 IP:220.133.xxx.xxx 訂閱
普通的存取二維陣列的方法就是設2個for迴圈

如何使用ScanLine
來存取任意的陣列 A[ x ][ y ] 的位置呢


taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-30 10:09:38 IP:122.124.xxx.xxx 未訂閱
搜尋過舊文章了嗎?
請將您的程式碼PO上來讓前輩們幫您看看問題在那邊
jenwe
一般會員


發表:34
回覆:38
積分:24
註冊:2007-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-30 10:20:24 IP:140.118.xxx.xxx 訂閱
ScanLine的方法~就圖像處理來說~應該是在於存取整張圖形每個PIXEL的資訊
要存取任意陣列~建議可以用指標來做~不需要用ScanLine~
可以把程式碼PO上來讓各位幫妳看看


===================引 用 yana125 文 章===================
普通的存取二維陣列的方法就是設2個for迴圈

如何使用ScanLine
來存取任意的陣列 A[?x ][?y ] 的位置呢


yana125
一般會員


發表:16
回覆:17
積分:6
註冊:2006-10-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-31 02:16:59 IP:59.127.xxx.xxx 訂閱
我用一個橢圓型去掃一張320*240的圖
我ㄧ開始的作法是利用 (i,j)當圓心一點一點跑,這樣很慢
<textarea class="cpp" rows="10" cols="60" name="code"><br /> for(i=0;iHeight;i )
for(j=0;jwidth;j )
{
x=i a*cos(PI*k/180); //x,y是橢圓圓周上的座標點
y=j b*sin(PI*k/180); //i.j是橢圓圓心,是根據圓心來移動的
pixel= GetPixel(Bmp->Canvas->Handle, x,y); //統計像素
value=(Byte)pixel;
sum =value;
}
totle[i][j]=sum/360;
</textarea><br /> 所以我改成先配置記憶體的方式
先配置出ptr[i][j],接下來就不知道怎麼控制圓心去掃圖了??
<textarea class="cpp" rows="10" cols="60" name="code"><br /> int **ptr= new int*[Bmp->Height]
for(i=0;iHeight;i )
ptr[i]= new int[Bmp->Width]
</textarea><br />
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-31 09:41:14 IP:122.124.xxx.xxx 未訂閱
看不出你的程式碼跟ScanLine有什麼關係
你試過站上ScanLine範例了嗎? 知道怎麼用了嗎?

yana125
一般會員


發表:16
回覆:17
積分:6
註冊:2006-10-24

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-31 13:05:16 IP:59.127.xxx.xxx 訂閱
我改成這樣之後,速度還是一樣慢,不知道問題出在哪 麻煩前輩指教... <textarea class="cpp" rows="10" cols="60" name="code"> Bmp->Assign(Image2->Picture->Bitmap); Img = new int*[Bmp->Height]; for(i = 0; i< Bmp->Height; i ) Img[i] = new int[Bmp->Width]; Bmp->Assign(Image2->Picture->Bitmap); for(j=0; jHeight; j ) { ptr = (Byte *)Bmp->ScanLine[j]; for(i=0; iWidth; i ) { Img[j][i] = ptr[i*3] ptr[i*3 1] ptr[i*3 2] ; } } for(j=0;jHeight;j ) { ptr = (Byte *)Bmp->ScanLine[j]; for(i=0;iWidth;i ) { sum=0; for(k=0;k<360;k ) { x=Img[j][i] a*cos(PI*k/180); y=Img[j][i] b*sin(PI*k/180); pixel= GetPixel(Bmp->Canvas->Handle, x,y); value=(Byte)pixel; sum =value; } totle[i][j]=sum/360; } } </textarea>
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-31 16:34:55 IP:122.124.xxx.xxx 未訂閱
我想你的關鍵點在是否需要掃描每個像素點
意即
1.橢圓圓心是否要在整張畫面中逐點掃瞄?
2.橢圓圓周是否要掃描360個點?

假如你每項都是逐點掃瞄,那你可以想像那計算量有多大了
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-07-31 17:05:33 IP:61.222.xxx.xxx 訂閱
ScanLine 是比 GetPixel 快是無庸置疑。
但相同動作 ScanLine 二次,效率會提升到哪裡去。
該不會是多出來的。

yana125
一般會員


發表:16
回覆:17
積分:6
註冊:2006-10-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-31 17:28:55 IP:59.127.xxx.xxx 訂閱
因為之前爬過站上的文章有提到需要逐點掃瞄,
所以我在做的過程就不考慮用跳點的方式,
後來我改成,掃描圖片及圓周部份每ㄧ次跳4點下去運算
是可以達到及時的效果....但是我擔心這樣會不準。

感謝前輩的耐心指導~
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-07-31 21:29:20 IP:220.131.xxx.xxx 未訂閱
這跟你的程式技巧有關吧。
1.利用指標。
2.利用 PI 這個東西。而不是用 360.也就是要做成”向量”
這個部份跟數學有關。很難講得清。
系統時間:2024-11-23 7:29:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!