全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2481
推到 Plurk!
推到 Facebook!

請教不規則區域之填滿問題

尚未結案
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-07 23:19:34 IP:203.64.xxx.xxx 未訂閱
困難點1:USER在IMAGE上劃下如圖所示紅色線條之標註,請各位前輩賜教,該          如何將這些區域填入指定的顏色,,換句話說,我該如何表示這個區          域的範圍 困難點2:USER所畫出來的區域未必是封閉區域,有可能沒有完全密合,有沒有          可能在起始點與終止點差距在一定範圍內,就將它當作是一個封閉區          域或是自動將其畫成封閉區域    
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-08 18:36:54 IP:61.219.xxx.xxx 未訂閱
引言: 困難點1:USER在IMAGE上劃下如圖所示紅色線條之標註,請各位前輩賜教,該 如何將這些區域填入指定的顏色,,換句話說,我該如何表示這個區 域的範圍 困難點2:USER所畫出來的區域未必是封閉區域,有可能沒有完全密合,有沒有 可能在起始點與終止點差距在一定範圍內,就將它當作是一個封閉區 域或是自動將其畫成封閉區域
請問,紅色區域是User已經畫好的嗎? 或者是你有個介面讓使用者畫圖? 比如說用一個Image,載入原始圖片 再讓User畫圖?
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-08 20:40:44 IP:218.167.xxx.xxx 未訂閱
引言: 請問,紅色區域是User已經畫好的嗎? 或者是你有個介面讓使用者畫圖? 比如說用一個Image,載入原始圖片 再讓User畫圖?
我是使用Image物件載入原始圖片讓USER畫圖而形成紅色的部份,我想在USER松開滑鼠後自動填滿顏色,請您指教,謝謝 發表人 - rauhh 於 2005/07/08 20:41:46
fusung
中階會員


發表:26
回覆:169
積分:99
註冊:2003-11-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-08 23:31:27 IP:61.222.xxx.xxx 未訂閱
哈囉,rauhh:    關於塗滿某一區塊可以在KTop搜尋關鍵字"floodfill",相信應該會有所收穫! 我試過下面這一篇,其中區塊不見得封閉亦可以塗滿(差強人意),你可以先試試看! 在 href="http://delphi.ktop.com.tw/topic.php?topic_id=19272">http://delphi.ktop.com.tw/topic.php?topic_id=19272 改寫成BCB程式,如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
PaintBox1->Canvas->Ellipse(1,1,100,100);
PaintBox1->Canvas->Ellipse(110,110,300,300);
PaintBox1->Canvas->Ellipse(510,210,200,120);
PaintBox1->Canvas->Ellipse(320,420,300,300);
PaintBox1->Canvas->Ellipse(440,240,400,500);
PaintBox1->Canvas->Ellipse(660,260,500,600);
PaintBox1->Color = clRed;
PaintBox1->Canvas->FloodFill(101,101,clRed, fsSurface);
}
 
讓我覺得奇怪是:在我電腦上button需要按兩下才會show出結果,怪哉 <> <> > 發表人 -
------


The first step toward proving things for yourself is to understand how others have done it before!

s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-09 02:27:59 IP:61.219.xxx.xxx 未訂閱
您好,請試試以下... 增一個專案,並放上一個Image1、一個ListBox1    
//以下在Unit1.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;    //紀錄是否開始畫
bool DrawStart = false;    //紀錄座標點用的TStringList變數,或許你有更好的方法^^"
TStringList *tslX = new TStringList;
TStringList *tslY = new TStringList;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    //載入圖片
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
    Bitmap->LoadFromFile("C:\\Sample.bmp");
    Image1->Width = Bitmap->Width;
    Image1->Height = Bitmap->Height;
    Image1->AutoSize = false;
    Image1->Canvas->Draw(0,0,Bitmap);        //設定畫筆、填充樣式
    Image1->Canvas->Brush->Color = clSkyBlue;
    Image1->Canvas->Pen->Style =psSolid;
    Image1->Canvas->Pen->Color =clRed;
    
    delete Bitmap;     
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if( Button == 0)
    {
        DrawStart =true;            //設定Canvas的第一點座標點
        Image1->Canvas->PenPos = Point(X,Y);
        Form1->DoubleBuffered=true;            //紀錄第一點座標點
        tslX->Add(X);
        tslY->Add(Y); 
    }          
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    if (DrawStart == true)
    {
        Image1->Canvas->LineTo(X,Y);
        //設定Canvas的座標點
        Image1->Canvas->PenPos = Point(X,Y);
        
        //紀錄座標點
        tslX->Add(X);
        tslY->Add(Y);
    }        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    if( Button == 0)
    {
        int i;
        TPoint *PointTemp;
        PointTemp = new TPoint[tslX->Count 1];
        
        ListBox1->Items->Clear();
        ListBox1->Items->Add("不規則區域座標點如下:");
        
        for (i=0;iCount;i  )
        {
            PointTemp[i] = Point(StrToInt(tslX->Strings[i]),StrToInt(tslY->Strings[i]));
            ListBox1->Items->Add(tslX->Strings[i]   " , "   tslY->Strings[i]);
        }            //讓區域的座標終點與起始點相同
        PointTemp[i] = Point(StrToInt(tslX->Strings[0]),StrToInt(tslY->Strings[0]));
        ListBox1->Items->Add(tslX->Strings[0]   " , "   tslY->Strings[0]);
        
        DrawStart =false;            //依據PointTemp裡的座標點畫不規則區域
        Image1->Canvas->Polygon(PointTemp,tslX->Count);            tslX->Clear();
        tslY->Clear();            delete [] PointTemp; 
    }    
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    delete tslX;
    delete tslY;
}
//---------------------------------------------------------------------------
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-09 17:19:07 IP:218.167.xxx.xxx 未訂閱
您好:           十分感謝您的協助,以解決我大部分的問題,惟一一個小小的問題在於為何我MOUSEUP後,在圖上都會有ㄧ個常常的尾巴(如圖所示,只是大小均不同),是否是因為之間有設定起始點與終點為同一點之故,這該如何解決呢?    謝謝    PS:真想給你2個滿意答覆ㄋ~~~感激不盡
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-09 21:01:53 IP:61.219.xxx.xxx 未訂閱
rauhh 你好    很奇怪,我的並不會耶...     是不是你漏掉了某個步驟? 例如: //讓區域的座標終點與起始點相同 PointTemp[i] = Point(StrToInt(tslX->Strings[0]),StrToInt(tslY->Strings[0])); 原始碼: http://home.pchome.com.tw/cool/s1937kk/Project1.zip
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-11 15:20:15 IP:218.167.xxx.xxx 未訂閱
實在是很奇怪ㄟ~~我把程式貼上來,請各位指教一下,看看為何會"長尾巴" ===================================================================== int down=0; void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(trauma==0) { ShowMessage("請先選擇創傷類別再進行標記!"); } else { pointx->Add(X); pointy->Add(X); Image2->Canvas->PenPos = Point(X,Y); Image2->Canvas->MoveTo(X,Y); down=1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(down==1) { Image2->Canvas->LineTo(X,Y); Image2->Canvas->PenPos = Point(X,Y); //設定Canvas的座標點 //紀錄座標點 pointx->Add(X); pointy->Add(Y); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int i; TPoint *PointTemp; PointTemp = new TPoint[pointx->Count 1]; ListBox1->Items->Clear(); ListBox1->Items->Add("不規則區域座標點如下:"); for (i=0;iCount;i ) { PointTemp[i] = Point(StrToInt(pointx->Strings[i]),StrToInt(pointy->Strings[i])); ListBox1->Items->Add(pointx->Strings[i] " , " pointy->Strings[i]); } //讓區域的座標終點與起始點相同 down=0; PointTemp[i] = Point(StrToInt(pointx->Strings[0]),StrToInt(pointy->Strings[0])); ListBox1->Items->Add(pointx->Strings[0] " , " pointy->Strings[0]); //依據PointTemp裡的座標點畫不規則區域 switch(trauma) { case 1: Image2->Canvas->Brush->Style = bsHorizontal; Image2->Canvas->Brush->Color = clRed; Image2->Canvas->Polygon(PointTemp,pointx->Count); this->Memo1->Lines->Add("摔傷"); break; case 2: Image2->Canvas->Brush->Style = bsFDiagonal; Image2->Canvas->Brush->Color = clRed; Image2->Canvas->Polygon(PointTemp,pointx->Count); this->Memo1->Lines->Add("跌傷"); break; case 3: Image2->Canvas->Brush->Style = bsBDiagonal; Image2->Canvas->Brush->Color = clRed; Image2->Canvas->Polygon(PointTemp,pointx->Count); this->Memo1->Lines->Add("壓傷"); break;
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-11 15:59:41 IP:210.68.xxx.xxx 未訂閱
rauhh您好:    PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 >
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-11 16:09:57 IP:218.167.xxx.xxx 未訂閱
奉副站長只是重新PO上程式碼
 
int down=0;
void __fastcall TForm1::Image2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(trauma==0)
{
ShowMessage("請先選擇創傷類別再進行標記!");    }
else
{
pointx->Add(X);
pointy->Add(X);
Image2->Canvas->PenPos = Point(X,Y);
Image2->Canvas->MoveTo(X,Y);
down=1;
}
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(down==1)
{    Image2->Canvas->LineTo(X,Y);
Image2->Canvas->PenPos = Point(X,Y); //設定Canvas的座標點    //紀錄座標點
pointx->Add(X);
pointy->Add(Y);
}    }
//---------------------------------------------------------------------------    void __fastcall TForm1::Image2MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
int i;
TPoint *PointTemp;
PointTemp = new TPoint[pointx->Count 1];    ListBox1->Items->Clear();
ListBox1->Items->Add("不規則區域座標點如下:");    for (i=0;iCount;i  )
{
PointTemp[i] = Point(StrToInt(pointx->Strings[i]),StrToInt(pointy->Strings[i]));
ListBox1->Items->Add(pointx->Strings[i]   " , "   pointy->Strings[i]);
}    //讓區域的座標終點與起始點相同
down=0;
PointTemp[i] = Point(StrToInt(pointx->Strings[0]),StrToInt(pointy->Strings[0]));
ListBox1->Items->Add(pointx->Strings[0]   " , "   pointy->Strings[0]);    //依據PointTemp裡的座標點畫不規則區域
switch(trauma)
{
case 1:
Image2->Canvas->Brush->Style = bsHorizontal;
Image2->Canvas->Brush->Color = clRed;
Image2->Canvas->Polygon(PointTemp,pointx->Count);
this->Memo1->Lines->Add("摔傷");
break;
case 2:
Image2->Canvas->Brush->Style = bsFDiagonal;
Image2->Canvas->Brush->Color = clRed;
Image2->Canvas->Polygon(PointTemp,pointx->Count);
this->Memo1->Lines->Add("跌傷");
break;
case 3:
Image2->Canvas->Brush->Style = bsBDiagonal;
Image2->Canvas->Brush->Color = clRed;
Image2->Canvas->Polygon(PointTemp,pointx->Count);
this->Memo1->Lines->Add("壓傷");
break;    
s1937kk
一般會員


發表:2
回覆:15
積分:8
註冊:2004-11-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-11 19:32:56 IP:61.219.xxx.xxx 未訂閱
void __fastcall TForm1::Image2MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if(trauma==0)
    {
        ShowMessage("請先選擇創傷類別再進行標記!");        }
    else
    {
        pointx->Add(X);
        pointy->Add(X);//應該是這裡吧,應該是pointy->Add(Y)
        Image2->Canvas->PenPos = Point(X,Y);
        Image2->Canvas->MoveTo(X,Y);
        down=1;
    }
}
我沒有整個試,目測的確是這裡錯了 我把我的程式的這個部份故意打錯,也會長尾巴 @@" 嗯....哩咧愛睏吼~~~ PS. 這個程式長的好像是中醫診療系統... 站長的公司也是在做中醫系統... 我女友他們診所是用國泰的系統...@.@ 發表人 - s1937kk 於 2005/07/11 20:04:34
rauhh
一般會員


發表:24
回覆:14
積分:7
註冊:2005-03-23

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-11 20:05:05 IP:218.167.xxx.xxx 未訂閱
實在是太感謝您了,尾巴已經被砍掉囉~~真好 太粗心大意了,謝謝
系統時間:2024-05-13 11:53:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!