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

座標點的連線問題

答題得分者是:istillloving
iam4000
一般會員


發表:12
回覆:5
積分:3
註冊:2008-11-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-02-16 16:32:22 IP:163.25.xxx.xxx 訂閱
如圖
我想要把這張圖的左右各兩個紅點連線(紅點是我用小畫家點上去的)
程式想要的作法是把這張圖分成四等份,並且用for迴圈找到這四個頂點
目前我的問題是無法把找到的頂點記錄成座標(似乎是要先求得座標才能夠連線)
以下是我程式的大概構想

[code cpp]
//這部分是找左上方的第一個點,當遇到第一個灰階值為255的點的時候就把那個點記錄起來
for(int x=0; x < TheBitmap->Width; x )
{
for(int y=0; y < TheBitmap->Height/2; y )
{
ptr1=(Byte*)TheBitmap->ScanLine[y];
if(ptr1[x]=255)
.
.
. //這裡是主要的問題,我不知道怎麼把找到的那個點用座標記錄起來
}
}
[/code]

先謝謝各位先進的回答
編輯記錄
iam4000 重新編輯於 2009-02-16 16:35:00, 註解 無‧
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-02-16 16:37:38 IP:118.169.xxx.xxx 訂閱
判斷頂點的法則是?
iam4000
一般會員


發表:12
回覆:5
積分:3
註冊:2008-11-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-02-16 16:44:19 IP:163.25.xxx.xxx 訂閱
以左上角我要找的頂點為例
如果程式由左邊開始往右邊找
碰到的灰階值第一個為255的點就一定是我要找的頂點
其他的三個點也差不多是這個邏輯

不曉得這樣您明白嗎???
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-02-16 16:55:07 IP:118.169.xxx.xxx 訂閱
你的圖若沒看錯,只有0(黑)跟255(白),
所以由左往右找並不會是你要找的第一個頂點



===================引 用 iam4000 文 章===================
以左上角我要找的頂點為例
如果程式由左邊開始往右邊找
碰到的灰階值第一個為255的點就一定是我要找的頂點
其他的三個點也差不多是這個邏輯

不曉得這樣您明白嗎???
iam4000
一般會員


發表:12
回覆:5
積分:3
註冊:2008-11-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-02-16 17:05:50 IP:163.25.xxx.xxx 訂閱
可能是我先前的表達有誤
應該是由上到下(x=0開始,y=0~height/2)搜尋看是否遇到第一個白色的點
如果沒有遇到白色的點則由(x=1開始,y=0~height/2)搜尋
先由上到下然後才由左到右搜尋白色的點
===================引 用 taishyang 文 章===================
你的圖若沒看錯,只有0(黑)跟255(白),
所以由左往右找並不會是你要找的第一個頂點



編輯記錄
iam4000 重新編輯於 2009-02-16 17:13:12, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-02-17 23:55:52 IP:218.169.xxx.xxx 訂閱



說真的我也看不太懂你找點的方式
不過既然你可以找到點的話就可以記錄座標
紀錄座標完之後可以使試試看


[code cpp]
#define Ilaft Form1->Image1->Left
#define Itop Form1->Image1->Top

Form1->Canvas->Pen->Width=1;
Form1->Canvas->Pen->Color=clBlue;
Form1->Canvas->MoveTo(Ilaft X,Itop Y);
Form1->Canvas->LineTo(Ilaft X x,Itop Y y);
[/code]

做運動估測時學到的......
------
恩...
編輯記錄
istillloving 重新編輯於 2009-02-18 00:02:03, 註解 無‧
istillloving 重新編輯於 2009-02-18 00:02:43, 註解 無‧
istillloving 重新編輯於 2009-02-18 00:03:15, 註解 無‧
istillloving 重新編輯於 2009-02-18 00:04:20, 註解 無‧
istillloving 重新編輯於 2009-02-18 00:06:27, 註解 無‧
iam4000
一般會員


發表:12
回覆:5
積分:3
註冊:2008-11-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-02-18 00:25:19 IP:163.25.xxx.xxx 訂閱
你好,istillloving 
我已經可以找到四個頂點了
現在就只差連線了
可是我不懂#define Ilaft Form1->Image1->Left 代表什麼意思 可以請你解釋一下嗎 謝謝
#define Itop Form1->Image1->Top

以下是我目前的程式

[code cpp]
void __fastcall TForm1::PointConnect1Click(TObject *Sender)
{
Byte *ptr1, *ptr2, *ptr3, *ptr4;
Graphics::TBitmap *TheBitmap;
int find;
TheBitmap=Image1->Picture->Bitmap;
//左上角的頂點
find=0;
for(int x=0; x < TheBitmap->Width; x )
{
for(int y=0; y < TheBitmap->Height/2; y )
{
ptr1=(Byte*)TheBitmap->ScanLine[y];
if(find==0 && ptr1[x]==255)
{
Image1->Canvas->Pixels[x][y]=clRed;
find=1;
}
}
}
//左下角的頂點
find=0;
for(int x=0; x < TheBitmap->Width; x )
{
for(int y=0; y < TheBitmap->Height; y )
{
ptr2=(Byte*)TheBitmap->ScanLine[y];
if(find==0 && ptr2[x]==255)
{
Image1->Canvas->Pixels[x][y]=clRed;
find=1;
}
}
}
//右上角的頂點
find=0;
for(int x=TheBitmap->Width-1; x > 0; x--)
{
for(int y=0; y < TheBitmap->Height/2; y )
{
ptr3=(Byte*)TheBitmap->ScanLine[y];
if(find==0 && ptr3[x]==255)
{
Image1->Canvas->Pixels[x][y]=clRed;
find=1;
}
}
}
//右下角的頂點
find=0;
for(int x=TheBitmap->Width-1; x > 0; x--)
{
for(int y=0; y < TheBitmap->Height; y )
{
ptr4=(Byte*)TheBitmap->ScanLine[y];
if(find==0 && ptr4[x]==255)
{
Image1->Canvas->Pixels[x][y]=clRed;
find=1;
}
}
}

}[/code]

===================引 用 istillloving 文 章===================



說真的我也看不太懂你找點的方式
不過既然你可以找到點的話就可以記錄座標
紀錄座標完之後可以使試試看


[code cpp]
#define Ilaft Form1->Image1->Left
#define Itop Form1->Image1->Top

Form1->Canvas->Pen->Width=1;
Form1->Canvas->Pen->Color=clBlue;
Form1->Canvas->MoveTo(Ilaft X,Itop Y);
Form1->Canvas->LineTo(Ilaft X x,Itop Y y);
[/code]

做運動估測時學到的......
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-02-18 07:59:07 IP:220.129.xxx.xxx 訂閱


#define Ilaft Form1->Image1->Left //假設你是把圖秀在Image1 那你必須要知道Image1的左邊起始點和頂端起始點
#define Itop Form1->Image1->Top
//這樣你要畫線的時候才能知道要從哪裡開始畫起

Form1->Canvas->Pen->Width=1; //指定畫筆寬度

Form1->Canvas->Pen->Color=clBlue; // 指定畫筆顏色

Form1->Canvas->MoveTo(Ilaft X,Itop Y);// 這就是所謂的
Image1上的(X,Y)座標 把畫筆移到(X,Y)座標上Form1->Canvas->LineTo(Ilaft X x,Itop Y y);//然後畫至Image1上的(X x,Y y)這一點

而且我看你的程式好像沒有紀錄這四的點的資訊 這樣你程式跑完的時候就找不到這些資訊了
所以我建議你用一個4*4的int矩陣來存這些資料
你可以設一個fleg或者是把他寫死 都可以達成你要的目的

[code cpp]

#define Ilaft Form1->Image1->Left //假設你是把圖秀在Image1 那你必須要知道Image1的左邊起始點和頂端起始點 #define Itop Form1->Image1->Top//這樣你要畫線的時候才能知道要從哪裡開始畫起
Form1->Canvas->Pen->Width=1; //指定畫筆寬度

Form1->Canvas->Pen->Color=clBlue; // 指定畫筆顏色

Form1->Canvas->MoveTo(Ilaft X,Itop Y);// 這就是所謂的
Image1上的(X,Y)座標 把畫筆移到(X,Y)座標 Form1->Canvas->LineTo(Ilaft X x,Itop Y y);//然後畫至Image1上的(X x,Y y)這一點

[/code]
------
恩...
編輯記錄
istillloving 重新編輯於 2009-02-18 08:00:31, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:00:59, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:01:19, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:01:42, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:02:35, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:04:33, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:10:40, 註解 無‧
istillloving 重新編輯於 2009-02-18 08:11:55, 註解 無‧
系統時間:2024-11-25 16:28:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!