goldhero
一般會員
發表:7 回覆:9 積分:3 註冊:2003-11-30
發送簡訊給我
|
最近在寫一個程式,是在平面上任意點出數個點,然後兩兩的點會造出其中垂線,
我寫的程式如下:
struct ip
{
int x;
int y;
int name;
};
struct ip1
{
float x;
float y;
int name;
};
ip a[10];
ip1 b[10];
//int x[3],y[3];
int i=0;
float M;
int C=1;
void VD(ip c[10],ip1 d[10],int n);
void merge(ip g[10],ip h[10],int z);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Image1->Canvas->Pen->Width=5;
Image1->Canvas->Pen->Style=psDashDot;
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->MoveTo(X,Y);
Image1->Canvas->LineTo(X,Y);
if(i<3&&Shift.Contains(ssLeft))
{
a[i].x=X;
a[i].y=Y;
Label1->Caption="x=" IntToStr(a[i].x) " y=" IntToStr(a[i].y);
C =i;
i ; }
for(int t=0;ta[t 1].x)
{
temp=a[t].x;
a[t].x=a[t 1].x;
a[t 1].x=a[t].x;
}
}
}
VD(a,b,C);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Reset1Click(TObject *Sender)
{
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
i=0;
C=1;
}
//---------------------------------------------------------------------------
void VD(ip c[10],ip1 d[10],int n)
{
int k=0;
float X1,Y1,X2,Y2;
ip e[10],f[10];
ip1 eb[10],fb[10];
if(n==1)
{
Form1->Image1->Canvas->Pen->Width=5;
Form1->Image1->Canvas->Pen->Style=psDashDot;
Form1->Image1->Canvas->Pen->Color=clRed;
Form1->Image1->Canvas->MoveTo(c[0].x,c[0].y);
Form1->Image1->Canvas->LineTo(c[0].x,c[0].y);
}
else if(n==2)
{
if((c[1].x-c[0].x)==0)
{
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(Form1->Image1->Width,d[0].y);
Form1->Image1->Canvas->LineTo(0,d[0].y);
}
else
{
M=(float)(((double)(c[1].y-c[0].y))/((double)(c[1].x-c[0].x)));
if(M==0)
{
Y1=0;
X1=b[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Form1->Image1->Canvas->LineTo(X1,Form1->Image1->Height);
}
else if(M>0)
{
Y1=0;
X1=(Y1-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
X2=0;
Y2=(X2-X1)*(-1/M) Y1;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
else
{
X1=0;
Y1=(X1-d[0].x)*(-1/M) d[0].y;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Y2=999;
X2=(Y2-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
}
}
else
{ for(int t=0;tImage1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(x1,y1);
Form1->Image1->Canvas->LineTo(Form1->Image1->Width,y1);
Form1->Image1->Canvas->LineTo(0,y1);
}
else
{
M=(float)(((double)(g[k].y-h[t].y))/((double)(g[k].x-h[t].x)));
if(M==0)
{ Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(x1,y1);
Form1->Image1->Canvas->LineTo(x1,0);
Form1->Image1->Canvas->MoveTo(x1,y1);
Form1->Image1->Canvas->LineTo(x1,Form1->Image1->Height);
}
else if(M>0)
{
y2=0;
x2=(y2-y1)*(-M) x1;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(x1,y1);
Form1->Image1->Canvas->LineTo(x2,y2);
Form1->Image1->Canvas->MoveTo(x2,y2);
x3=0;
y3=(x3-x2)*(-1/M) y2;
Form1->Image1->Canvas->LineTo(x3,y3);
}
else
{
x2=0;
y2=(x2-x1)*(-1/M) y1;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(x1,y1);
Form1->Image1->Canvas->LineTo(x2,y2);
Form1->Image1->Canvas->MoveTo(x2,y2);
y3=999;
x3=(y3-y1)*(-M) x1;
Form1->Image1->Canvas->LineTo(x3,y3);
}
}
}
}
}
不知是哪出錯了,當點了3個點以上他都是跑出4條水平線,為何如此??煩請各位大大幫我看一下我哪裡出錯了........謝謝
|
流
中階會員
發表:36 回覆:142 積分:70 註冊:2003-07-24
發送簡訊給我
|
goldhero 您好: 小弟複製這篇發言的程式碼,發現根本不能執行,錯誤太多了
在程式中使用 for 迴圈有好幾個錯誤的地方
是複製錯程式碼還是...? 您這樣小弟不知道怎麼除錯
或是您考慮上傳
|
goldhero
一般會員
發表:7 回覆:9 積分:3 註冊:2003-11-30
發送簡訊給我
|
我有拉了一個label,一個Image,一個mainmenu
不知流兄有拉這幾個ㄇ??
因我complier是可以ㄉ
|
mieng
中階會員
發表:12 回覆:97 積分:81 註冊:2003-10-31
發送簡訊給我
|
sorry~~這篇是不小心多post的~
請版主幫忙刪一下~~
thank~~ 發表人 - mieng 於 2003/12/15 11:54:02
|
mieng
中階會員
發表:12 回覆:97 積分:81 註冊:2003-10-31
發送簡訊給我
|
void __fastcall TForm1::RUN1Click(TObject *Sender)
{
int temp,z; //利用bubblesort將各點依序排列
for(int pass=0;passa[t 1].x)
{
temp=a[t].x;
a[t].x=a[t 1].x;
a[t 1].x=temp;
temp=a[t].y;
a[t].y=a[t 1].y;
a[t 1].y=temp;
}
}
}
VD(a,b,C);
}
//--------------------------------------------------------------------------- void VD(ip c[10],ip1 d[10],int n)
{
int k=0;
float X1,Y1,X2,Y2;
ip e[10],f[10];
ip1 eb[10],fb[10];
if(n==1)
{
Form1->Image1->Canvas->Pen->Width=5;
Form1->Image1->Canvas->Pen->Style=psDashDot;
Form1->Image1->Canvas->Pen->Color=clRed;
Form1->Image1->Canvas->MoveTo(c[0].x,c[0].y);
Form1->Image1->Canvas->LineTo(c[0].x,c[0].y);
}
else if(n==2)
{
if((c[1].x-c[0].x)==0)
{
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(Form1->Image1->Width,d[0].y);
Form1->Image1->Canvas->LineTo(0,d[0].y);
}
else
{
M=(float)(((double)(c[1].y-c[0].y))/((double)(c[1].x-c[0].x)));
if(M==0)
{
Y1=0;
X1=b[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Form1->Image1->Canvas->LineTo(X1,Form1->Image1->Height);
}
else if(M>0)
{
Y1=0;
X1=(Y1-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
X2=0;
Y2=(X2-X1)*(-1/M) Y1;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
else
{
X1=0;
Y1=(X1-d[0].x)*(-1/M) d[0].y;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Y2=999;
X2=(Y2-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
}
}
else
{ for(int t=0;t 紅色部份是造成畫出平行線錯誤的地方。
藍色的部份是我覺得您應該重新寫過的地方,
因為畫出來的線只有第一條位置是對的, 學習中請大家多多指導呦~~
☆星霧☆(Mineg Chien WU) 發表人 - mieng 於 2003/12/15 22:29:04
|
流
中階會員
發表:36 回覆:142 積分:70 註冊:2003-07-24
發送簡訊給我
|
goldhero 您好: 小弟懂原因出在哪了...請參考這篇連結
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41948 如果您重新複製這篇文章中的程式碼去執行
大概就知道是發生什麼情形了,沒錯,是 HTML 語法擋掉 < 與 > 的字
造成您 for loop 之後有些 code 不見,所以複製上才出問題
下次記得配合喔,不然遇到小弟這種天兵,過一天才會恍然大悟 祝順心
|
goldhero
一般會員
發表:7 回覆:9 積分:3 註冊:2003-11-30
發送簡訊給我
|
請問mieng兄:
那藍色部分應如何修改??我的想法是把平面上的點分作相同size的兩邊,若點數大於3就繼續分作兩等分,所以我才利用兩個陣列把原來的陣列切成兩等分儲存,想了很多天了,不知我這樣的想法是哪裡錯ㄌ??
|
goldhero
一般會員
發表:7 回覆:9 積分:3 註冊:2003-11-30
發送簡訊給我
|
|
mieng
中階會員
發表:12 回覆:97 積分:81 註冊:2003-10-31
發送簡訊給我
|
struct ip
{
int x;
int y;
int name;
};
struct ip1
{
float x;
float y;
int name;
};
ip a[10];
ip1 b[10];
int i=0,C;
float M;
void VD(ip c[10],ip1 d[10]); //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Image1->Canvas->Pen->Width=5;
Image1->Canvas->Pen->Style=psDashDot;
Image1->Canvas->Pen->Color=clRed;
Image1->Canvas->MoveTo(X,Y);
Image1->Canvas->LineTo(X,Y);
a[i].x=X;
a[i].y=Y;
Label1->Caption="x=" IntToStr(a[i].x) " y=" IntToStr(a[i].y);
i ;//點數
C = (i*(i-1))/2;//總線數
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RUN1Click(TObject *Sender)
{
ip temp,temp0[2];
ip1 temp1[2];
for (int g=0;gtemp0[1].x)
{
temp=temp0[0];
temp0[0]=temp0[1];
temp0[1]=temp;
}
b[0].x=(float)(((double)temp0[0].x (double)temp0[1].x)/2);
b[0].y=(float)(((double)temp0[0].y (double)temp0[1].y)/2);
VD(temp0,b);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Reset1Click(TObject *Sender)
{
Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));
i=0;
}
//--------------------------------------------------------------------------- void VD(ip c[10],ip1 d[10])
{
float X1,Y1,X2,Y2;
if((c[1].x-c[0].x)==0)
{
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(Form1->Image1->Width,d[0].y);
Form1->Image1->Canvas->LineTo(0,d[0].y);
}
else
{
M=(float)(((double)(c[1].y-c[0].y))/((double)(c[1].x-c[0].x)));
if(M==0)
{
Y1=0;
X1=b[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Form1->Image1->Canvas->LineTo(X1,Form1->Image1->Height);
}
else if(M>0)
{
Y1=0;
X1=(Y1-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
X2=0;
Y2=(X2-X1)*(-1/M) Y1;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
else
{
X1=0;
Y1=(X1-d[0].x)*(-1/M) d[0].y;
Form1->Image1->Canvas->Pen->Width=2;
Form1->Image1->Canvas->Pen->Style=psSolid;
Form1->Image1->Canvas->Pen->Color=clBlue;
Form1->Image1->Canvas->MoveTo(d[0].x,d[0].y);
Form1->Image1->Canvas->LineTo(X1,Y1);
Form1->Image1->Canvas->MoveTo(X1,Y1);
Y2=999;
X2=(Y2-d[0].y)*(-M) d[0].x;
Form1->Image1->Canvas->LineTo(X2,Y2);
}
}
}
//-----------------------------------------------------------------------------
依照您的題目,我覺得並不用分等份,直接畫出任兩點間的中垂線就可以了
感覺上您想的太複雜了。
改了滿多的,不知道跟您原本所要的功能是否相同,您測測看喔 學習中請大家多多指導呦~~
☆星霧☆(Mineg Chien WU)
|
goldhero
一般會員
發表:7 回覆:9 積分:3 註冊:2003-11-30
發送簡訊給我
|
謝謝mieng.......
不過因我們ㄉ作業有規定要用Divide-and-Conquer演算法作....
所以這樣的做法不行啦.....^^|||
不過還是謝謝你
|
GGL
資深會員
發表:104 回覆:600 積分:335 註冊:2006-11-05
發送簡訊給我
|
剛剛無意間看到這篇,跟我的作業好像...Voronoi Diagram....
剛好可以參考一下,只是我的還要畫出Delaunay Triangulations....
|
Teresa_Chang
一般會員
發表:41 回覆:42 積分:16 註冊:2004-05-04
發送簡訊給我
|
我最近也在研究voronoi & delaunay,如果大大有寫出來project的話,可以分享給大家嗎?
謝謝
|