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

求中垂線程式不知是哪裡出錯了

答題得分者是:mieng
goldhero
一般會員


發表:7
回覆:9
積分:3
註冊:2003-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-15 01:00:46 IP:218.172.xxx.xxx 未訂閱
最近在寫一個程式,是在平面上任意點出數個點,然後兩兩的點會造出其中垂線, 我寫的程式如下: 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-15 02:30:57 IP:163.23.xxx.xxx 未訂閱
goldhero 您好:    小弟複製這篇發言的程式碼,發現根本不能執行,錯誤太多了 在程式中使用 for 迴圈有好幾個錯誤的地方 是複製錯程式碼還是...?    您這樣小弟不知道怎麼除錯 或是您考慮上傳
goldhero
一般會員


發表:7
回覆:9
積分:3
註冊:2003-11-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-15 10:30:30 IP:218.172.xxx.xxx 未訂閱
我有拉了一個label,一個Image,一個mainmenu 不知流兄有拉這幾個ㄇ?? 因我complier是可以ㄉ
mieng
中階會員


發表:12
回覆:97
積分:81
註冊:2003-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-15 11:47:00 IP:61.60.xxx.xxx 未訂閱
sorry~~這篇是不小心多post的~ 請版主幫忙刪一下~~ thank~~ 發表人 - mieng 於 2003/12/15 11:54:02
mieng
中階會員


發表:12
回覆:97
積分:81
註冊:2003-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-15 11:48:39 IP:61.60.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-15 12:41:14 IP:163.23.xxx.xxx 未訂閱
goldhero 您好:    小弟懂原因出在哪了...請參考這篇連結 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41948    如果您重新複製這篇文章中的程式碼去執行 大概就知道是發生什麼情形了,沒錯,是 HTML 語法擋掉 < 與 > 的字 造成您 for loop 之後有些 code 不見,所以複製上才出問題 下次記得配合喔,不然遇到小弟這種天兵,過一天才會恍然大悟 祝順心
goldhero
一般會員


發表:7
回覆:9
積分:3
註冊:2003-11-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-15 14:53:58 IP:218.172.xxx.xxx 未訂閱
請問mieng兄: 那藍色部分應如何修改??我的想法是把平面上的點分作相同size的兩邊,若點數大於3就繼續分作兩等分,所以我才利用兩個陣列把原來的陣列切成兩等分儲存,想了很多天了,不知我這樣的想法是哪裡錯ㄌ??
goldhero
一般會員


發表:7
回覆:9
積分:3
註冊:2003-11-30

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-15 14:55:22 IP:218.172.xxx.xxx 未訂閱
感謝流兄的熱心幫忙......謝謝
mieng
中階會員


發表:12
回覆:97
積分:81
註冊:2003-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-15 22:21:39 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-16 00:50:02 IP:218.172.xxx.xxx 未訂閱
謝謝mieng....... 不過因我們ㄉ作業有規定要用Divide-and-Conquer演算法作.... 所以這樣的做法不行啦.....^^||| 不過還是謝謝你
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-28 20:39:42 IP:140.118.xxx.xxx 未訂閱
剛剛無意間看到這篇,跟我的作業好像...Voronoi Diagram.... 剛好可以參考一下,只是我的還要畫出Delaunay Triangulations....
Teresa_Chang
一般會員


發表:41
回覆:42
積分:16
註冊:2004-05-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2006-11-21 20:42:33 IP:61.216.xxx.xxx 未訂閱
我最近也在研究voronoi & delaunay,如果大大有寫出來project的話,可以分享給大家嗎?
謝謝
系統時間:2024-05-05 0:43:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!