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

無法填色

尚未結案
HKH
一般會員


發表:10
回覆:16
積分:5
註冊:2005-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-11 23:44:58 IP:219.68.xxx.xxx 未訂閱
以下是我的程式碼,我利用點與點之間連成線作出封閉區間,但是卻無法在封閉區間完成時在封閉區間內填上我要的紅色? 另外還有個問題,就是當我連成封閉區間後要做貝氏曲線,有時不能做,要我在封閉區間內多點幾點,才行做貝氏曲線?    
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-12 22:16:25 IP:59.115.xxx.xxx 未訂閱
HKH 妳好:    妳貼上來的程式碼似乎不太完整,而且也沒看到有填色的動作,請補強一下,或許比較容易找出問題來。      7 天天敲鍵盤 v 時時按滑鼠 8
HKH
一般會員


發表:10
回覆:16
積分:5
註冊:2005-10-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-12 22:51:09 IP:219.68.xxx.xxx 未訂閱
您好: 這段程式碼就是我用來在圖上可以把點和點連成線畫成封閉曲線..
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-12 23:39:03 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-13 10:04:40 IP:219.68.xxx.xxx 未訂閱
您好: 抱歉...之前看錯了...所以沒寫到填色的動作... 想請問一下...就是我要做填色動作是在我把點連成封閉曲線後就自動上色... 我有做一個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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-13 10:45:06 IP:59.115.xxx.xxx 未訂閱
HKH 妳好:
引言:想請問一下...就是我要做填色動作是在我把點連成封閉曲線後就自動上色... 我有做一個listbox去紀錄我所點的座標位置...但是當我點回原點成封閉曲線...往往最後一點會跟原點有誤差...這樣該怎麼處理?該如何上色?
這些動作都必須要由妳自己視需要來訂定出遊戲規則,尾點與首點之間的誤差可以用自動校正的方式來處理,但是妳必須先訂出校正的規則,比如說:設定幾個點 (線段) 之後即自動接至原點、或者是當某一點趨近於原點的某個範圍之內時,就自動接至原點、又或者是按下鍵盤上的某個特定按鍵時,就將尾點校正至原點....等等,總之;要自動處理是可行的,但是時機條件必須要訂定出來。 7 天天敲鍵盤 v 時時按滑鼠 8
HKH
一般會員


發表:10
回覆:16
積分:5
註冊:2005-10-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-13 13:50:46 IP:219.68.xxx.xxx 未訂閱
"按下鍵盤上的某個特定按鍵時,就將尾點校正至原點" 想請問這樣的作法是否有範例可以提供.. 不太會寫這個>"<
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-13 14:25:22 IP:61.217.xxx.xxx 未訂閱
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  ;
    }
}
上述程式碼的作用如下:
  1. 一般狀態下在 Image2 上面點擊滑鼠時,為繪製連續的線段。
  2. 按下鍵盤上的 Ctrl 鍵,再點擊滑鼠於 Image2 上面的任意位置時,會將最後一條線畫到原點去,使形成封閉區域。
  3. 按下鍵盤上的 Shift 鍵,再點擊滑鼠於 Image2 上面所繪製的封閉區域內時,會將該區域填滿指定顏色。
7 天天敲鍵盤 v 時時按滑鼠 8
HKH
一般會員


發表:10
回覆:16
積分:5
註冊:2005-10-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-13 16:40:36 IP:219.68.xxx.xxx 未訂閱
您好: 我在寫的過程中發生一點錯誤想請問一下... 就是我的畫筆顏色本來設是
Image2->Canvas->Pen->Color = clRed;
想改成自訂的顏色
Image2->Canvas->Pen->Color = (TColor)RGB(252,241,160);
但結果卻變成整張圖都是我自訂的顏色...這是未什麼?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-13 19:39:05 IP:61.217.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-13 20:45:40 IP:219.68.xxx.xxx 未訂閱
請問一下.... 我原本有貝氏曲線的功能卻執行不出來.... 貝氏曲線執行出來的結果會出現在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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-13 22:49:11 IP:61.217.xxx.xxx 未訂閱
HKH 妳好:    先更正一下前一篇裡的程式碼,我誤將測試的碼貼上來了:
Image2->Picture->Bitmap->Canvas->FloodFill(x_buffer[number-1] 1, y_buffer[number-1] 1, LineColor, fsBorder);
更正為:
Image2->Picture->Bitmap->Canvas->FloodFill(X, Y, LineColor, fsBorder);
接下來回覆妳的問題:
  1. 妳將繪製貝茲曲線時的顏色設為白色,若是 Image4 的底色也為白色的話,那將會無法看到繪製的結果。
  2. 經我測試的結果,好像使用 PolyBezier() 函式時,傳入的 TPoint 陣列的大小必須要與實際使用到的 TPoint 數量相符,否則就會怪怪的,原因我未找出來,因此我加上一段處理,在執行 PolyBezier() 函式之前,建立一組與 bezier 變數數值相同的 TPoint 陣列,然後將這組陣列傳給 PolyBezier() 函式來使用,這樣子就可以正確的繪製出貝茲曲線了:
    void __fastcall TForm1::N2Click(TObject *Sender)
    {
        TPoint *np = new TPoint[bezier];        for(int i=0; iCanvas->Pen->Width = 1;
        Image4->Canvas->Pen->Color = clRed;
        Image4->Canvas->PolyBezier(np, bezier-1);        delete np;
    }
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/11/13 22:51:52
HKH
一般會員


發表:10
回覆:16
積分:5
註冊:2005-10-01

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-22 22:06:10 IP:220.134.xxx.xxx 未訂閱
RedSnow您好: 想請問您一下...我使用 PolyBezier() 函式..用您下面的範例在點回原點時做貝氏曲線..還是會造成有時候無法做貝氏...需在圖上再多點... 請問有沒有辦法解決?麻煩您了
引言:
  • 經我測試的結果,好像使用 PolyBezier() 函式時,傳入的 TPoint 陣列的大小必須要與實際使用到的 TPoint 數量相符,否則就會怪怪的,原因我未找出來,因此我加上一段處理,在執行 PolyBezier() 函式之前,建立一組與 bezier 變數數值相同的 TPoint 陣列,然後將這組陣列傳給 PolyBezier() 函式來使用,這樣子就可以正確的繪製出貝茲曲線了:
    void __fastcall TForm1::N2Click(TObject *Sender)
    {
        TPoint *np = new TPoint[bezier];        for(int i=0; iCanvas->Pen->Width = 1;
        Image4->Canvas->Pen->Color = clRed;
        Image4->Canvas->PolyBezier(np, bezier-1);        delete np;
    }
  • [/list=1] 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/11/13 22:51:52
    RedSnow
    版主


    發表:79
    回覆:1322
    積分:845
    註冊:2003-12-15

    發送簡訊給我
    #14 引用回覆 回覆 發表時間:2005-11-23 00:35:54 IP:61.230.xxx.xxx 未訂閱
    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
    系統時間:2024-05-12 14:21:20
    聯絡我們 | Delphi K.Top討論版
    本站聲明
    1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
    2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
    3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!