2009年10月26日 星期一

HW2

時間又超過啦…

上課所講的方法其實並沒有很懂…

所以作業上網做了很多功課,也用了老師講的C++Builder6書籍來參考。

課程部分重點在於影像旋轉,下面是我遇到的問題

一開始動手完成最初版本是會消除到邊邊角角,
後來發現原來是中心點的問題(參考右圖)

但是我對部落格上的程式講解沒辦法有效的轉成我想要的程式碼,所以我就另外找了程式組合起來。

再來就是數學運算的部分,剛完成的時候我在變數設置的時候就把角度的部分寫死。

後來由於我想要可以自己輸入角度,所以就把角度換弧度的地方做更動變成(2*3.1416*angle)/360,如此就可以自訂angle

因為Edit1內的Text內容是Ansistring型態,我以為做(int)這樣簡單的強制轉換就可以改變…沒想到不行,而是必須使用.ToInt(),在BCB中應該很多物件內容屬於Ansistring,不過轉換方法很容易找到,沒有花到太多時間。

原本想直接釋放記憶體就可以再做一次旋轉,不過釋放記憶體後卻不能再做旋轉(會出錯)
使用Delete,不知道哪邊出了問題,所以現在也只能再重新開才能再次旋轉。

最後一個問題是,目前圖片檔案必須符合Image設定大小或是Image改成跟圖一樣,否則旋轉後會有黑色部分出現或是截到圖。
(Stretch設true沒用,可能是因為只是將圖縮放至預設大小,而旋轉是用Image設定做運算?)
↑問題已解決,將Autosize調整為true,如圖


需要手動…較麻煩,但是可以不限制圖的長寬,也不會有黑色部分出現。


如果有人願意指導一下,或是旋轉有問題可以來信給我(我不一定全盤了解…Sorry)。

下面是旋轉135度和150度的情形。
 

HM2



這是一張逆時針旋轉45度的旋轉圖,雖然是顯示出來了,不過程式碼部分跟能夠旋轉各種角度的還有一大段差距,等整個完成之後再想辦法補上來。

2009年10月24日 星期六

HW2




研究了很久終於做出這個作業出來了,剛開始是因為旋轉後的圖片無法顯示出來,在參考同學的程式之後,終於可以顯示出來。
即使如此,旋轉後的圖片還是有些奇怪。因為我重複做兩次旋轉之後,旋轉之後的圖片會直接覆蓋上去,變成下面這張圖這樣。
我想原因應該是我哪裡沒有設定好吧,所以還需要再努力修改程式。

HW2



老實說這個部份
在旋轉後中心點後
新的矩陣點丟入舊矩陣點
想蠻久的因為不太知道怎麼丟值

後來就再看老師發表的介紹並詢問同學
終於好了

-------------------------------------------
新增部分

老實說這是我最頭痛的一個作業

不知為啥我對三角函數就是很頭痛

在最初,老師還沒放範例程式之時

我程式其實進度微薄

只做出單純套公式做出旋轉

而所謂的圖片破碎與圖片位置沒設好則苦惱無法解決

直到老師放範例程式之後才做出不破碎的圖與算出圖中心的位置

後來同學成凡(Matt)提供我他所找到的教學

(也就是他放在網誌鏈結的那篇)

知道如何把新的圖片大小設好

float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));

int DestBitmapWidth=(int)ceil(fabs(maxx)-minx);
int DestBitmapHeight=(int)ceil(fabs(maxy)-miny);

DestBitmap->Height=DestBitmapHeight;
DestBitmap->Width=DestBitmapWidth;

hw2













這次的作業主題我覺得困難的地方在於旋轉的數學公式:
X=X'*cosT-Y'*sinT
Y=X'*sinT+Y'*cosT
再來就是尋找中心點
還有就是BCB的使用方法,真的不好上手,對於不常使用視窗化程式的我, 在物件的地方思考了很久,最後發現只是單單的把值傳送過去而以。經由這次的作業,使我更加熟練程式的寫法。

2009年10月23日 星期五

HW1 - 開啟一張bmp圖片。

