無法填色 |
尚未結案
|
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
以下是我的程式碼,我利用點與點之間連成線作出封閉區間,但是卻無法在封閉區間完成時在封閉區間內填上我要的紅色?
另外還有個問題,就是當我連成封閉區間後要做貝氏曲線,有時不能做,要我在封閉區間內多點幾點,才行做貝氏曲線?
void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = clRed; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); Image2->Canvas->Brush->Color=clRed; } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier]=Point(X,Y); number ; bezier ; |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
您好:
這段程式碼就是我用來在圖上可以把點和點連成線畫成封閉曲線..
void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = clRed; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); Image2->Canvas->Brush->Color=clRed;//這邊就是我要在封閉曲線上色的程式碼...是參考前面大大的文章 } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier]=Point(X,Y); number ; bezier ; } void __fastcall TForm1::N2Click(TObject *Sender) { Image4->Canvas->Pen->Width = 1; Image4->Canvas->Pen->Color = clWhite; Image4->Canvas->PolyBezier(posi,bezier-1); } 引言: HKH 妳好: 妳貼上來的程式碼似乎不太完整,而且也沒看到有填色的動作,請補強一下,或許比較容易找出問題來。 7 天天敲鍵盤 v 時時按滑鼠 8發表人 - HKH 於 2005/11/12 23:20:35 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好: 妳那段程式主要是繪製線段,看不出來觸發 "填色" 的時機為何?另外妳標示出來的那一行僅是設定筆刷的顏色而已,並非填色的動作。 我不知道妳打算如何設定填色的時機,以下我先暫時以按下滑鼠鍵時,若也有按下鍵盤的 Shift 鍵就當作填色的時機,妳參考一下吧:
void __fastcall TForm2::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); if (Shift.Contains(ssShift)) { // 如果在點擊滑鼠鍵時,有按下鍵盤的 Shift 鍵 Image2->Canvas->Brush->Color = clRed; // 設定填塗的顏色 Image2->Picture->Bitmap->Canvas->FloodFill(X, Y, clRed, fsBorder); // 做填色動作 } else { Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = clRed; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier]=Point(X,Y); number ; bezier ; } }7 天天敲鍵盤 v 時時按滑鼠 8 |
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
您好:
抱歉...之前看錯了...所以沒寫到填色的動作...
想請問一下...就是我要做填色動作是在我把點連成封閉曲線後就自動上色...
我有做一個listbox去紀錄我所點的座標位置...但是當我點回原點成封閉曲線...往往最後一點會跟原點有誤差...這樣該怎麼處理?該如何上色?
引言: HKH 妳好: 妳那段程式主要是繪製線段,看不出來觸發 "填色" 的時機為何?另外妳標示出來的那一行僅是設定筆刷的顏色而已,並非填色的動作。 我不知道妳打算如何設定填色的時機,以下我先暫時以按下滑鼠鍵時,若也有按下鍵盤的 Shift 鍵就當作填色的時機,妳參考一下吧:void __fastcall TForm2::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); if (Shift.Contains(ssShift)) { // 如果在點擊滑鼠鍵時,有按下鍵盤的 Shift 鍵 Image2->Canvas->Brush->Color = clRed; // 設定填塗的顏色 Image2->Picture->Bitmap->Canvas->FloodFill(X, Y, clRed, fsBorder); // 做填色動作 } else { Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = clRed; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier]=Point(X,Y); number ; bezier ; } }7 天天敲鍵盤 v 時時按滑鼠 8 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好:
引言:想請問一下...就是我要做填色動作是在我把點連成封閉曲線後就自動上色... 我有做一個listbox去紀錄我所點的座標位置...但是當我點回原點成封閉曲線...往往最後一點會跟原點有誤差...這樣該怎麼處理?該如何上色?這些動作都必須要由妳自己視需要來訂定出遊戲規則,尾點與首點之間的誤差可以用自動校正的方式來處理,但是妳必須先訂出校正的規則,比如說:設定幾個點 (線段) 之後即自動接至原點、或者是當某一點趨近於原點的某個範圍之內時,就自動接至原點、又或者是按下鍵盤上的某個特定按鍵時,就將尾點校正至原點....等等,總之;要自動處理是可行的,但是時機與條件必須要訂定出來。 7 天天敲鍵盤 v 時時按滑鼠 8 |
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好: 看來妳對處理時機尚無特定的想法,那這樣好了,我直接就前一個範例再做簡單修改,讓妳參考一下:
void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); if (Shift.Contains(ssCtrl)) { // 如果在點擊滑鼠鍵時,有按下鍵盤的 Ctrl 鍵 Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); // 由前一個記錄的位置開始準備繪製 Image2->Canvas->LineTo(x_buffer[0], y_buffer[0]); // 畫一條直線接回原點 } else if (Shift.Contains(ssShift)) { // 如果在點擊滑鼠鍵時,有按下鍵盤的 Shift 鍵 Image2->Canvas->Brush->Color = clRed; // 設定填塗的顏色 Image2->Picture->Bitmap->Canvas->FloodFill(X, Y, clRed, fsBorder); // 做填色動作 } else { Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = clRed; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier]=Point(X,Y); number ; bezier ; } }上述程式碼的作用如下:
|
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好:
引言:我在寫的過程中發生一點錯誤想請問一下... 就是我的畫筆顏色本來設是 Image2->Canvas->Pen->Color = clRed; 想改成自訂的顏色 Image2->Canvas->Pen->Color = (TColor)RGB(252,241,160); 但結果卻變成整張圖都是我自訂的顏色...這是未什麼?整張圖都變成自定色?那應該不僅僅是變更了 Pen Color,而應該還變更了 Brush Color 吧? 請查看 BCB Help 對 FloodFill() 函式的說明,它的第三個參數是顏色值,函式會對這個顏色值所形成的封閉區域填上 Brush 所設定的顏色,因此就本篇所寫的範例而言,該參數應該要與繪製線段的顏色相同才行,否則就會將整個 Image 都填上 Brush 所設定的顏色了。 我將程式再修改一下,將繪製線段以及填充的顏色分別以變數來設定,這樣子應該就更能提供程式的易讀性了: // 下列兩個為全域變數 TColor LineColor = clRed; // 繪製線條的顏色 TColor FillColor = (TColor)RGB(252,241,160); // 填塗封閉區域的顏色 void __fastcall TForm2::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); if (Shift.Contains(ssCtrl)) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(x_buffer[0], y_buffer[0]); } else if (Shift.Contains(ssShift)) { Image2->Canvas->Brush->Color = FillColor; Image2->Picture->Bitmap->Canvas->FloodFill(x_buffer[number-1] 1, y_buffer[number-1] 1, LineColor, fsBorder); } else { Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = LineColor; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier] = Point(X,Y); number ; bezier ; } }7 天天敲鍵盤 v 時時按滑鼠 8 |
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
請問一下....
我原本有貝氏曲線的功能卻執行不出來....
貝氏曲線執行出來的結果會出現在image4
void __fastcall TForm1::N2Click(TObject *Sender) { Image4->Canvas->Pen->Width = 1; Image4->Canvas->Pen->Color = clWhite; Image4->Canvas->PolyBezier(posi,bezier-1); }請大大給我指導一下....謝謝 引言: HKH 妳好:引言:我在寫的過程中發生一點錯誤想請問一下... 就是我的畫筆顏色本來設是 Image2->Canvas->Pen->Color = clRed; 想改成自訂的顏色 Image2->Canvas->Pen->Color = (TColor)RGB(252,241,160); 但結果卻變成整張圖都是我自訂的顏色...這是未什麼?整張圖都變成自定色?那應該不僅僅是變更了 Pen Color,而應該還變更了 Brush Color 吧? 請查看 BCB Help 對 FloodFill() 函式的說明,它的第三個參數是顏色值,函式會對這個顏色值所形成的封閉區域填上 Brush 所設定的顏色,因此就本篇所寫的範例而言,該參數應該要與繪製線段的顏色相同才行,否則就會將整個 Image 都填上 Brush 所設定的顏色了。 我將程式再修改一下,將繪製線段以及填充的顏色分別以變數來設定,這樣子應該就更能提供程式的易讀性了:// 下列兩個為全域變數 TColor LineColor = clRed; // 繪製線條的顏色 TColor FillColor = (TColor)RGB(252,241,160); // 填塗封閉區域的顏色 void __fastcall TForm2::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ListBox1->Items->Add("X座標=>" IntToStr(X) ", Y座標=>" IntToStr(Y)); if (Shift.Contains(ssCtrl)) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(x_buffer[0], y_buffer[0]); } else if (Shift.Contains(ssShift)) { Image2->Canvas->Brush->Color = FillColor; Image2->Picture->Bitmap->Canvas->FloodFill(x_buffer[number-1] 1, y_buffer[number-1] 1, LineColor, fsBorder); } else { Image2->Canvas->Pen->Width = 1; Image2->Canvas->Pen->Color = LineColor; if (number > 0) { Image2->Canvas->MoveTo(x_buffer[number-1], y_buffer[number-1]); Image2->Canvas->LineTo(X, Y); Image2->Canvas->PenPos = Point(X,Y); } x_buffer[number] = X; y_buffer[number] = Y; posi[bezier] = Point(X,Y); number ; bezier ; } }7 天天敲鍵盤 v 時時按滑鼠 8 |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好: 先更正一下前一篇裡的程式碼,我誤將測試的碼貼上來了:
更正為: Image2->Picture->Bitmap->Canvas->FloodFill(X, Y, LineColor, fsBorder);接下來回覆妳的問題:
|
HKH
一般會員 發表:10 回覆:16 積分:5 註冊:2005-10-01 發送簡訊給我 |
RedSnow您好:
想請問您一下...我使用 PolyBezier() 函式..用您下面的範例在點回原點時做貝氏曲線..還是會造成有時候無法做貝氏...需在圖上再多點...
請問有沒有辦法解決?麻煩您了
引言: |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
HKH 妳好: 首先更正一下:我在前一篇所提的第 2 點是錯誤的,實際狀況應該是:使用 PolyBezier() 函式時,傳入的 TPoint 陣列的大小無需與實際使用到的 TPoint 數量相符。 接著回覆妳的問題:原先我並未試出妳所描述的問題,這次我卻測試出來了,但是無論我怎麼查看 BCB Help,卻都無法看出問題出在何處?因此我上網設法查閱相關資料,後來我查到了一些資料,剛才也再三測試過,這次的問題癥結點應該是 -- 使用 PolyBezier() 函式所傳入的 TPoint 陣列資料,其數量應該要是 3 的倍數再加 1,也就是妳點擊在 Image 元件上所記錄的座標點必須要是 4, 7, 10, 13, 16....這個數量,才能讓 PolyBezier() 函式順利的進行繪製動作。 當我回過頭再重新查看 BCB Help 時,才發現原先是自己過於主觀,因此忽略掉了 Help 中的重點,上述所提到座標點數量 (3 的倍數再加 1) 其實就是規則,因此我們必須在執行 PolyBezier() 函式之前做個檢查與處理:
void __fastcall TForm1::N2Click(TObject *Sender) { int nn = (bezier - 1) / 3; if (nn > 0) { Image4->Canvas->Pen->Width = 1; Image4->Canvas->Pen->Color = clRed; Image4->Canvas->PolyBezier(posi, nn*3); } }試試看吧~ 7 天天敲鍵盤 v 時時按滑鼠 8 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |