实例介绍
【实例截图】
【核心代码】
// C_EDlg.cpp : implementation file // #include "stdafx.h" #include "C_E.h" #include "C_EDlg.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define pi 3.14159265358979 struct FXY{double x,y;}; int all_gauss( int n, double *a, double *b); ///////////////////////////////////////////////////////////////////////////// // CC_EDlg dialog CC_EDlg::CC_EDlg(CWnd* pParent /*=NULL*/) : CDialog(CC_EDlg::IDD, pParent) { //{{AFX_DATA_INIT(CC_EDlg) m_xc = 0.0f; m_a = 0.0f; m_b = 0.0f; m_yc = 0.0f; m_bt = 0.0f; //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CC_EDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CC_EDlg) DDX_Control(pDX, IDC_LIST1, m_lst); DDX_Text(pDX, IDC_EDIT1, m_xc); DDX_Text(pDX, IDC_EDIT3, m_a); DDX_Text(pDX, IDC_EDIT4, m_b); DDX_Text(pDX, IDC_EDIT2, m_yc); DDX_Text(pDX, IDC_EDIT5, m_bt); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CC_EDlg, CDialog) //{{AFX_MSG_MAP(CC_EDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, OnButton1) ON_BN_CLICKED(IDC_BUTTON2, OnButton2) ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2) ON_EN_CHANGE(IDC_EDIT3, OnChangeEdit3) ON_EN_CHANGE(IDC_EDIT4, OnChangeEdit4) ON_EN_CHANGE(IDC_EDIT5, OnChangeEdit5) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CC_EDlg message handlers BOOL CC_EDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_xc=m_yc=m_bt=0.; m_a=m_b=100.;UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CC_EDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon 1) / 2; int y = (rect.Height() - cyIcon 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } HCURSOR CC_EDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CC_EDlg::OnButton1() { // TODO: Add your control notification handler code here int i,j,k,ret; double r,xc,yc,x,y,z; double af; char st[80]; FXY xy[360]; r=m_a;xc=m_xc,yc=m_yc; m_lst.ResetContent(); sprintf(st,"r=%9.4f xc=%9.4f yc=%9.4f",r,xc,yc);m_lst.AddString(st); m_lst.AddString(""); for(k=0;k<360;k ) { af=k*pi/180.; xy[k].x=xc r*cos(af); xy[k].y=yc r*sin(af); sprintf(st,"k=%3d %9.4f %9.4f",k,xy[k].x,xy[k].y);m_lst.AddString(st); } m_lst.AddString(""); //----------------------- double *XX=(double *)new double[12]; FillMemory(XX,sizeof(double)*12,0); for(k=0;k<360;k ) { x=xy[k].x;y=xy[k].y;z=x*x y*y; XX[0] =x*x;XX[4] =y*y;XX[8] =1; XX[1] =x*y;XX[2] =x;XX[5] =y; XX[9] =x*z;XX[10] =y*z;XX[11] =z; } XX[3]=XX[1];XX[6]=XX[2];XX[7]=XX[5]; ret=all_gauss(3,XX,&XX[9]); if(ret==0)return; //x0=XX[9]/2.;y0=XX[10]/2.; c=XX[11]=>r0*r0=c x0*x0 y0*y0 sprintf(st,"%9.4f %9.4f %9.4f",XX[9],XX[10],XX[11]);m_lst.AddString(st); xc=XX[9]/2.;yc=XX[10]/2.; // r=sqrt(XX[11]-x*x-y*y); r=sqrt(XX[9]*XX[9] XX[10]*XX[10] 4*XX[11])/2.; sprintf(st,"xc=%9.4f yc=%9.4f r0=%9.4f",xc,yc,r);m_lst.AddString(st); delete [] XX; } int all_gauss( int n, double *a, double *b) { int l,k,i,j,is,p,q;//js 用于记忆列交换信息的空间 double d,t; int *js = (int *) new int[n]; l = 1 ; for(k=0; k<n-1; k ) { d = 0.0; for(i=k; i<n; i )for(j=k; j<n; j ) { t = fabs(*(a i*n j)); if(t>d){ d = t; js[k] = j; is = i;} } //选主元 if(d 1.0==1.0){return 0;} //奇异标志 else { if(js[k]!=k) for(i=0; i<n; i ) { //列交换 p = k; q = js[k]; t = *(a i*n p); *(a i*n p)=*(a i*n q); *(a i*n q)=t; } if(is!=k) { for(j=k; j<n; j )//行交换 { t = *(a k*n j); *(a k*n j)=*(a is*n j); *(a is*n j) = t; } t = b[k]; b[k] = b[is]; b[is] = t; } } d = *(a k*n k); for(j=k 1; j<n; j ) { *(a k*n j) /= d ; } b[k]/=d; for(i=k 1; i<n; i ) { //消元 for(j=k 1; j<n; j ) { p = j; *(a i*n p)-= (*(a i*n k)) * (*(a k*n j)); } b[i] -= (*(a i*n k))*b[k]; } } d =*(a (n-1)*n n-1); if(fabs(d) 1.0==1.0){delete [] js;return 0;} b[n-1]/=d; for(i=n-2; i>=0; i--) { t = 0.0; for(j=i 1; j<n; j ) t = *(a i*n j)*b[j]; b[i] -= t; } js[n-1] = n-1; for(k=n-1; k>=0; k--)if(js[k]!=k) { t = b[k]; b[k] = b[js[k]]; b[js[k]] = t; //恢复解向量 } delete [] js; return 1; } // all_gauss void CC_EDlg::OnButton2() { // TODO: Add your control notification handler code here double xc,yc,a,b; double x,y,r,af,bt; double A,B,C,D,E,F,G; int i,j,k,h2,w2,i0,j0; RECT rct2; char st[80]; FXY p9,xy[360]; long hw; xc=m_xc;yc=m_yc; a=m_a;b=m_b; bt=m_bt*pi/180.; m_lst.ResetContent(); sprintf(st,"xc=%9.4f yc=%9.4f bt=%9.4f %9.4f°",xc,yc,bt,bt*180/pi);m_lst.AddString(st); sprintf(st,"a=%9.4f b=%9.4f",a,b);m_lst.AddString(st); for(k=0;k<360;k ){af=k*pi/180.;xy[k].x=a*cos(af);xy[k].y=b*sin(af);} for(k=0;k<360;k ) { x=xy[k].x;y=xy[k].y;r=sqrt(x*x y*y); af=asin(y/r);if(x<0.)af=pi-af; xy[k].x=r*cos(af-bt) xc;xy[k].y=r*sin(af-bt) yc; } for(k=0;k<360;k ){sprintf(st,"%3d %9.4f %9.4f",k,xy[k].x,xy[k].y);m_lst.AddString(st);} //拟合 double U,V,W,X,Y,Z,z,xx,yy,Xy,Q,C2,C4; int ret; double *XX=(double *)new double[30]; FillMemory(XX,sizeof(double)*30,0); for(k=0;k<360;k ) { xx=xy[k].x*xy[k].x; Xy=xy[k].x*xy[k].y; yy=xy[k].y*xy[k].y; x=xy[k].x; y=xy[k].y; z=-xx; XX[0] =yy*yy; XX[6] =Xy*Xy; XX[12] =xx; XX[18] =yy; XX[24] =1; XX[1] =yy*Xy; XX[2] =yy*x; XX[3] =yy*y; XX[4] =yy; XX[7] =Xy*x; XX[8] =Xy*y; XX[9] =Xy; XX[13] =Xy; XX[14] =x; XX[19] =y; XX[25] =yy*z; XX[26] =Xy*z; XX[27] =x*z; XX[28] =y*z; XX[29] =z; } //对称 XX[5]=XX[1]; XX[10]=XX[2]; XX[11]=XX[7]; XX[15]=XX[3]; XX[16]=XX[8]; XX[17]=XX[13]; XX[20]=XX[4]; XX[21]=XX[9]; XX[22]=XX[14]; XX[23]=XX[19]; ret=all_gauss(5,XX,&XX[25]); if(ret==0){SetWindowText("all_gauss fail!");return;} sprintf(st,"%9.4f %9.4f %9.4f %9.4f %9.4f",XX[25],XX[26],XX[27],XX[28],XX[29]);m_lst.AddString(st); // X=-W*yc-2*xc // Y=-2*V*yc-W*xc // 2*Y/W=-4*V/W*yc-2*xc //2*Y/W-X=(W-4*V/W)*yc //(W-4*V/W)*yc=2*Y/W-X //yc=(2*Y/W-X)/(W-4*V/W) yc=(2*XX[28]/XX[26]-XX[27])/(XX[26]-4*XX[25]/XX[26]); xc=(-XX[26]*yc-XX[27])/2.; sprintf(st,"xc=%9.4f yc=%9.4f",xc,yc);m_lst.AddString(st); Q=(1.-XX[25])/XX[26]; C=Q sqrt(Q*Q 1.);bt=atan(C); sprintf(st,"bt=%9.4f°",bt*180/pi);m_lst.AddString(st); U=1./(xc*xc XX[25]*yc*yc XX[26]*xc*yc-XX[29]); sprintf(st,"U=%15.12f C=%9.4f",U,C);m_lst.AddString(st); V=XX[25]*U; W=XX[26]*U; X=XX[27]*U; Y=XX[28]*U; Z=XX[29]*U-1; // sprintf(st,"%15.12f %15.12f %15.12f",U,V,W);m_lst.AddString(st); // sprintf(st,"%15.12f %15.12f %15.12f",X,Y,Z);m_lst.AddString(st); C2=C*C; C4=C2*C2; A=sqrt((U-C2*V)/(1.-C4)); B=sqrt((V-C2*U)/(1.-C4)); sprintf(st,"A=%9.6f B=%9.6f",A,B);m_lst.AddString(st); a=cos(bt)/A; b=cos(bt)/B; sprintf(st,"a=%9.4f b=%9.4f",a,b);m_lst.AddString(st); delete [] XX; } void CC_EDlg::OnChangeEdit1() {UpdateData(true);} void CC_EDlg::OnChangeEdit2() {UpdateData(true);} void CC_EDlg::OnChangeEdit3() {UpdateData(true);} void CC_EDlg::OnChangeEdit4() {UpdateData(true);} void CC_EDlg::OnChangeEdit5() {UpdateData(true);}
标签: 椭圆拟合算法
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论