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

最大內切圓,最小外接圓

尚未結案
790627
一般會員


發表:1
回覆:0
積分:0
註冊:2004-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-20 23:14:48 IP:220.139.xxx.xxx 未訂閱
能否請各問高手前輩們幫幫忙,是否可修改下列程式修改為最大內切圓及最小外接圓呢????感謝,感謝,再感謝... //---------------------------------------------------------------------------    #include  #include #include <math.h> #include #include #include #pragma hdrstop #include "Unit1.h" #define N 2000 //最大處理點數2000-1 //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; struct Point2P { double r; double a; }; struct Point2G { double x; double y; }; Point2P P1[N]; Point2G P[N]; double error_z[N]; double error_z1[N]; double zero_x=450,zero_y=280; int n[1]={0};//儲存點數之陣列,設定初值為0 double a,b,c,R=0; double error=0; /* 將指定檔案中之數據點與點數讀進陣列 */ /* 數據點座標 P[].r , P[].a 點數 n[0] */ void data_xy(char filename[20]) { FILE *file; int i; int m=1; for(i=0;i<=N-1;i )//將陣列啟始化(清空) { P[i].x=NULL;P[i].y=NULL; } file = fopen( filename, "r" ); while(m!=0) { fscanf( file, "%lf %lf\n",&P[m].x,&P[m].y); if(P[m].x==NULL && P[m].y==NULL) { n[0]=m-1; m=0; } else { m=m 1; } } fclose( file ); } /*氣泡排序法求誤差之極大值與極小值*/ /*輸入y[n],極大值y1[n],極小值y1[1]*/ void bubble(double *y,double *y1,int n) { double c; int i,j; for(i=1;i<=n;i ) { y1[i]=y[i]; } for(i=1;i<=n;i ) { for(j=n;j>=i 1;j--) { if(y1[j-1]>y1[j]) { c=y1[j-1]; y1[j-1]=y1[j]; y1[j]=c; } } } } /*以最小平方法解出真圓度(克拉瑪法則解係數a,b,c*/ void roundness() { double x11=0,x12=0,x13=0,x21=0,x22=0,x23=0 ,x31=0,x32=0,x33=0,y11=0,y21=0,y31=0,del=0; double pra=0,prb=0,prc=0; int i,m; for(i=1;i<=n[0];i ) { x11 =P[i].x*P[i].x; x12 =P[i].x*P[i].y; x13 =P[i].x; x21=x12; x22 =P[i].y*P[i].y; x23 =P[i].y; x31=x13; x32=x23; x33 =1; y11 =(-(P[i].x*P[i].x P[i].y*P[i].y))*P[i].x; y21 =(-(P[i].x*P[i].x P[i].y*P[i].y))*P[i].y; y31 =(-(P[i].x*P[i].x P[i].y*P[i].y)); } del=x11*x22*x33 x12*x23*x31 x13*x21*x32 -x13*x22*x31-x21*x12*x33-x11*x23*x32; pra=y11*x22*x33 x12*x23*y31 x13*y21*x32 -x13*x22*y31-y21*x12*x33-y11*x23*x32; prb=x11*y21*x33 y11*x23*x31 x13*x21*y31 -x13*y21*x31-x21*y11*x33-x11*x23*y31; prc=x11*x22*y31 x12*y21*x31 y11*x21*x32 -y11*x22*x31-x21*x12*y31-x11*y21*x32; a=pra/del; b=prb/del; c=prc/del; for(i=1;i<=n[0];i ) { error_z[i]=sqrt((P[i].x a/2.0)*(P[i].x a/2.0) (P[i].y b/2.0)*(P[i].y b/2.0))-1.0/2.0*sqrt(a*a b*b-4.0*c); } m=n[0]; bubble(error_z,error_z1,m); error=error_z1[m]-error_z1[1]; for(i=1;i<=n[0];i ) { R=sqrt((P[i].x a/2.0)*(P[i].x a/2.0) (P[i].y b/2.0)*(P[i].y b/2.0)); P1[i].a=acos((P[i].x a/2.0)/R); if((P[i].y-b/2.0)>=0) P1[i].a=P1[i].a; else if((P[i].y-b/2.0)<=0) P1[i].a=2*M_PI-P1[i].a; } } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormActivate(TObject *Sender) { FilterComboBox1->Filter="真直度數據檔(*.crg)|*.crg"; } //--------------------------------------------------------------------------- void __fastcall TForm1::FilterComboBox1Change(TObject *Sender) { FileListBox1->Mask=FilterComboBox1->Mask; } //--------------------------------------------------------------------------- void __fastcall TForm1::FileListBox1Change(TObject *Sender) { String file_name; char name[30]; file_name=FileListBox1->FileName; Edit1->Text=file_name; if(file_name != "") { strcpy(name,file_name.c_str()); data_xy(name); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { double k=0; int m; int i=0; double px,py,px1,py1; m=n[0]; if(m!=0) { roundness(); k=50/error_z1[m]; Canvas->Pen->Color=clBtnFace; Canvas->Rectangle(180,0, 800,600); Canvas->Pen->Color=clRed; Canvas->Ellipse(zero_x-150-error_z1[m]*k,zero_y-150-error_z1[m]*k, zero_x 150 error_z1[m]*k,zero_y 150 error_z1[m]*k); Canvas->Pen->Color=clBlue; Canvas->Ellipse(zero_x-150,zero_y-150,zero_x 150,zero_y 150); Canvas->Pen->Color=clRed; Canvas->Ellipse(zero_x-150-error_z1[1]*k,zero_y-150-error_z1[1]*k, zero_x 150 error_z1[1]*k,zero_y 150 error_z1[1]*k); Canvas->Pen->Color=clSkyBlue; Canvas->MoveTo(zero_x-220,zero_y); Canvas->LineTo(zero_x 220,zero_y); Canvas->MoveTo(zero_x,zero_y-220); Canvas->LineTo(zero_x,zero_y 220); px1=(150 error_z[1]*k)*cos(P1[1].a); py1=(150 error_z[1]*k)*sin(P1[1].a); Canvas->MoveTo(zero_x px1,zero_y py1); Canvas->Pen->Color=clBlack; for(i=2;i<=m-1;i ) { px=(150 error_z[i]*k)*cos(P1[i].a); py=(150 error_z[i]*k)*sin(P1[i].a); Canvas->LineTo(zero_x px,zero_y py); } Canvas->LineTo(zero_x px1,zero_y py1); Canvas->Pen->Color=clBlue; Edit2->Text=FloatToStrF(a,8,8,6); Edit3->Text=FloatToStrF(b,8,8,6); Edit4->Text=FloatToStrF(c,8,8,6); Edit5->Text=FloatToStrF(error,8,8,6); Edit6->Text=IntToStr(m); Edit7->Text=FloatToStrF(R,8,8,6); } else Application->MessageBox("請先選取檔案","",MB_OK); } //---------------------------------------------------------------------------
系統時間:2024-06-28 2:13:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!