(首先,這麼慢才PO文,抱歉,因為研究了很久...囧)

  這次的作業是開啟一張bmp圖片,並且把RGB的值取出存入三個二維動態陣列儲存,且滑鼠在圖片上移動時,可以隨著滑鼠移動顯示圖片該點的RGB值。實作的流程和幾個比較重要的語法如下:

-------------------------------------------------------------
1.開啟一張bmp圖片
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

2.取得圖片寬高
Height = Image1->Picture->Height;
Width = Image1->Picture->Width;

3.宣告三個二維動態陣列
IMatrixR = new unsigned char *[Height];

4.取得圖片RGB值分別存入陣列
IMatrixR[i][j] = GetRValue(Image1->Canvas->Pixels[j][i]);

5.使用OnMouseMove把滑鼠移動到的點的RGB值輸出
Label4->Caption = AnsiString(GetRValue(Image1->Canvas->Pixels[Y][X]));
-------------------------------------------------------------
實作:
開圖(點圖放大)↓


秀圖(點圖放大)↓


心得:

  一開始因為第一次接觸這個程式語言,光是一些初步的問題,如:怎麼輸出一段文字、要在哪個區塊打程式碼...等,就快把我搞掛了,不過我的個性比較衝動,所以下課鐘響就馬上衝到圖書館借了一本BCB的書,書中提到了簡單的操作,演練之後有了初步瞭解,發現它的邏輯其實與學過的C語言差不多,但它是屬於視窗化的程式設計語言,再加上使用到的函式語法不少,所以不知道的語法就要上網去找一下嚕。

  這次實作大部分是參考老師和學長的程式碼外加書上的範例,卡關最久的地方就是隨滑鼠移動顯示值,這個部份的實作方式就是在顯示圖的物件上點一下再到左邊的小視窗,把標籤切換到"Event"後,有個叫"OnMouseMove"的欄位,在空白欄位上快點兩下,就會在程式碼那看到一個空白的副函式,它的宣告變數中就有X和Y,所以猜想可以利用這兩個變數去控制顯示滑鼠目前所在的位置的值,結果答對了~哈哈。

HW1

這是HW1的作業,作業還是要實際操作過,所以就先補上了。

作業不應該遲交這麼久,實在是很對不起。

---以下是作業部分----

關於動態宣告二為陣列部分

在老師的C++ Builder Programming Notes部落格中有提到,
還有就是在上課時老師說的學長作業參考,他將文字的敘述寫成code
我上網整個做查詢才整個了解。

用new宣告的時候做迴圈分兩層做動態配置,當然後面也是做迴圈來釋放記憶體。

另外還發現了使用malloc來做宣告的方法可以省掉使用迴圈的部分,
不過沒經過實測所以不清楚使用上會不會比較快速。

以上是這個作業所做的查詢

基本操作,BCB跑出來的畫面…

HW2

這次的作業有點難度,就是它的想法上有點打結,這幾天看老師的blog有說
明這次作業的演算法跟 步驟,自己照著步驟去試試看,不會的再問同學,最
後結果是有出來,在寫的過程中有遇到圖片位移和 圖片大小不一等情況
一開始對sin,cos 旋轉矩陣等這些數學公式有點忘了,再來是旋轉後影像
的長和寬要如何決定,最重要的是旋轉後的數學公式
X=X'*cos-Y'*sin
Y=X'*sin+Y'*cos
這邊卡了有點久,不過最後還是解決了

HW2



心得:
這次旋轉真的是搞很久,光是數學式子就弄半天了,再來是動態矩陣,還有座標位移`找中心點旋轉,這些都有難度,嘗試了很久才是得到目前的成果,但是還是有些地方要做修改。

2009年10月22日 星期四

HW2

主要是將旋轉公式
x=x*cos-y*sin
y=x*sin-y*cos
改成下面的程式碼
iOldJ = iNewI * dCosAngle - iNewJ * dSinAngle;
iOldI = iNewI * dSinAngle + iNewJ * dCosAngle;

做完這次的作業 原來靠程式解決一個問題並不簡單 從普通的數學公式轉換成程式碼以後 還有許多意想不到的問題 感覺最麻煩的就是選轉後如何讓圖片不會被裁掉邊角 而且做完了感覺也不是很好看 看來美化程式介面這方面還要加強 以上