今天回家,照往例又是繼續寫程式了。昨天氣功鍊完以後把玩著Viewer,赫然發現裡面三層圖和Annotation(就是畫面上的橢圓、正方形那些)竟然會對不起來,打開官方的ImageScope瀏覽器,發現他Annotation和我Viewer的物件顯示位置竟然不同。昨晚晚上邊睡邊想,反覆推敲以後,我認為我用的公式在數學上應該都沒有錯誤。那麼唯一的錯誤來源應該就是浮點運算的誤差了。
話說Viewer裡面總共有三個座標系,第一個是切片的100%座標系(完全座標),第二個是縮小圖的座標系(縮小座標,舉個例:切片完全座標系的(100,100)對應到長寬0.5倍圖的(50,50)),第三個是藉由縮放以後在螢幕上產生的縮放後座標系(螢幕座標)。程式內部三者常常相互轉換。螢幕座標的向量除以放大倍率就變成縮小座標上的向量,縮小座標向量乘以當初縮小的倍數(如:2、4...)就變成完全座標上的向量。然後計算出這麼多的座標以後,再來個不清不楚關係複雜的函數呼叫,然後那些函數本身又可能換算座標,結果浮點數運算誤差好像就越來越大了。
今天我就施展了作晚睡覺時在床上想到的奧義,所有的函數呼叫,參數一律都是完全座標,一大堆Class內部儲存座標的變數全部砍掉,只留下唯一的Controller內部保有當前座標值,透過Singleton暴露給所有需要的人,一大堆雜七雜八的整理和除錯之後,螢幕上的物件就很神奇的對的起來了。
接下來就是一直做minor bug fix,不過到目前為止,切片邊界重繪有時仍然不是很正常。
趕快去做Directory Listing的部份吧。XML Parser我來囉T_T 全文連結
0 意見:
張貼留言