能否請各問高手前輩們幫幫忙,是否可修改下列程式修改為最大內切圓及最小外接圓呢????感謝,感謝,再感謝...
//--------------------------------------------------------------------------- #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);
}
//---------------------------------------------------------------------------