⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xkdlg.cpp

📁 一个数控机床的切割模拟程序。有多种模拟方式。如逐点比较
💻 CPP
字号:
// XKDlg.cpp : implementation file
//

#include "stdafx.h"
#include "XK.h"
#include "XKDlg.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXKDlg dialog

CXKDlg::CXKDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CXKDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CXKDlg)
	m_kselect = 0;
	m_rselect = 0;
	m_qx = 20.0f;
	m_qy = 20.0f;
	m_ex = 40.0f;
	m_ey = 50.0f;
	m_r = 30.0f;
	m_bj = 0.4f;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	
}

void CXKDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CXKDlg)
	DDX_Control(pDX, IDC_EDIT6, m_Cr);
	DDX_Radio(pDX, IDC_RADIO1, m_kselect);
	DDX_Radio(pDX, IDC_RADIO3, m_rselect);
	DDX_Text(pDX, IDC_EDIT2, m_qx);
	DDX_Text(pDX, IDC_EDIT3, m_qy);
	DDX_Text(pDX, IDC_EDIT4, m_ex);
	DDX_Text(pDX, IDC_EDIT5, m_ey);
	DDX_Text(pDX, IDC_EDIT6, m_r);
	DDX_Text(pDX, IDC_EDIT7, m_bj);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CXKDlg, CDialog)
	//{{AFX_MSG_MAP(CXKDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTONYX, OnButtonyx)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_WM_DRAWITEM()
	ON_BN_CLICKED(IDC_BUTTONSX, OnButtonsx)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXKDlg message handlers

