發表文章

Java小程式:貝茲曲線

這支程式是利用4點繪製一條貝茲曲線。 參考的程式碼在 這裡 ,我主要是將成是改寫成Java Application並加上一點點註解。 程式碼 import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class BzWindow extends JFrame implements ActionListener { /** * Eclipse 自動產生的數值,請無視。 */ private static final long serialVersionUID = -9060807186493274426L; // 資料結構 private Point[] coordlist; // 控制點 private int numpoints; // 控制點數目 // 貝茲曲線參數 double t; // the time interval double k = .025; // time step value for drawing curve int moveflag = 5; // flag to notify if user is moving a point boolean poly = true; // 是否要繪製控制點(沒畫還是可以移動控制點) JButton...

Matlab:利用repmat簡單的矩陣重複複製

repmat 就是 rep licate(repeat) mat rics ,功能就是複製(重複)多次相同的矩陣。 先前寫過 迅速的重複貼圖 法,最近從大學長那邊得知,還可以利用repmat作簡短的重複貼圖法。 clc;clear; img = imread('img.bmp'); M = 80; N = 80; final = repmat(img,M,N).*0.2+0.8*50; imshow(final);

BCB 使用Thread 後產生的錯誤 Canvas does not allow drawing

圖片
下圖是我在BCB使用中Thread後,原本相安無事的程式碼,突然出現的例外錯誤"Canvas does not allow drawing"。求救估狗大神後,說是在子執行緒中使用ShowMessage方法,會讓部分底層元件出現問題。 解決的方法就是呼叫Win32API,或是進行同步化,下面簡略的介紹以Win32API作轉換。 其實在子執行緒中使用ShowMessage,也不見得會有Exception產生,有時可能沒事情(機率很小),有時可能只跳出一個放大的Dialog且沒有按鈕可以結束它。 解決方案-Win32API 這個解決方案只能使用於小型的程式,大型程式可能會顯得礙手礙腳。 若你在個人的程式庫,十分愛用ShowMessage作為對使用者顯示訊息的手段,建議現在就著手修改為其他方式(有學過Java的朋友,可以考慮改為丟出Exception),因為本方案並不能解決你的問題。 本解決方案就是將你的視窗類別中多加一個ShowMessage方法。若你的主式窗名稱是TForm1,則將要加入的函式寫成下面這樣。 void TForm1::ShowMessage(const AnsiString &str) { // 一定要有雙冒號(::)代表存取Scope最外面部的MessageBox函式 ::MessageBox(NULL, str.c_str(), "Dialog Title", MB_OK); } Win32API的MessageBox參數簡易解說 NULL 是方便行事,其是也可以改成的你視窗的handle屬性。 str.c_str() 是將因為MessageBox支援的型態不是AnsiString,而是char*。 "Dialot Title" 是你可以改的顯示視窗標題(Title)。 MB_OK 顯示的按鈕種類,請查閱BCB的Help取得更多的種類說明。 然後記得在主視窗類別的.h檔也要加入對應的宣告。 void ShowMessage(const AnsiString&); 放在類別的private、protected或public區域都行,視你的應用而定。

筆記:Borland C++ 程式設計快速上手

剛開始從Java與C++轉到BCB時看的一本書,「 Borland C++ 程式設計快速上手 」,個人不是很推這本書,只是它讓我很方便找到了一些基本的函式,然後下面是我一邊瀏覽一邊做的筆記。 http://docs.google.com/Doc?id=dcgvj7bp_95fkgk3z

BCB設定:使用Tab字元且不要讓游標移動時當成8個空白

圖片
基於使用Notepad++與Eclipse後產生的小習慣,程式碼全部都用Tab作排縮,以至於現在使用Dev-C++與BCB都覺得非常的難用,尤其BCB用游標移動程式碼時,鍵入tab字元後,按左都會被分解成8個空白字元,按的好累。不過,現在可以解決這個問題了。 首先在BCB中開啟Editor Options,從工具列「Tools」→選擇「Editor Options」 然後如下圖指示,將紅色的區塊設定好,就不會讓Tab在游標移動的時候被當作空白字元,而是完整的從Tab頭跳到Tab尾巴或是反過來,從Tab尾巴跳到Tab頭。 此外,有兩個在這Editor Option中的選項,順便說明一下: 左邊的第一個選項Auto Indent Mode(自動排縮),由於我習慣用Tab當排縮,但是BCB卻會用空白字元當排縮,不會自己依照上排所用的排縮字元,因此我取消了這項功能,免去還要先消除這項自動排縮增添的許多空白。 左邊的最後一個選項Cursor beyond EOF,建議不要打勾,肇因於打勾後造成使用快速鍵進行複製貼上的困擾,只要一按快速鍵就會跑到最後一個字元,這項功能目前我還無法理解它存在的意義。

BCB:動態產生TImage元件

在BCB 6 中動態產生TImage元件, 範例碼 const int NUM_IMG = 5; TImage** imgs = new TImage*[NUM_IMG]; // 這裡的雙*是指標的陣列,不是2維陣列 for (int i=0 ; i<NUM_IMG ; ++i) { // 因為是指標陣列所以在取用方法與屬性時,得用ptr->或(*ptr).方法 imgs[i] = new TImage(NULL); imgs[i]->AutoSize = false; imgs[i]->Left = 100*i + 10*(i+1); // 要擺放的位置x軸 imgs[i]->Top = 20; // 要擺放的位置y軸 imgs[i]->Height = 100; // 影像物件的高度 imgs[i]->Width = 100; // 影像物件的寬度 imgs[i]->Parent=this; // 要擺放的Form 或 Container imgs[i]->Canvas->RoundRect(0,0,100,100,15,15); // 畫一下顏色表示已經在Form上 imgs[i]->OnClick=FormClick; // 設定滑鼠點擊時呼叫的函式,FormClick函式得要先存在 } 由於是動態產生,所以在還沒執行前的Form Design時,是看不到元件的,而且所有的動作都是要自行在物件產生後設定。 動態產生TImage可以做什麼? 位元平面(Bit Plane)、多階小波轉換等等,需要產生很多張圖片的分析方法。

資料:變動長度參數的巨集 Variadic Macro

Variadic Macro 稱為「變動長度參數的巨集」或是「不定長度參數的巨集」。 http://en.wikipedia.org/wiki/Variadic_macro 這項功能是 C99 標準的一環,個人認為是很好用的方法。Variadic Macro可以透過定義巨集,來決定是否要多印所屬行號__LINE__與所處檔案等 額外訊息 ,所以我在Linux上寫程式的時候就常常拿來除錯之用。由於 GCC 很早就支援了Variadic Macros的功能,害我一直認為這是很普遍的功能,現在要用BCB 6.0就沒有支援Variadic Macros,就有點不太適應。Visual C++ 6.0也沒有支援,不過 Jeff Hung 學長應工作上需要,實作出相似的功能。 #define LOGD(...) printf(__VA_ARGS__); #define LOGE(...) fprintf(stderr,__VA_ARGS__); #define LOGI(...) printf(__VA_ARGS__);

BCB:產生沒有裝BCB的電腦也可執行的程式

圖片
BCB的程式需要利用Borland動態連結函式庫(Dynamic Linking Library)才能work,所以在沒有安裝BCB的電腦就不能work,其實這問題跟VB程式找不到DLL檔案的問題很像,不過BCB在開發時就可以調整專案的編譯選項。 修改的方式就是,點選工具列的Project→Option 之後會跑出下圖的對話框,確認紅色部份是否圖如所示 修改後存檔,再build一次程式就可以拿執行檔去沒有裝BCB的電腦上跑。 編譯出來的檔案會使用DLL的檔案來的大許多倍,使用DLL大約都100kb以下,不用DLL至少都500kb,畢竟這是把整個函式庫都編譯進了程式中。

Java:建立有泛型的Collection陣列

最近遇到的問題,想將JMenuItem分成三類,每個類別要能動態增減,不過減得機率很少,所以建立了ArrayList帶有泛型的Collection陣列,不過卻不能直接的建立,該如何解決!? 關鍵詞: create array of java generic collection import java.util.ArrayList; import javax.swing.JMenuItem; /** 建立如何建立包函泛型的Collection陣列。 */ class ArrayOfGenericCollection { public static void main(String [] args) { // 最直覺的寫法,不過這個寫法是無法通過編譯的。 //ArrayList<JMenuItem> gat[] = new ArrayList<JMenuItem>[10]; // 下面的寫法是利用Java陣列的基本概念,加上轉型, // 不過因為動態轉型所以編譯帶有警告。 // 且執行時期因為Object無法轉成ArrayList,所以這樣也行不通。 //ArrayList<JMenuItem> gat2[] = (ArrayList<JMenuItem>[])new Object[10]; // 上面的寫法,既然無法將Object轉成ArrayList, // 那我們就建立一個不帶泛型標記的ArrayList // (有標記的就是一開始的寫法) // 編譯加執行成功!! ArrayList<JMenuItem> gat3[] = (ArrayList<JMenuItem>[])new ArrayList[10]; for (int i=gat3.length-1; i>=0; --i) gat3[i] = new ArrayList<JMenuItem>(5); System.out.println("gat3[1].size()="+gat3[1].size()); // 轉型少了泛型也是可以的,因為隱含轉型也合法。 // 同樣的,編譯加執行成功!! ArrayList...

宣告與初始化陣列成員與類別成員

先前資訊安全的作業Java的AES程式,想改為想使用BCB改為C++版實作,在改變實作語言時遇到小trouble,我有下面一個只擁有常數資料的類別: public class AESTables {  public static final byte[] Sbox = {   (byte)0x63 ,(byte)0x7c ,(byte)0x77 ,(byte)0x7b ...  }  ... } 而直接的想法是下面這個樣子,我認為這樣應該就OK了(嘆) class AESTables {  public:  static const unsigned char Sbox[] = {   0x63 ,0x7c ,0x77 ,0x7b ...  }  ... } 結果是沒有辦法compile,我try'n'error許久,最後的結論是只有下面這樣才能compile。 class ts {  public:  const static int a = 10;  const static int b[]; }; 但是這樣只能宣告成功,卻沒辦法使用它,一使用就會產生LinkError。而想要利用default constructor初始化陣列,compiler則是會給予const存取拒絕或認定為不正常的語法。 最後在 Google 上找到 解決方案 了,不過老實說,這方法沒有寫過還真不知道它存在。 class ts {  public:  const static int a = 10;  const static int b[]; const static ClassC c; }; const int ts::b[] = {1, 1, 1, -10, -1}; const ClassC ts::c = ClassC(); const ClassC ts::c(); //簡寫 使用關鍵字: C++ static class member array initialization 2007-10-01 備註 今天在以前買的 參考書 中也看到相同寫法了,由此可見以前都沒學好(汗)。