BOOL CXKDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	m_Cr.EnableWindow(false);

	
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CXKDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 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 CXKDlg::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();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CXKDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CXKDlg::OnButtonyx() 
{
	// TODO: Add your control notification handler code here

	CClientDC dc(this);
	CString str;

	CPen penr;
	penr.CreatePen(PS_SOLID,2,RGB(255,0,0));

	CPen peng;
	peng.CreatePen(PS_SOLID,1,RGB(255,255,255));

	UpdateData(true);

	if(m_qx>95||m_qy>90||m_ex>95||m_ey>90){
		MessageBox("图形超出画图区域,请不要超过90mm","警告",MB_ICONINFORMATION);
		return;
	}

	int x0=320;
	int y0=286;

	int qx=3*int(m_qx);//起点x坐标
	int qy=3*int(m_qy);//起点y坐标
	int ex=3*int(m_ex);//终点x坐标
	int ey=3*int(m_ey);//终点y坐标
	int r=3*int(m_r);//半径

	int bj=int(7*m_bj);//步距

	float xl;
	xl=(m_ey-m_qy)/(m_ex-m_qx);//直线的斜率

	float lo=sqrt((ex-qx)*(ex-qx)+(ey-qy)*(ey-qy));//直线的长度

	int x=0;
	int y=0;
	int i=1;

	int n=int((ex-qx)/bj);//插补的次数

	CRect surect;
	CPoint sp1,sp2;

	if(m_kselect==0){//逐点比较法

		if(m_rselect==0){//插补直线

			dc.SelectObject(&penr);
			dc.MoveTo(x0+qx,y0-qy);
			dc.LineTo(x0+ex,y0-ey);
			
			dc.SelectObject(&peng);
			x=qx+1;
			y=qy+1;
			
			dc.MoveTo(x0+x,y0-y);
			x=x+bj;
			dc.LineTo(x0+x,y0-y);
			
			while(i<n){
				
				if((y-qy)>int(xl*(x-qx))){
					x=x+bj;
					dc.LineTo(x0+x,y0-y);
					i++;
				}
				else if((y-qy)<=int(xl*(x-qx))){
					y=y+bj;
					dc.LineTo(x0+x,y0-y);
				}			
			}
			
			
			
		}
		
		else if(m_rselect==1){//插补圆弧
			
			float j1=atanf(xl);
			float j2=acosf(0.5*lo/r);
			float j3=j2-j1;
			
			int ox=int(qx+r*cosf(j3));
			int oy=int(qy-r*sinf(j3));
			
			dc.SelectObject(&penr);
			surect.SetRect(x0+ox-r,y0-oy-r,x0+ox+r,y0-oy+r);
			sp1.x=x0+qx;
			sp1.y=y0-qy;
			sp2.x=x0+ex;
			sp2.y=y0-ey;
			dc.Arc(surect,sp2,sp1);
			
			dc.MoveTo(x0+ox-5,y0-oy);
			dc.LineTo(x0+ox+6,y0-oy);
			dc.MoveTo(x0+ox,y0-oy-5);
			dc.LineTo(x0+ox,y0-oy+5);
						
			dc.SelectObject(&peng);
			
			x=qx+1;
			y=qy+1;
			
			dc.MoveTo(x0+x,y0-y);
			y=y+bj;
			dc.LineTo(x0+x,y0-y);
			i=0;
			while(i<=n){
				
				if(y<=oy&&x<=ox){//第三象限
					
					if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
						y=y+bj;
						dc.LineTo(x0+x,y0-y);					
					}
					else{
						x=x-bj;
						dc.LineTo(x0+x,y0-y);
						i--;
					}
				}
				
				else if(y>=oy&&x<=ox){//第二象限
					
					if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}
					else{
						y=y+bj;
						dc.LineTo(x0+x,y0-y);
					}
				}
				
				else if(y>=oy&&x>=ox){//第一象限
					
					if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
					}
					else{
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}
				}
				
				else{//第四象限
					
					if((y-oy)*(y-oy)>=r*r-(x-ox)*(x-ox)){
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}
					else{
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
					}
				}
			}

			
		}	
	}

	float f1,f2,f3;
	float temp=0;

	if(m_kselect==1){//改进逐点比较法

		if(m_rselect==0){//插补直线

			dc.SelectObject(&penr);
			dc.MoveTo(x0+qx,y0-qy);
			dc.LineTo(x0+ex,y0-ey);
			
			dc.SelectObject(&peng);
			x=qx;
			y=qy;
			
			dc.MoveTo(x0+x,y0-y);
			x=x+bj;
			dc.LineTo(x0+x,y0-y);
			
			

			i=1;

			while(i<n){

				f1=fabs(xl*(x+bj-qx)+qy-y);
				f2=fabs(y+bj-(xl*(x-qx)+qy));
				f3=fabs(y+bj-(xl*(x+bj-qx)+qy));

				if(f1<=f2)
					temp=f1;
				else 
					temp=f2;

				if(f3<=temp)
					temp=f3;

				if(temp==f1){
					x=x+bj;
					dc.LineTo(x0+x,y0-y);
					i++;
				}
				else if(temp==f2){
					y=y+bj;
					dc.LineTo(x0+x,y0-y);
				}
				else if(temp==f3){
					x=x+bj;
					y=y+bj;
					dc.LineTo(x0+x,y0-y);
					i++;
				}

			}
		
		}

		else if(m_rselect==1){//插补圆弧
			
			float j1=atanf(xl);
			float j2=acosf(0.5*lo/r);
			float j3=j2-j1;
			
			int ox=int(qx+r*cosf(j3));
			int oy=int(qy-r*sinf(j3));

			dc.SelectObject(&penr);
			surect.SetRect(x0+ox-r,y0-oy-r,x0+ox+r,y0-oy+r);
			sp1.x=x0+qx;
			sp1.y=y0-qy;
			sp2.x=x0+ex;
			sp2.y=y0-ey;
			dc.Arc(surect,sp2,sp1);
			
		
			dc.MoveTo(x0+ox-5,y0-oy);
			dc.LineTo(x0+ox+6,y0-oy);
			dc.MoveTo(x0+ox,y0-oy-5);
			dc.LineTo(x0+ox,y0-oy+5);
						
			dc.SelectObject(&peng);
			
			x=qx+1;
			y=qy+1;
			
			dc.MoveTo(x0+x,y0-y);
			y=y+bj;
			dc.LineTo(x0+x,y0-y);
			i=0;
			while(i<=n){
				
				if(y<=oy&&x<=ox){//第三象限

					f1=fabs((y-oy)*(y-oy)+(x-bj-ox)*(x-bj-ox)-r*r);
					f2=fabs((y+bj-oy)*(y+bj-oy)+(x-ox)*(x-ox)-r*r);
					f3=fabs((y+bj-oy)*(y+bj-oy)+(x-bj-ox)*(x-bj-ox)-r*r);

					if(f1<=f2)
						temp=f1;
					else 
						temp=f2;
					if(f3<temp)
						temp=f3;

					
					if(temp==f1){
						x=x-bj;
						dc.LineTo(x0+x,y0-y);
						i--;
											
					}
					else if(temp==f2){
						y=y+bj;
						dc.LineTo(x0+x,y0-y);
					}
					else if(temp==f3){
						x=x-bj;
						y=y+bj;
						dc.LineTo(x0+x,y0-y);
						i--;
					}

				}
				
				else if(y>=oy&&x<=ox){//第二象限

					f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
					f2=fabs((y+bj-oy)*(y+bj-oy)+(x-ox)*(x-ox)-r*r);
					f3=fabs((y+bj-oy)*(y+bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);

					if(f1<=f2)
						temp=f1;
					else 
						temp=f2;
					if(f3<temp)
						temp=f3;


					
					if(temp==f1){
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}
					else if(temp==f2){
						y=y+bj;
						dc.LineTo(x0+x,y0-y);
					}
					else if(temp==f3){
						x=x+bj;
						y=y+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}

				}
				
				else if(y>=oy&&x>=ox){//第一象限

					f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
					f2=fabs((y-bj-oy)*(y-bj-oy)+(x-ox)*(x-ox)-r*r);
					f3=fabs((y-bj-oy)*(y-bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);

					if(f1<=f2)
						temp=f1;
					else 
						temp=f2;
					if(f3<temp)
						temp=f3;
				
					if(temp==f1){
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
						
					}
					else if(temp==f2){
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
						
					}
					else{
						x=x+bj;
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}

				}
				
				else{//第四象限

					f1=fabs((y-oy)*(y-oy)+(x+bj-ox)*(x+bj-ox)-r*r);
					f2=fabs((y-bj-oy)*(y-bj-oy)+(x-ox)*(x-ox)-r*r);
					f3=fabs((y-bj-oy)*(y-bj-oy)+(x+bj-ox)*(x+bj-ox)-r*r);

					if(f1<=f2)
						temp=f1;
					else 
						temp=f2;
					if(f3<temp)
						temp=f3;

					
					if(temp==f1){
						x=x+bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}
					else if(temp==f2){
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
					}
					else{
						x=x+bj;
						y=y-bj;
						dc.LineTo(x0+x,y0-y);
						i++;
					}

				}
			}

			
		}	

	}
	
}

void CXKDlg::OnRadio3() 
{
	// TODO: Add your control notification handler code here
	m_Cr.EnableWindow(false);
	
}

void CXKDlg::OnRadio4() 
{
	// TODO: Add your control notification handler code here
	m_Cr.EnableWindow(true);
	
}

void CXKDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	// TODO: Add your message handler code here and/or call default
	
	
	
	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

void CXKDlg::OnButtonsx() 
{
	// TODO: Add your control notification handler code here
	Invalidate(true);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -