这个刀补插补程序设计是我之前自己的毕业设计,主要是基于固高数控工作台,进行四象限及跨象限的刀补插补(逐点比较法和数字积分法)的程序设计,利用MFC进行刀补插补的效果模拟。最后的效果还是非常好的,随着给定的脉冲当量越小,刀补插补的误差也越小。


// 毕业设计Dlg.cpp : implementation file
//#include "stdafx.h"
#include "毕业设计.h"
#include "毕业设计Dlg.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#define Time 300  //插补延迟的时间
#define Minnum 0.0000001//精度补偿
int ZuoBiaobl = 1;//为了存取当前坐标倍率
int sgn_r;//判断左右刀补
int ShunNi;//判断顺逆
int ShunNi2;//圆弧接圆弧第二段顺逆判断
int jianli = 0;//刀补建立
int jinxing = 0;//刀补进行
int chexiao = 0;//刀补撤消
int yuanxin = 1;//计算出两个圆心的取舍
int yuanxin2 = 1;//圆弧接圆弧第二段圆心的取舍
double Xs[50] = { 0 };//存转接点横坐标
double Ys[50] = { 0 };//存转接点纵坐标
int ZhixianOrYuanhu[100] = { 0 };//存相邻两个转接点之间连接方式(直线或是圆弧,直线记为1,圆弧记为-1)
static int i = 0;//转接点序号
static int j = 0;//转接连接方式序号
//(转接连接方式序号比转接点序号多一个,不过为了方面插补,要在第一个转接点之前加一个进刀点,在最后一个转接点后面加一个退刀点)
//  这导致转接点序号比转接连接方式序号多一个
double Xyuanhu[50] = { 0 };//存转接时计算出来的圆心横坐标
double Yyuanhu[50] = { 0 };//存转接时计算出来的圆心纵坐标
double Ryuanhu[50] = { 0 };//存转接时计算出来的圆的半径,顺圆记为正,逆圆记为负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_MSGDECLARE_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()/
// CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent)
{//{{AFX_DATA_INIT(CMyDlg)r1 = 0.0;r2 = 0.0;x0 = 0.0;x1 = 0.0;x2 = 0.0;y0 = 0.0;y1 = 0.0;y2 = 0.0;r = 0.0;Delta = 0.0;N = 0;step = 0.0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMyDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)DDX_Control(pDX, IDC_COMBO, m_ComboBox);DDX_Text(pDX, IDC_R1, r1);DDX_Text(pDX, IDC_R2, r2);DDX_Text(pDX, IDC_X0, x0);DDX_Text(pDX, IDC_X1, x1);DDX_Text(pDX, IDC_X2, x2);DDX_Text(pDX, IDC_Y0, y0);DDX_Text(pDX, IDC_Y1, y1);DDX_Text(pDX, IDC_Y2, y2);DDX_Text(pDX, IDC_Daojubanjing, r);DDX_Text(pDX, IDC_Delta, Delta);DDX_Text(pDX, IDC_JiCunQi, N);DDX_Text(pDX, IDC_BuChang, step);//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_Jianlizuobiaoxi, OnZuobiaoxi)ON_CBN_SELCHANGE(IDC_COMBO, OnSelchangeCombo)ON_BN_CLICKED(IDC_Zuodaobu, OnZuodaobu)ON_BN_CLICKED(IDC_Youdaobu, OnYoudaobu)ON_BN_CLICKED(IDC_Daojubanjingbuchang, OnDaojubanjingbuchang)ON_BN_CLICKED(IDC_Shunyuan, OnShunyuan)ON_BN_CLICKED(IDC_Niyuan, OnNiyuan)ON_BN_CLICKED(IDC_Zhaoyuanxin, OnZhaoyuanxin)ON_WM_CTLCOLOR()ON_BN_CLICKED(IDC_Daobujianli, OnDaobujianli)ON_BN_CLICKED(IDC_Daobujinxing, OnDaobujinxing)ON_BN_CLICKED(IDC_Daobuchexiao, OnDaobuchexiao)ON_BN_CLICKED(IDC_Shunyuan2, OnShunyuan2)ON_BN_CLICKED(IDC_Niyuan2, OnNiyuan2)ON_BN_CLICKED(IDC_Zhaoyuanxin2, OnZhaoyuanxin2)ON_BN_CLICKED(IDC_Zhudianbijiaofa, OnZhudianbijiaofa)ON_BN_CLICKED(IDC_ShuZiJiFenFa, OnShuZiJiFenFa)//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CMyDlg message handlersBOOL CMyDlg::OnInitDialog()
{CDialog::OnInitDialog();pWnd = GetDlgItem(IDC_MYSTATIC); //指向画坐标的区域// 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 dialogSetIcon(m_hIcon, TRUE);            // Set big iconSetIcon(m_hIcon, FALSE);     // Set small icon// TODO: Add extra initialization herereturn TRUE;  // return TRUE  unless you set the focus to a control
}void CMyDlg::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 CMyDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM)dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.DrawIcon(x, y, m_hIcon);}else{//CDialog::OnPaint();CPaintDC   dc(this);CRect   rect;GetClientRect(&rect);CDC   dcMem;   //定义一个工具箱(设备上下文) dcMem.CreateCompatibleDC(&dc);  //建立关联DC   CBitmap   bmpBackground; //位图对象bmpBackground.LoadBitmap(IDB_BITMAP2);    //IDB_BITMAP2是你自己的图对应的ID   BITMAP   bitmap;bmpBackground.GetBitmap(&bitmap);   //建立绑定关系  CBitmap   *pbmpOld = dcMem.SelectObject(&bmpBackground);   //保存原有CDC对象,并选入新CDC对象入DC dc.SetStretchBltMode(COLORONCOLOR);//防止bmp图片失真  dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);}
}HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: Change any attributes of the DC here// TODO: Return a different brush if the default is not desired/*if(pWnd->GetDlgCtrlID()==IDC_STATIC)//如果是静态编辑框{pDC->SetTextColor(RGB(0,0,0));//修改字体的颜色pDC->SetBkMode(TRANSPARENT);//把字体的背景变成透明的CFont font;font.CreatePointFont(100,"黑体");pDC->SelectObject(&font);//设置字体return   HBRUSH(GetStockObject(HOLLOW_BRUSH));//返回背景色}*/if (nCtlColor == CTLCOLOR_STATIC){pDC->SetBkMode(TRANSPARENT);   //设置背景透明   pDC->SetTextColor(RGB(0, 0, 0)); //设置字体为黑色return   HBRUSH(GetStockObject(HOLLOW_BRUSH));//返回背景色}return hbr;
}// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{return (HCURSOR)m_hIcon;
}/********坐标系倍率选择*************/
void CMyDlg::OnSelchangeCombo()
{// TODO: Add your control notification handler code hereint nChoice = m_ComboBox.GetCurSel();//获得当前选项的索引switch (nChoice){case(0):ZuoBiaobl = 1;break;case 1:ZuoBiaobl = 10;break;case 2:ZuoBiaobl = 100;break;}
}/************画坐标系**************/
void CMyDlg::OnZuobiaoxi()
{// TODO: Add your control notification handler code hereCPaintDC dc(this);CString str;int i;pWnd->Invalidate();pWnd->UpdateWindow();//更新窗口CDC *pDC = pWnd->GetDC();//获取当前窗口的类对象指针pDC->Rectangle(0, 0, 800, 700);//画一个矩形框CPen *pPenRed = new CPen();//创建画笔对象pPenRed->CreatePen(PS_SOLID, 3, RGB(0, 0, 0));//黑色画笔CPen *pPen = NULL;CGdiObject *pOldPen = pDC->SelectObject(pPenRed);pDC->SetMapMode(MM_ANISOTROPIC);// 设置映射模式pDC->SetViewportOrg(800 / 2, 700 / 2);//映射后坐标系原点pDC->SetViewportExt(800, 700);//映射后坐标系终点pDC->SetWindowOrg(0, 0);//原来坐标系的原点pDC->SetWindowExt(1000, -1000);//原来坐标系的终点,但y轴方向取反pDC->MoveTo(0, -450);pDC->LineTo(0, 450);pDC->LineTo(-6, 445);pDC->MoveTo(0, 450);pDC->LineTo(6, 445);pDC->MoveTo(-450, 0);pDC->LineTo(450, 0);pDC->LineTo(445, 6);pDC->MoveTo(450, 0);pDC->LineTo(445, -6);pDC->MoveTo(0, 0);//写x轴正刻度for (i = 0;i <= 10;i++){str.Format("%d", i*ZuoBiaobl);pDC->TextOut(40.0 * i - 4, -1, str);  //-4,-1是为了是刻度和数字上下对齐//绘制x轴刻度pDC->MoveTo(40.0 * i, 0);pDC->LineTo(40.0 * i, 5);   //坐标轴上刻度的高度为5}//写x轴负刻度for (i = -1;i >= -10;i--){str.Format("%d", i*ZuoBiaobl);pDC->TextOut(40.0 * i - 8, -1, str);//绘制x轴刻度pDC->MoveTo(40.0 * i, 0);pDC->LineTo(40.0 * i, 5);}//写y轴正刻度for (i = 1;i <= 10;i++){str.Format("%d", i*ZuoBiaobl);pDC->TextOut(-30, 40.0 * i + 8, str);//绘制y轴刻度pDC->MoveTo(0, 40.0 * i);pDC->LineTo(-5, 40.0 * i);}//写y轴负刻度for (i = -1;i >= -10;i--){str.Format("%d", i*ZuoBiaobl);pDC->TextOut(-35, 40.0 * i + 8, str);//绘制y轴刻度pDC->MoveTo(0, 40.0 * i);pDC->LineTo(-5, 40.0 * i);}//恢复画笔pDC->SelectObject(pOldPen);delete pPenRed;if (pPen != NULL)delete pPen;ReleaseDC(pDC);
}/************设定为左刀补**************/
void CMyDlg::OnZuodaobu()
{// TODO: Add your control notification handler code heresgn_r = 1;CWnd *pWndButn;pWndButn = GetDlgItem(IDC_Daobujianli);pWndButn->EnableWindow();pWndButn = GetDlgItem(IDC_Daobujinxing);pWndButn->EnableWindow();pWndButn = GetDlgItem(IDC_Daobuchexiao);pWndButn->EnableWindow();
}/************设定为右刀补**************/
void CMyDlg::OnYoudaobu()
{// TODO: Add your control notification handler code heresgn_r = -1;CWnd *pWndButn;pWndButn = GetDlgItem(IDC_Daobujianli);pWndButn->EnableWindow();pWndButn = GetDlgItem(IDC_Daobujinxing);pWndButn->EnableWindow();pWndButn = GetDlgItem(IDC_Daobuchexiao);pWndButn->EnableWindow();
}void CMyDlg::OnShunyuan() //顺圆
{// TODO: Add your control notification handler code hereif (ShunNi == 1){((CButton*)GetDlgItem(IDC_Shunyuan))->SetCheck(0);}elseShunNi = 1;
}void CMyDlg::OnNiyuan() //逆圆
{// TODO: Add your control notification handler code hereif (ShunNi == -1){((CButton*)GetDlgItem(IDC_Niyuan))->SetCheck(0);}elseShunNi = -1;
}void CMyDlg::OnShunyuan2() //圆弧接圆弧第二段顺圆
{// TODO: Add your control notification handler code hereif (ShunNi2 == 1){((CButton*)GetDlgItem(IDC_Shunyuan2))->SetCheck(0);}elseShunNi2 = 1;
}void CMyDlg::OnNiyuan2() //圆弧接圆弧第二段逆圆
{// TODO: Add your control notification handler code hereif (ShunNi2 == -1){((CButton*)GetDlgItem(IDC_Niyuan2))->SetCheck(0);}elseShunNi2 = -1;
}void CMyDlg::OnDaobujianli() //刀补建立
{// TODO: Add your control notification handler code herejianli = 1;jinxing = 0;chexiao = 0;
}void CMyDlg::OnDaobujinxing() //刀补进行
{// TODO: Add your control notification handler code herejinxing = 1;jianli = 0;chexiao = 0;
}void CMyDlg::OnDaobuchexiao() //刀补撤消
{// TODO: Add your control notification handler code herechexiao = 1;jianli = 0;jinxing = 0;
}/************创建红色画笔**************/
void Cjhshb(CDC *pDC)
{CPen *pPenRed = new CPen();//创建画笔对象pPenRed->CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//红色画笔CPen *pPen = NULL;CGdiObject *pOldPen = pDC->SelectObject(pPenRed);
}/************创建绿色画笔**************/
void Cjlshb(CDC *pDC)
{CPen *pPenRed = new CPen();//创建画笔对象pPenRed->CreatePen(PS_SOLID, 3, RGB(0, 255, 0));//绿色画笔CPen *pPen = NULL;CGdiObject *pOldPen = pDC->SelectObject(pPenRed);
}void CMyDlg::OnZhaoyuanxin()//两个圆心的取舍
{// TODO: Add your control notification handler code hereif (yuanxin == -1){((CButton*)GetDlgItem(IDC_Zhaoyuanxin))->SetCheck(0);yuanxin = 1;}elseyuanxin = -1;
}void CMyDlg::OnZhaoyuanxin2()
{// TODO: Add your control notification handler code hereif (yuanxin2 == -1){((CButton*)GetDlgItem(IDC_Zhaoyuanxin2))->SetCheck(0);yuanxin2 = 1;}elseyuanxin2 = -1;
}int XiaoChuWuCha(double &x)//消除double型参数误差问题
{if (fabs(x - int(x)) < Minnum)x = int(x);if (fabs(x - (int(x) + 1)) < Minnum)x = int(x) + 1;return x;
}/************由已知圆弧两点和半径求圆心坐标**************/
void YuanXin(double m1, double n1, double m2, double n2, double R, double &x, double &y)
{int flag1 = (yuanxin < 0) ? -1 : 1;int flag2 = (ShunNi > 0) ? 1 : -1;double dx = m2 - m1, dy = n2 - n1;double length = sqrt(dx*dx + dy*dy);dx = dx / length;dy = dy / length;length = sqrt(R*R - length*length / 4);x = (m2 + m1) / 2 + flag1*flag2*dy*length;y = (n2 + n1) / 2 - flag1*flag2*dx*length;XiaoChuWuCha(x);XiaoChuWuCha(y);
}void YuanXin2(double m1, double n1, double m2, double n2, double R, double &x, double &y)//圆弧接圆弧第二段圆心计算
{int flag1 = (yuanxin2 < 0) ? -1 : 1;int flag2 = (ShunNi2 > 0) ? 1 : -1;double dx = m2 - m1, dy = n2 - n1;double length = sqrt(dx*dx + dy*dy);dx = dx / length;dy = dy / length;length = sqrt(R*R - length*length / 4);x = (m2 + m1) / 2 + flag1*flag2*dy*length;y = (n2 + n1) / 2 - flag1*flag2*dx*length;XiaoChuWuCha(x);XiaoChuWuCha(y);
}int SiSheWuRu(double &x)//小数取整函数
{if (x - int(x) < 0.5){x = int(x);}elsex = int(x) + 1;return x;
}int sgn(double d)//符号函数,正为1,负为-1,0为0
{if (d < 0)return -1;else if (d == 0)return 0;elsereturn 1;
}/************刀具半径补偿**************/
void CMyDlg::OnDaojubanjingbuchang()
{// TODO: Add your control notification handler code hereUpdateData(true);//pWnd = GetDlgItem(IDC_MYSTATIC);CPaintDC dc(this);//CString str;CDC *pDC = pWnd->GetDC();//获取控件指针CPen *pPenRed = new CPen();//创建画笔对象pPenRed->CreatePen(PS_SOLID, 3, RGB(0, 0, 255));//蓝色画笔CPen *pPen = NULL;CGdiObject *pOldPen = pDC->SelectObject(pPenRed);pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetViewportOrg(800 / 2, 700 / 2);pDC->SetViewportExt(800, 700);pDC->SetWindowOrg(0, 0);pDC->SetWindowExt(1000, -1000);x0 = x0 / ZuoBiaobl;//使坐标对应选择的坐标倍率y0 = y0 / ZuoBiaobl;x1 = x1 / ZuoBiaobl;y1 = y1 / ZuoBiaobl;x2 = x2 / ZuoBiaobl;y2 = y2 / ZuoBiaobl;r1 = r1 / ZuoBiaobl;r2 = r2 / ZuoBiaobl;r = r / ZuoBiaobl;double d1, d2;d1 = sqrt((x1 - x0)*(x1 - x0) + (y1 - y0)*(y1 - y0));d2 = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));double Xl1, Yl1, Xl2, Yl2;Xl1 = (x1 - x0) / d1;Yl1 = (y1 - y0) / d1;Xl2 = (x2 - x1) / d2;Yl2 = (y2 - y1) / d2;double Rx, Ry;//直线接圆弧圆心坐标YuanXin(x1, y1, x2, y2, r2, Rx, Ry);double I, J;I = Rx - x1;J = Ry - y1;double R = ShunNi*sqrt(I*I + J*J);double Xl3 = -J / R;double Yl3 = I / R;double f = sqrt((R + sgn_r*r)*(R + sgn_r*r) - (Xl1*J - Yl1*I - sgn_r*r)*(Xl1*J - Yl1*I - sgn_r*r));double Rx1, Ry1;//圆弧接直线圆心坐标YuanXin(x0, y0, x1, y1, r1, Rx1, Ry1);double I1, J1;I1 = Rx1 - x0;J1 = Ry1 - y0;double R1 = ShunNi*sqrt(I1*I1 + J1*J1);double R10;if ((sgn_r == 1 && ShunNi == 1) || (sgn_r == -1 && ShunNi == -1))//左刀补顺时针或右刀补逆时针{R10 = sqrt(I1*I1 + J1*J1) + r;//为了由两个转接点计算刀具轨迹半径,要正值}else if ((sgn_r == 1 && ShunNi == -1) || (sgn_r == -1 && ShunNi == 1))//左刀补逆时针或右刀补顺时针{R10 = sqrt(I1*I1 + J1*J1) - r;}double X01, Y01;X01 = x0 + I1 - x1;Y01 = y0 + J1 - y1;double Xl4, Yl4;Xl4 = -Y01 / R1;Yl4 = X01 / R1;double f1 = sqrt((R1 + sgn_r*r)*(R1 + sgn_r*r) - (Xl2*Y01 - Yl2*X01 - sgn_r*r)*(Xl2*Y01 - Yl2*X01 - sgn_r*r));double Rx2, Ry2, Rx3, Ry3;//圆弧接圆弧圆心坐标YuanXin(x0, y0, x1, y1, r1, Rx2, Ry2);YuanXin2(x1, y1, x2, y2, r2, Rx3, Ry3);double I2, J2, I3, J3;if (x0 == x1){I2 = 0;J2 = sgn(Ry2 - y0)*r1;}else{I2 = Rx2 - x0;J2 = Ry2 - y0;}if (x1 == x2){I3 = 0;J3 = sgn(Ry3 - y1)*r2;}else{I3 = Rx3 - x1;J3 = Ry3 - y1;}double R2 = ShunNi*sqrt(I2*I2 + J2*J2);double R3 = ShunNi2*sqrt(I3*I3 + J3*J3);double R20, R30;if (ShunNi == ShunNi2 && ShunNi==-1)//两段圆弧都是逆时针 左刀补减,右刀补加{R20 = sqrt(I2*I2 + J2*J2) - sgn_r*r;R30 = sqrt(I3*I3 + J3*J3) - sgn_r*r;}else if (ShunNi == ShunNi2 && ShunNi == 1)//两段圆弧都是顺时针 左刀补加,右刀补减{R20 = sqrt(I2*I2 + J2*J2) + sgn_r*r;R30 = sqrt(I3*I3 + J3*J3) + sgn_r*r;}else if (ShunNi != ShunNi2){if (ShunNi == 1){R20 = sqrt(I2*I2 + J2*J2) + sgn_r*r;R30 = sqrt(I3*I3 + J3*J3) - sgn_r*r;}else if (ShunNi == -1){R20 = sqrt(I2*I2 + J2*J2) - sgn_r*r;R30 = sqrt(I3*I3 + J3*J3) + sgn_r*r;}}double X02, Y02, X03, Y03;X02 = x0 + I2 - x1;Y02 = y0 + J2 - y1;X03 = I3;Y03 = J3;double Xl5, Yl5, Xl6, Yl6;Xl5 = -Y02 / R2;Yl5 = X02 / R2;Xl6 = -Y03 / R3;Yl6 = X03 / R3;double d3 = sqrt((X03 - X02)*(X03 - X02) + (Y03 - Y02)*(Y03 - Y02));double d4 = sgn_r*r*(R2 - R3) / d3;double XL = (Y03 - Y02) / d3;double YL = -(X03 - X02) / d3;double f2 = sqrt((R3 + sgn_r*r)*(R3 + sgn_r*r) - (XL*Y03 - YL*X03 - d4)*(XL*Y03 - YL*X03 - d4));double temp1, temp2;//直线接直线转接类型判断条件temp1 = sgn(sgn_r*r)*(Yl2*Xl1 - Xl2*Yl1);temp2 = Yl2*Yl1 + Xl2*Xl1;double temp3, temp4;//直线接圆弧转接类型判断条件temp3 = sgn(sgn_r*r)*(Yl3*Xl1 - Xl3*Yl1);temp4 = Yl3*Yl1 + Xl3*Xl1;if ((temp3 > double(-0.008) && temp3 <= 0) || (temp3 < double(0.008) && temp3 >= 0))//圆弧起点终点的横坐标相同{temp3 = 0;}double temp5, temp6;//圆弧接直线转接类型判断条件temp5 = sgn(sgn_r*r)*(Yl2*Xl4 - Xl2*Yl4);temp6 = Yl2*Yl4 + Xl2*Xl4;if ((temp5 > double(-0.008) && temp5 <= 0) || (temp5 < double(0.008) && temp5 >= 0))//圆弧起点终点的横坐标相同{temp5 = 0;}double temp7, temp8;//圆弧接圆弧转接类型判断条件temp7 = sgn(sgn_r*r)*(Yl6*Xl5 - Xl6*Yl5);temp8 = Yl6*Yl5 + Xl6*Xl5;/************直线接直线**************/if (r1 == 0 && r2 == 0)//直线接直线判断条件{//####################缩短型###################################      if (temp1 > 0)//转接角范围为(180,360){if (jianli == 1)//缩短型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//缩短型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + ((Xl2 - Xl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);Ys[i] = y1 + ((Yl2 - Yl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//缩短型刀补撤销{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);//刀补撤销时i就不用再加1了}}if (jianli == 1 && temp1 == 0 && temp2 < 0)//建立时转接角为0度{MessageBox("直线接直线刀补建立时,转接角α=0会导致刀具干涉,请重新输入", "警告", NULL);}if (jianli == 1 && temp1 == 0 && temp2 > 0)//建立时转接角为180度{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}if (jinxing == 1 && temp1 == 0 && temp2 < 0)//进行时转接角为0度{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}if (jinxing == 1 && temp1 == 0 && temp2 > 0)//进行时转接角为180度{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}if (chexiao == 1 && temp1 == 0 && temp2 < 0)//撤消时转接角为0度{MessageBox("直线接直线刀补撤消时,转接角α=0会导致刀具干涉,请重新输入", "警告", NULL);}if (chexiao == 1 && temp1 == 0 && temp2 > 0)//撤消时转接角为180度{pDC->MoveTo(40.0 * x0, 40.0 * y0);//pDC->LineTo(40.0 * x1, 40.0 * y1);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);}//########################伸长型###############################else if (temp1 < 0 && temp2 >= 0)//转接角范围为[90,180){if (jianli == 1)//伸长型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 + ((Xl2 - Xl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);Ys[i] = y1 + ((Yl2 - Yl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//伸长型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + ((Xl2 - Xl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);Ys[i] = y1 + ((Yl2 - Yl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//伸长型刀补撤销{pDC->MoveTo(40.0 * x0, 40.0 * y0);//pDC->LineTo(40.0 * x1, 40.0 * y1);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + ((Xl2 - Xl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);Ys[i] = y1 + ((Yl2 - Yl1)*sgn_r*r) / (Xl1*Yl2 - Xl2*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);}}//########################插入型###############################else if (temp1 < 0 && temp2 < 0)//转接角范围为(0,90){if (jianli == 1)//插入型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//插入型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//插入型刀补撤销{pDC->MoveTo(40.0 * x0, 40.0 * y0);//pDC->LineTo(40.0 * x1, 40.0 * y1);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);//刀补撤销时i就不用再加1了}}}/************直线接圆弧**************/if (r1 == 0 && r2 != 0)//直线接圆弧判断条件{//####################缩短型###################################   if (chexiao == 1){MessageBox("一般情况下,直线接圆弧转接时,圆弧不能作为退刀编程轨迹,请重新输入", "警告", NULL);}if (temp3 > 0)//转接角范围为(180,360){if (jianli == 1)//缩短型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//缩短型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + Xl1*(Xl1*I + Yl1*J) - sgn_r*r*Yl1 - sgn(Xl1*I + Yl1*J)*Xl1*f;Ys[i] = y1 + Yl1*(Xl1*I + Yl1*J) + sgn_r*r*Xl1 - sgn(Xl1*I + Yl1*J)*Yl1*f;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}if (jianli == 1 && temp3 == 0 && temp4 < 0)//建立时转接角为0度{MessageBox("直线接圆弧刀补建立时,转接角α=0会导致刀具干涉,请重新输入", "警告", NULL);}if (jianli == 1 && temp3 == 0 && temp4 > 0)//建立时转接角为180度{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}if (jinxing == 1 && temp3 == 0 && temp4 < 0)//进行时转接角为0度{if ((sgn_r == 1 && ShunNi == 1) || (sgn_r == -1 && ShunNi == -1))//左刀补顺时针或右刀补逆时针{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + Xl1*(Xl1*I + Yl1*J) - sgn_r*r*Yl1 - Xl1*f;Ys[i] = y1 + Yl1*(Xl1*I + Yl1*J) + sgn_r*r*Xl1 - Yl1*f;//经计算这里的Xl1*I+Yl1*J=0ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if ((sgn_r == 1 && ShunNi == -1) || (sgn_r == -1 && ShunNi == 1))//左刀补逆时针或右刀补顺时针{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3 - fabs(sgn_r*r)*Xl3;Ys[i] = y1 + sgn_r*r*Xl3 - fabs(sgn_r*r)*Yl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}if (jinxing == 1 && temp3 == 0 && temp4 > 0)//进行时转接角为180度{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);//Xs[i] = x1 + Xl1*(Xl1*I + Yl1*J) - sgn_r*r*Yl1 - sgn(Xl1*I + Yl1*J)*Xl1*f;//Ys[i] = y1 + Yl1*(Xl1*I + Yl1*J) + sgn_r*r*Xl1 - sgn(Xl1*I + Yl1*J)*Yl1*f;Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;//因为Xl1*I + Yl1*J在这里是0,所以上下两个公式其实一样ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}//########################伸长型###############################else if (temp3 < 0 && temp4 >= 0)//转接角范围为[90,180){if (jianli == 1)//伸长型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 + ((Xl3 - Xl1)*sgn_r*r) / (Xl1*Yl3 - Xl3*Yl1);Ys[i] = y1 + ((Yl3 - Yl1)*sgn_r*r) / (Xl1*Yl3 - Xl3*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//伸长型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + ((Xl3 - Xl1)*sgn_r*r) / (Xl1*Yl3 - Xl3*Yl1);Ys[i] = y1 + ((Yl3 - Yl1)*sgn_r*r) / (Xl1*Yl3 - Xl3*Yl1);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}//########################插入型###############################else if (temp3 < 0 && temp4 < 0)//转接角范围为(0,90){if (jianli == 1)//插入型刀补建立{Xs[i] = x0;//存进刀点Ys[i] = y0;i++;pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * x0, 40.0 * y0);Xs[i] = x1 - sgn_r*r*Yl1;Ys[i] = y1 + sgn_r*r*Xl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3 - fabs(sgn_r*r)*Xl3;Ys[i] = y1 + sgn_r*r*Xl3 - fabs(sgn_r*r)*Yl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (jinxing == 1)//插入型刀补进行{pDC->MoveTo(40.0 * x0, 40.0 * y0);pDC->LineTo(40.0 * x1, 40.0 * y1);if (ShunNi == -1){pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx - r2), 40.0 * (Ry + r2), 40.0 * (Rx + r2), 40.0 * (Ry - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl1 + fabs(sgn_r*r)*Xl1;Ys[i] = y1 + sgn_r*r*Xl1 + fabs(sgn_r*r)*Yl1;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3 - fabs(sgn_r*r)*Xl3;Ys[i] = y1 + sgn_r*r*Xl3 - fabs(sgn_r*r)*Yl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl3;Ys[i] = y1 + sgn_r*r*Xl3;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}}/************圆弧接直线**************/if (r2 == 0 && r1 != 0)//圆弧接直线判断条件{if (jianli == 1){MessageBox("一般情况下,圆弧接直线转接时,圆弧不能作为进刀编程轨迹,请重新输入", "警告", NULL);}//####################缩短型###################################      if (temp5 > 0)//转接角范围为(180,360){if (jinxing == 1)//缩短型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + Xl2*(Xl2*X01 + Yl2*Y01) - sgn_r*r*Yl2 - sgn(Xl2*X01 + Yl2*Y01)*Xl2*f1;Ys[i] = y1 + Yl2*(Xl2*X01 + Yl2*Y01) + sgn_r*r*Xl2 - sgn(Xl2*X01 + Yl2*Y01)*Yl2*f1;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);j++;i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//缩短型刀补撤销{pDC->MoveTo(40.0 * x1, 40.0 * y1);//pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);//刀补撤销时i就不用再加1了}}if (jinxing == 1 && temp5 == 0 && temp6 < 0)//进行时转接角为0度{if ((sgn_r == 1 && ShunNi == 1) || (sgn_r == -1 && ShunNi == -1))//左刀补顺时针或右刀补逆时针{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 + Xl2*(X01*Xl2 + Y01*Yl2) - sgn_r*r*Yl2 + Xl2*f1;Ys[i] = y1 + Yl2*(X01*Xl2 + Y01*Yl2) + sgn_r*r*Xl2 - Yl2*f1;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);j++;i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if ((sgn_r == 1 && ShunNi == -1) || (sgn_r == -1 && ShunNi == 1))//左刀补逆时针或右刀补顺时针{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4;Ys[i] = y1 + sgn_r*r*Xl4;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;i++;pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4 + fabs(sgn_r*r)*Xl4;Ys[i] = y1 + sgn_r*r*Xl4 + fabs(sgn_r*r)*Yl4;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}if (jinxing == 1 && temp5 == 0 && temp6 > 0)//进行时转接角为180度{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}if (chexiao == 1 && temp5 == 0 && temp6 < 0)//撤消时转接角为0度{MessageBox("圆弧接直线刀补撤消时,转接角α=0会导致刀具干涉,请重新输入", "警告", NULL);}if (chexiao == 1 && temp5 == 0 && temp6 > 0)//撤消时转接角为180度{pDC->MoveTo(40.0 * x0, 40.0 * y0);//pDC->LineTo(40.0 * x1, 40.0 * y1);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);}//########################伸长型###############################else if (temp5 < 0 && temp6 >= 0)//转接角范围为[90,180){if (jinxing == 1)//伸长型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4;Ys[i] = y1 + sgn_r*r*Xl4;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 + ((Xl2 - Xl4)*sgn_r*r) / (Xl4*Yl2 - Xl2*Yl4);Ys[i] = y1 + ((Yl2 - Yl4)*sgn_r*r) / (Xl4*Yl2 - Xl2*Yl4);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//伸长型刀补撤销{pDC->MoveTo(40.0 * x1, 40.0 * y1);//pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4;Ys[i] = y1 + sgn_r*r*Xl4;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 + ((Xl2 - Xl4)*sgn_r*r) / (Xl4*Yl2 - Xl2*Yl4);Ys[i] = y1 + ((Yl2 - Yl4)*sgn_r*r) / (Xl4*Yl2 - Xl2*Yl4);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);//刀补撤销时i就不用再加1了}}//########################插入型###############################else if (temp5 < 0 && temp6 < 0)//转接角范围为(0,90){if (jinxing == 1)//插入型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4;Ys[i] = y1 + sgn_r*r*Xl4;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl4 + fabs(sgn_r*r)*Xl4;Ys[i] = y1 + sgn_r*r*Xl4 + fabs(sgn_r*r)*Yl4;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else if (chexiao == 1)//插入型刀补撤销{pDC->MoveTo(40.0 * x1, 40.0 * y1);//pDC->LineTo(40.0 * x2, 40.0 * y2);Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl4;Ys[i] = y1 + sgn_r*r*Xl4;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R10, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R10), 40.0 * (Ry0 + R10), 40.0 * (Rx0 + R10), 40.0 * (Ry0 - R10), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl4 + fabs(sgn_r*r)*Xl4;Ys[i] = y1 + sgn_r*r*Xl4 + fabs(sgn_r*r)*Yl4;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2 - fabs(sgn_r*r)*Xl2;Ys[i] = y1 + sgn_r*r*Xl2 - fabs(sgn_r*r)*Yl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl2;Ys[i] = y1 + sgn_r*r*Xl2;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;Xs[i] = x2;Ys[i] = y2;pDC->LineTo(40.0 * x2, 40.0 * y2);//刀补撤销时i就不用再加1了}}}/************圆弧接圆弧**************/if (r1 != 0 && r2 != 0)//圆弧接圆弧判断条件{//####################缩短型###################################    if (jianli == 1 || chexiao == 1){MessageBox("一般情况下,圆弧接圆弧转接时,不能作为进刀或退刀编程轨迹,请重新输入", "警告", NULL);}if (temp7 > 0)//转接角范围为(180,360){if (jinxing == 1)//缩短型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);//Xs[i] = x1 + XL*(XL*X02 + YL*Y02) - d4*YL - sgn(XL*X02 + YL*Y02)*XL*f2;//Ys[i] = y1 + YL*(XL*X02 + YL*Y02) + d4*XL - sgn(XL*X02 + YL*Y02)*YL*f2;Xs[i] = x1 + XL*(XL*X03 + YL*Y03) - d4*YL - sgn(XL*X03 + YL*Y03)*XL*f2;Ys[i] = y1 + YL*(XL*X03 + YL*Y03) + d4*XL - sgn(XL*X03 + YL*Y03)*YL*f2;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}if (jinxing == 1 && temp7 == 0 && temp8 < 0)//转接角为0度{int sgnval;if(((ShunNi==ShunNi2) && ((ShunNi==1 && sgn_r==1) || (ShunNi==-1 && sgn_r==-1))) ||((ShunNi!=ShunNi2) && (r1<r2) && ((ShunNi==1 && sgn_r==1) || (ShunNi==-1 && sgn_r==-1))) ||((ShunNi!=ShunNi2) && (r1>r2) && ((ShunNi==-1 && sgn_r==1) || (ShunNi==1 && sgn_r==1)))   )//两段圆弧方向一样时:左刀补顺时针或右刀补逆时针(一个转接点)//两段圆弧方向不一样且第一段圆弧半径小于第二段时:左刀补顺时针或右刀补逆时针//两段圆弧方向不一样且第一段圆弧半径大于第二段时:左刀补逆时针或右刀补顺时针{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);if (ShunNi == ShunNi2){if (sgn_r == 1)//外切左刀补{sgnval = 1;}if (sgn_r == -1)//外切右刀补{sgnval = -1;}}else{if (sgn_r == 1)//内切左刀补{sgnval = -1;}if (sgn_r == -1)//内切右刀补{sgnval = 1;}}Xs[i] = x1 + XL*(XL*X03 + YL*Y03) - d4*YL - sgnval*XL*f2;Ys[i] = y1 + YL*(XL*X03 + YL*Y03) + d4*XL - sgnval*YL*f2;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}else{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}    else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl5;Ys[i] = y1 + sgn_r*r*Xl5;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl5 + fabs(sgn_r*r)*Xl5;Ys[i] = y1 + sgn_r*r*Xl5 + fabs(sgn_r*r)*Yl5;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl6 - fabs(sgn_r*r)*Xl6;Ys[i] = y1 + sgn_r*r*Xl6 - fabs(sgn_r*r)*Yl6;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}if (jinxing == 1 && temp7 == 0 && temp8 > 0)//转接角为180度{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl5;Ys[i] = y1 + sgn_r*r*Xl5;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}//########################伸长型###############################else if (temp7 < 0 && temp8 >= 0)//转接角范围为[90,180){if (jinxing == 1)//伸长型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl5;Ys[i] = y1 + sgn_r*r*Xl5;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}j++;pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 + ((Xl6 - Xl5)*sgn_r*r) / (Xl5*Yl6 - Xl6*Yl5);Ys[i] = y1 + ((Yl6 - Yl5)*sgn_r*r) / (Xl5*Yl6 - Xl6*Yl5);ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl6;Ys[i] = y1 + sgn_r*r*Xl6;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}//########################插入型###############################else if (temp7 < 0 && temp8 < 0)//转接角范围为(0,90){if (jinxing == 1)//插入型刀补进行{pDC->MoveTo(40.0 * x1, 40.0 * y1);if (ShunNi2 == -1){pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x1, 40.0 * y1, 40.0 * x2, 40.0 * y2);}else{pDC->Arc(40.0 * (Rx3 - r2), 40.0 * (Ry3 + r2), 40.0 * (Rx3 + r2), 40.0 * (Ry3 - r2), 40.0 * x2, 40.0 * y2, 40.0 * x1, 40.0 * y1);}Cjhshb(pDC);pDC->MoveTo(40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Xs[i] = x1 - sgn_r*r*Yl5;Ys[i] = y1 + sgn_r*r*Xl5;ZhixianOrYuanhu[j] = -1;double Rx0, Ry0;YuanXin(Xs[i - 1], Ys[i - 1], Xs[i], Ys[i], R20, Rx0, Ry0);Xyuanhu[j] = Rx0;Yyuanhu[j] = Ry0;if (ShunNi == -1){pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i - 1], 40.0 * Ys[i - 1], 40.0 * Xs[i], 40.0 * Ys[i]);Ryuanhu[j] = -R10;}else{pDC->Arc(40.0 * (Rx0 - R20), 40.0 * (Ry0 + R20), 40.0 * (Rx0 + R20), 40.0 * (Ry0 - R20), 40.0 * Xs[i], 40.0 * Ys[i], 40.0 * Xs[i - 1], 40.0 * Ys[i - 1]);Ryuanhu[j] = R10;}pDC->MoveTo(40.0 * Xs[i], 40.0 * Ys[i]);j++;i++;Xs[i] = x1 - sgn_r*r*Yl5 + fabs(sgn_r*r)*Xl5;Ys[i] = y1 + sgn_r*r*Xl5 + fabs(sgn_r*r)*Yl5;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl6 - fabs(sgn_r*r)*Xl6;Ys[i] = y1 + sgn_r*r*Xl6 - fabs(sgn_r*r)*Yl6;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;Xs[i] = x1 - sgn_r*r*Yl6;Ys[i] = y1 + sgn_r*r*Xl6;ZhixianOrYuanhu[j] = 1;j++;pDC->LineTo(40.0 * Xs[i], 40.0 * Ys[i]);i++;x0 = x1*ZuoBiaobl;y0 = y1*ZuoBiaobl;x1 = x2*ZuoBiaobl;y1 = y2*ZuoBiaobl;x2 = 0;y2 = 0;r1 = r1*ZuoBiaobl;r2 = r2*ZuoBiaobl;r = r*ZuoBiaobl;UpdateData(false);}}}
}//********************************开始插补**************************void CMyDlg::OnZhudianbijiaofa() //逐点比较法插补
{// TODO: Add your control notification handler code hereUpdateData(true);CPaintDC dc(this);CDC *pDC = pWnd->GetDC();//获取控件指针pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetViewportOrg(800 / 2, 700 / 2);pDC->SetViewportExt(800, 700);pDC->SetWindowOrg(0, 0);pDC->SetWindowExt(1000, -1000);Cjlshb(pDC);int n = 0;for (n;n <= j;n++){if (ZhixianOrYuanhu[n] == 1)//四象限直线插补{double X0 = Xs[n];double Y0 = Ys[n];double Xe = Xs[n + 1];double Ye = Ys[n + 1];double Xi = X0;double Yi = Y0;pDC->MoveTo(40.0*X0, 40.0*Y0);if (Xe > X0 && Ye > Y0)//第一象限方向(不是第一象限){if (Xe - Xi >= Delta){Xi = Xi + Delta;}else{Xi = Xe;}pDC->LineTo(40.0*Xi, 40.0*Yi);Sleep(Time);while (Xi != Xe || Yi != Ye){double F;if (Yi == Y0){F = -1;}else{F = ((Yi - Y0) / (Xi - X0)) - ((Ye - Y0) / (Xe - X0));}if (F >= 0){if (Xe - Xi >= Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else{if (Ye - Yi >= Delta){Yi = Yi + Delta;}else{Yi = Ye;}}pDC->LineTo(40.0*Xi, 40.0*Yi);Sleep(Time);}}if (Xe < X0 && Ye > Y0)//第二象限方向(不是第二象限){if (Xe - Xi <= -Delta){Xi = Xi - Delta;}else{Xi = Xe;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);while (Xi != Xe || Yi != Ye){double F;if (Yi == Y0){F = 1;}else{F = ((Yi - Y0) / (Xi - X0)) - ((Ye - Y0) / (Xe - X0));}if (F <= 0){if (Xe - Xi <= -Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else{if (Ye - Yi >= Delta){Yi = Yi + Delta;}else{Yi = Ye;}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Xe < X0 && Ye < Y0)//第三象限方向(不是第三象限){if (Xe - Xi <= -Delta){Xi = Xi - Delta;}else{Xi = Xe;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);while (Xi != Xe || Yi != Ye){double F;if (Yi == Y0){F = -1;}else{F = ((Yi - Y0) / (Xi - X0)) - ((Ye - Y0) / (Xe - X0));}if (F >= 0){if (Xe - Xi <= -Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else{if (Ye - Yi <= -Delta){Yi = Yi - Delta;}else{Yi = Ye;}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Xe > X0 && Ye < Y0)//第四象限方向(不是第四象限){if (Xe - Xi >= Delta){Xi = Xi + Delta;}else{Xi = Xe;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);while (Xi != Xe || Yi != Ye){double F;if (Yi == Y0){F = 1;}else{F = ((Yi - Y0) / (Xi - X0)) - ((Ye - Y0) / (Xe - X0));}if (F <= 0){if (Xe - Xi >= Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else{if (Ye - Yi <= -Delta){Yi = Yi - Delta;}else{Yi = Ye;}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Xe > X0 && Ye == Y0)//X轴正方向{while (Xi != Xe || Yi != Ye){if (Xe - Xi >= Delta){Xi = Xi + Delta;}else{Xi = Xe;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Xe < X0 && Ye == Y0)//X轴负方向{while (Xi != Xe || Yi != Ye){if (Xe - Xi <= -Delta){Xi = Xi - Delta;}else{Xi = Xe;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Ye > Y0 && Xe == X0)//Y轴正方向{while (Xi != Xe || Yi != Ye){if (Ye - Yi >= Delta){Yi = Yi + Delta;}else{Yi = Ye;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}if (Ye < Y0 && Xe == X0)//Y轴负方向{while (Xi != Xe || Yi != Ye){if (Ye - Yi <= -Delta){Yi = Yi - Delta;}else{Yi = Ye;}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}}if (ZhixianOrYuanhu[n] == -1)//四象限圆弧插补{double Xi = Xs[n];double Yi = Ys[n];double Xe = Xs[n + 1];double Ye = Ys[n + 1];pDC->MoveTo(40.0*Xi, 40.0*Yi);if (Ryuanhu[n] < 0)//逆圆{while (Xi != Xe || Yi != Ye){if (Xi > Xyuanhu[n] && Yi >= Yyuanhu[n])//圆弧相对于圆心的角度为[0,90){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe > Xyuanhu[n] && Ye >= Yyuanhu[n])//如果终点在相对于原点的第一象限方向{if (Xi - Xe >= Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else{if (Xi - Xyuanhu[n] >= Delta){Xi = Xi - Delta;}else{Xi = Xyuanhu[n];}}}else{if (Xe > Xyuanhu[n] && Ye >= Yyuanhu[n])//如果终点在相对于原点的第一象限方向{if (Yi - Ye <= -Delta){Yi = Yi + Delta;}else{Yi = Ye;}}else if (Yi < (Yyuanhu[n] + fabs(Ryuanhu[n]))){if (Yi - (Yyuanhu[n] + fabs(Ryuanhu[n])) <= -Delta){Yi = Yi + Delta;}else{Yi = Yyuanhu[n] + fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi <= Xyuanhu[n] && Yi > Yyuanhu[n])//圆弧相对于圆心的角度为[90,180){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe <= Xyuanhu[n] && Ye > Yyuanhu[n])//如果终点在相对于原点的第二象限方向{if (Yi - Ye >= Delta){Yi = Yi - Delta;}else{Yi = Ye;}}else{if (Yi - Yyuanhu[n] >= Delta){Yi = Yi - Delta;}else{Yi = Yyuanhu[n];}}}else{if (Xe <= Xyuanhu[n] && Ye > Yyuanhu[n])//如果终点在相对于原点的第二象限方向{if (Xi - Xe >= Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else if (Xi > (Xyuanhu[n] - fabs(Ryuanhu[n]))){if (Xi - (Xyuanhu[n] - fabs(Ryuanhu[n])) >= Delta){Xi = Xi - Delta;}else{Xi = Xyuanhu[n] - fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi < Xyuanhu[n] && Yi <= Yyuanhu[n])//圆弧相对于圆心的角度为[180,270){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe < Xyuanhu[n] && Ye <= Yyuanhu[n])//如果终点在相对于原点的第三象限方向{if (Xi - Xe <= -Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else{if (Xi - Xyuanhu[n] <= -Delta){Xi = Xi + Delta;}else{Xi = Xyuanhu[n];}}}else{if (Xe < Xyuanhu[n] && Ye <= Yyuanhu[n])//如果终点在相对于原点的第三象限方向{if (Yi - Ye >= Delta){Yi = Yi - Delta;}else{Yi = Ye;}}else if (Yi > (Yyuanhu[n] - fabs(Ryuanhu[n]))){if (Yi - (Yyuanhu[n] - fabs(Ryuanhu[n])) >= Delta){Yi = Yi - Delta;}else{Yi = Yyuanhu[n] - fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi >= Xyuanhu[n] && Yi < Yyuanhu[n])//圆弧相对于圆心的角度为[270,360){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe >= Xyuanhu[n] && Ye < Yyuanhu[n])//如果终点在相对于原点的第四象限方向{if (Yi - Ye <= -Delta){Yi = Yi + Delta;}else{Yi = Ye;}}else{if (Yi - Yyuanhu[n] <= -Delta){Yi = Yi + Delta;}else{Yi = Yyuanhu[n];}}}else{if (Xe >= Xyuanhu[n] && Ye < Yyuanhu[n])//如果终点在相对于原点的第四象限方向{if (Xi - Xe <= -Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else if (Xi < (Xyuanhu[n] + fabs(Ryuanhu[n]))){if (Xi - (Xyuanhu[n] + fabs(Ryuanhu[n])) <= -Delta){Xi = Xi + Delta;}else{Xi = Xyuanhu[n] + fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}}else if (Ryuanhu[n] > 0)//顺圆{while (Xi != Xe || Yi != Ye){if (Xi >= Xyuanhu[n] && Yi > Yyuanhu[n])//圆弧相对于圆心的角度为[90,0){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe >= Xyuanhu[n] && Ye > Yyuanhu[n])//如果终点在相对于原点的第一象限方向{if (Yi - Ye >= Delta){Yi = Yi - Delta;}else{Yi = Ye;}}else{if (Yi - Yyuanhu[n] >= Delta){Yi = Yi - Delta;}else{Yi = Yyuanhu[n];}}}else{if (Xe >= Xyuanhu[n] && Ye > Yyuanhu[n])//如果终点在相对于原点的第一象限方向{if (Xi - Xe <= -Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else if (Xi < (Xyuanhu[n] + fabs(Ryuanhu[n]))){if (Xi - (Xyuanhu[n] + fabs(Ryuanhu[n])) <= -Delta){Xi = Xi + Delta;}else{Xi = Xyuanhu[n] + fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi < Xyuanhu[n] && Yi >= Yyuanhu[n])//圆弧相对于圆心的角度为[180,90){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe < Xyuanhu[n] && Ye >= Yyuanhu[n])//如果终点在相对于原点的第二象限方向{if (Xi - Xe <= -Delta){Xi = Xi + Delta;}else{Xi = Xe;}}else{if (Xi - Xyuanhu[n] <= -Delta){Xi = Xi + Delta;}else{Xi = Xyuanhu[n];}}}else{if (Xe < Xyuanhu[n] && Ye >= Yyuanhu[n])//如果终点在相对于原点的第二象限方向{if (Yi - Ye <= -Delta){Yi = Yi + Delta;}else{Yi = Ye;}}else if (Yi < (Yyuanhu[n] + fabs(Ryuanhu[n]))){if (Yi - (Yyuanhu[n] + fabs(Ryuanhu[n])) <= -Delta){Yi = Yi + Delta;}else{Yi = Yyuanhu[n] + fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi <= Xyuanhu[n] && Yi < Yyuanhu[n])//圆弧相对于圆心的角度为[270,180){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe <= Xyuanhu[n] && Ye < Yyuanhu[n])//如果终点在相对于原点的第三象限方向{if (Yi - Ye <= -Delta){Yi = Yi + Delta;}else{Yi = Ye;}}else{if (Yi - Yyuanhu[n] <= -Delta){Yi = Yi + Delta;}else{Yi = Yyuanhu[n];}}}else{if (Xe <= Xyuanhu[n] && Ye < Yyuanhu[n])//如果终点在相对于原点的第三象限方向{if (Xi - Xe >= Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else if (Xi > (Xyuanhu[n] - fabs(Ryuanhu[n]))){if (Xi - (Xyuanhu[n] - fabs(Ryuanhu[n])) >= Delta){Xi = Xi - Delta;}else{Xi = Xyuanhu[n] - fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}if (Xi > Xyuanhu[n] && Yi <= Yyuanhu[n])//圆弧相对于圆心的角度为[360,270){double F = ((Xi - Xyuanhu[n])*(Xi - Xyuanhu[n]) + (Yi - Yyuanhu[n])*(Yi - Yyuanhu[n])) - Ryuanhu[n] * Ryuanhu[n];if (F >= 0){if (Xe > Xyuanhu[n] && Ye <= Yyuanhu[n])//如果终点在相对于原点的第四象限方向{if (Xi - Xe > Delta){Xi = Xi - Delta;}else{Xi = Xe;}}else{if (Xi - Xyuanhu[n] >= Delta){Xi = Xi - Delta;}else{Xi = Xyuanhu[n];}}}else{if (Xe > Xyuanhu[n] && Ye <= Yyuanhu[n])//如果终点在相对于原点的第四象限方向{if (Yi - Ye >= Delta){Yi = Yi - Delta;}else{Yi = Ye;}}else if (Yi > (Yyuanhu[n] - fabs(Ryuanhu[n]))){if (Yi - (Yyuanhu[n] - fabs(Ryuanhu[n])) >= Delta){Yi = Yi - Delta;}else{Yi = Yyuanhu[n] - fabs(Ryuanhu[n]);}}}pDC->LineTo(40.0 * Xi, 40.0 * Yi);Sleep(Time);}}}}}
}void CMyDlg::OnShuZiJiFenFa() //数字积分法插补
{// TODO: Add your control notification handler code hereUpdateData(true);CPaintDC dc(this);CDC *pDC = pWnd->GetDC();//获取控件指针pDC->SetMapMode(MM_ANISOTROPIC);pDC->SetViewportOrg(800 / 2, 700 / 2);pDC->SetViewportExt(800, 700);pDC->SetWindowOrg(0, 0);pDC->SetWindowExt(1000, -1000);Cjlshb(pDC);int n = 0;for (n;n <= j;n++){if (ZhixianOrYuanhu[n] == 1)//四象限直线插补{double X0 = Xs[n];double Y0 = Ys[n];double Jvx = Xs[n + 1];//插补终点double Jvy = Ys[n + 1];int sigma = pow(2, N);if (fabs(Jvx) > sigma || fabs(Jvy) > sigma){MessageBox("寄存器位数与实际参数不匹配,请重新输入", "警告", NULL);break;}double Jrx = sigma / step/2;//半加载法寄存器余数double Jry = sigma / step/2;int Jsigma = sigma / step;//累加器容量int count = 0;//累加值bool Qx = false;bool Qy = false;pDC->MoveTo(40.0*X0, 40.0*Y0);if (Jvx >= X0 && Jvy >= Y0)//第一象限方向{while (count < Jsigma){Jrx = Jrx + (Jvx - Xs[n]) / step;Jry = Jry + (Jvy - Ys[n]) / step;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx-Jsigma;}X0 = X0 + step;Qx = true;}if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry-Jsigma;}Y0 = Y0 + step;Qy = true;}if (Qx || Qy){pDC->LineTo(40.0 * X0, 40.0 * Y0);Qx = Qy = false;}count++;Sleep(Time);}pDC->LineTo(40.0*Jvx, 40.0*Jvy);}Jrx = sigma / step / 2;//寄存器余数Jry = sigma / step / 2;if (Jvx < X0 && Jvy >= Y0)//第二象限方向{while (count < Jsigma){Jrx = Jrx + fabs(Jvx - Xs[n]) / step;Jry = Jry + (Jvy - Ys[n]) / step;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx-Jsigma;}X0 = X0 - step;Qx = true;}if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry-Jsigma;}Y0 = Y0 + step;Qy = true;}if (Qx || Qy){pDC->LineTo(40.0 * X0, 40.0 * Y0);Qx = Qy = false;}count++;Sleep(Time);}pDC->LineTo(40.0*Jvx, 40.0*Jvy);}Jrx = sigma / step / 2;//寄存器余数Jry = sigma / step / 2;if (Jvx < X0 && Jvy < Y0)//第三象限方向{while (count < Jsigma){Jrx = Jrx + fabs(Jvx - Xs[n]) / step;Jry = Jry + fabs(Jvy - Ys[n]) / step;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx-Jsigma;}X0 = X0 - step;Qx = true;}if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry-Jsigma;}Y0 = Y0 - step;Qy = true;}if (Qx || Qy){pDC->LineTo(40.0 * X0, 40.0 * Y0);Qx = Qy = false;}count++;Sleep(Time);}pDC->LineTo(40.0*Jvx, 40.0*Jvy);}Jrx = sigma / step / 2;//寄存器余数Jry = sigma / step / 2;if (Jvx >= X0 && Jvy < Y0)//第四象限方向{while (count < Jsigma){Jrx = Jrx + (Jvx - Xs[n]) / step;Jry = Jry + fabs(Jvy - Ys[n]) / step;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx-Jsigma;}X0 = X0 + step;Qx = true;}if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry-Jsigma;}Y0 = Y0 - step;Qy = true;}if (Qx || Qy){pDC->LineTo(40.0 * X0, 40.0 * Y0);Qx = Qy = false;}count++;Sleep(Time);}pDC->LineTo(40.0*Jvx, 40.0*Jvy);}}if (ZhixianOrYuanhu[n] == -1)//四象限圆弧插补{double X0 = Xs[n];double Y0 = Ys[n];double Xe = Xs[n + 1];double Ye = Ys[n + 1];int sigma = pow(2, N);double Jrx = sigma/2;//半加载法寄存器余数double Jry = sigma/2;double Jvx;double Jvy;if (fabs(X0) > sigma || fabs(Y0) > sigma || fabs(Xe) > sigma || fabs(Ye) > sigma){MessageBox("寄存器位数与实际参数不匹配,请重新输入", "警告", NULL);break;}int Jsigma = sigma;//累加器容量bool Qx = false;bool Qy = false;double Jsigmax;double Jsigmay;double Xe1;double Ye1;pDC->MoveTo(40.0*X0, 40.0*Y0);if ((Ryuanhu[n] < 0))//逆圆{while (X0 != Xe || Y0 != Ye){if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma / 2;//半加载法寄存器余数Jry = sigma / 2;if (X0 > Xyuanhu[n] && Y0 >= Yyuanhu[n])//第一象限方向{if (Xe > Xyuanhu[n] && Ye >= Yyuanhu[n])//终点在第一象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第一象限{Jsigmax = fabs(Xyuanhu[n] - X0) / step;Jsigmay = fabs(Yyuanhu[n] + fabs(Ryuanhu[n]) - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n];Ye1 = Yyuanhu[n] + fabs(Ryuanhu[n]);}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma)//只能这样,double型不能取余{Jrx = Jrx - Jsigma;}X0 -= step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 += step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma/2;//半加载法寄存器余数Jry = sigma/2;if (X0 <= Xyuanhu[n] && Y0 > Yyuanhu[n])//第二象限方向{if (Xe <= Xyuanhu[n] && Ye > Yyuanhu[n])//终点在第二象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第二象限{Jsigmax = fabs(Xyuanhu[n] - fabs(Ryuanhu[n]) - X0) / step;Jsigmay = fabs(Yyuanhu[n] - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n] - fabs(Ryuanhu[n]);Ye1 = Yyuanhu[n];}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 -= step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 -= step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma/2;//半加载法寄存器余数Jry = sigma/2;if (X0 < Xyuanhu[n] && Y0 <= Yyuanhu[n])//第三象限方向{if (Xe < Xyuanhu[n] && Ye <= Yyuanhu[n])//终点在第三象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第三象限{Jsigmax = fabs(Xyuanhu[n] - X0) / step;Jsigmay = fabs(Yyuanhu[n] - fabs(Ryuanhu[n]) - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n];Ye1 = Yyuanhu[n] - fabs(Ryuanhu[n]);}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 += step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 -= step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma/2;//半加载法寄存器余数Jry = sigma/2;if (X0 >= Xyuanhu[n] && Y0 < Yyuanhu[n])//第四象限方向{if (Xe >= Xyuanhu[n] && Ye < Yyuanhu[n])//终点在第四象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第四象限{Jsigmax = fabs(Xyuanhu[n] + fabs(Ryuanhu[n]) - X0) / step;Jsigmay = fabs(Yyuanhu[n] - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n] + fabs(Ryuanhu[n]);Ye1 = Yyuanhu[n];}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 += step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 += step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}}}if ((Ryuanhu[n] > 0))//顺圆{while (X0 != Xe || Y0 != Ye){if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma / 2;//半加载法寄存器余数Jry = sigma / 2;if (X0 >= Xyuanhu[n] && Y0 > Yyuanhu[n])//第一象限方向{if (Xe >= Xyuanhu[n] && Ye > Yyuanhu[n])//终点在第一象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第一象限{Jsigmax = fabs(Xyuanhu[n] + fabs(Ryuanhu[n]) - X0) / step;Jsigmay = fabs(Yyuanhu[n] - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n] + fabs(Ryuanhu[n]);Ye1 = Yyuanhu[n];}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 += step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 -= step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma / 2;//半加载法寄存器余数Jry = sigma / 2;if (X0 < Xyuanhu[n] && Y0 >= Yyuanhu[n])//第二象限方向{if (Xe < Xyuanhu[n] && Ye >= Yyuanhu[n])//终点在第二象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第二象限{Jsigmax = fabs(Xyuanhu[n] - X0) / step;Jsigmay = fabs(Yyuanhu[n] + fabs(Ryuanhu[n]) - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n];Ye1 = Yyuanhu[n] + fabs(Ryuanhu[n]);}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 += step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 += step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma / 2;//半加载法寄存器余数Jry = sigma / 2;if (X0 <= Xyuanhu[n] && Y0 < Yyuanhu[n])//第三象限方向{if (Xe <= Xyuanhu[n] && Ye < Yyuanhu[n])//终点在第三象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第三象限{Jsigmax = fabs(Xyuanhu[n] - fabs(Ryuanhu[n]) - X0) / step;Jsigmay = fabs(Yyuanhu[n] - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n] - fabs(Ryuanhu[n]);Ye1 = Yyuanhu[n];}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 -= step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 += step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}if (fabs(X0 - Xyuanhu[n]) < Minnum){X0 = Xyuanhu[n];}if (fabs(Y0 - Yyuanhu[n]) < Minnum){Y0 = Yyuanhu[n];}Jrx = sigma / 2;//半加载法寄存器余数Jry = sigma / 2;if (X0 > Xyuanhu[n] && Y0 <= Yyuanhu[n])//第四象限方向{if (Xe > Xyuanhu[n] && Ye <= Yyuanhu[n])//终点在第四象限方向{Jsigmax = fabs(Xe - X0) / step;Jsigmay = fabs(Ye - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xe;Ye1 = Ye;}else//终点不在第四象限{Jsigmax = fabs(Xyuanhu[n] - X0) / step;Jsigmay = fabs(Yyuanhu[n] - fabs(Ryuanhu[n]) - Y0) / step;SiSheWuRu(Jsigmax);SiSheWuRu(Jsigmay);Xe1 = Xyuanhu[n];Ye1 = Yyuanhu[n] - fabs(Ryuanhu[n]);}Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);while (Jsigmax > 0 || Jsigmay > 0){if (Jsigmax > 0){Jrx += Jvx;if (Jrx >= Jsigma){while (Jrx >= Jsigma){Jrx = Jrx - Jsigma;}X0 -= step;Jsigmax -= 1;Qx = true;}}if (Jsigmay > 0){Jry += Jvy;if (Jry >= Jsigma){while (Jry >= Jsigma){Jry = Jry - Jsigma;}Y0 -= step;Jsigmay -= 1;Qy = true;}}if (Qx || Qy){pDC->LineTo(40.0*X0, 40.0*Y0);Sleep(Time);Qx = Qy = false;Jvx = fabs(Y0 - Yyuanhu[n]);Jvy = fabs(X0 - Xyuanhu[n]);}}pDC->LineTo(40.0*Xe1, 40.0*Ye1);X0 = Xe1;Y0 = Ye1;}}}}}
}

固高数控工作台的刀补插补程序开发(逐点比较法,数字积分法)相关推荐

  1. 数控技术课设:数控系统刀补功能的软件实现及其仿真--数控仿真程序开发实战

    数控技术:数控系统刀补功能的软件实现及其仿真–数控仿真程序开发实战 主要功能是传入一个.dxf文件,可以读取该文件显示其外形轮廓,然后通过数控技术的逐点比较法对该路径进行插补,还可以对其进行刀补路径的 ...

  2. 数字积分法插补c语言程序,数字积分法插补原理

    <数字积分法插补原理>由会员分享,可在线阅读,更多相关<数字积分法插补原理(19页珍藏版)>请在人人文库网上搜索. 1.3单元 数字积分法插补原理,掌握数字积分法插补基本原理 ...

  3. 数字积分法直线插补c语言程序,数控课程设计(数字积分法第二象限直线插补程序).docx...

    数字积分法第二象限直线插补程序设计 数字积分法是利用数字积分的方法,计算刀具沿各坐标轴的位移,使得刀具 沿着所加工的轮廓曲线运动 利用数字 积分原 理构成的插 补装置 称为数字积分 器,又称数 字微分 ...

  4. 运动控制卡课程:固高,凌华,雷赛,(单一款学习时间45天,要求有C语言基础)凭良学校

    一.雷赛运动控制卡(雷赛dmc5480.smc6480)(可单独学习,要求有C#语言基础) 简介: DMC5480是一款基于PCI总线的高档脉冲式运动控制卡,配置了512段缓冲,使得实时处理能力更强: ...

  5. 固高机器人控制器开发笔记

    目录 VS 2008 + Qt4.7 开发环境搭建 △ 软件安装 △ 环境配置 最近又开了个新坑,因为做实验的需求,需要用到重载机器人. 但是不巧的是,实验室的500kg库卡机器人程师兄在做开发,开发 ...

  6. 老师傅传授,数控车床对刀步骤

    第一把刀的对刀步骤: 第一步:确认刀具 如果不是,需要换刀 在MDI模式下,输入换刀指令:T0x0x 在MDI模式下,输入转速指令:SxxxM0x 第二步:试切削 快速接近工件,注意不要碰到工件. Z ...

  7. 固高控制卡相关要点分析2

    为了配合加工宏程序编译与执行,考虑以前的通讯方式,为了快速提高译码过程,将前期通过多媒体定时中断实现与控制卡通讯的方式改为多线程控制. 将绝大部分主要的IO采集,控制,回零功能,JOG功能,插补指令启 ...

  8. 大疆教父李泽湘创办的固高科技过会:拟募资4.5亿 联想是股东

    雷递网 雷建平 8月22日报道 固高科技股份有限公司(简称:"固高科技")日前IPO过会,准备在深交所创业板上市.固高科技计划募资4.5亿元. 其中,1.2亿元用于运动控制系统产业 ...

  9. 固高科技在创业板提交注册:业绩开始下滑,实控人均为“学院派”

    近日,固高科技股份有限公司(下称"固高科技")在深圳证券交易所创业板递交注册.据贝多财经了解,固高科技于2021年12月在创业板递交上市申请,2022年8月17日获得上市委会议通过 ...

最新文章

  1. yum报错Error: Cannot retrieve repository metadata (repomd.xml) for repository: rhel-source
  2. DOCTYPE声明的几种类型
  3. golang mysql proxy_mixer: 一个用go实现的mysql proxy
  4. Flowable 数据库表结构 ACT_HI_VARINST
  5. cvs导入oracle缺失逗号,pandas教程:使用read_csv()导入数据
  6. android gl11,Android 中OpenGL的使用
  7. 《Perl语言入门》学习笔记
  8. IEEE论文参考文献引用格式
  9. IDEA中单词拼写错误
  10. CPU硅脂需要换吗?
  11. UE4 EQS C++自定义节点编写
  12. linux远程服务器环境_如何使用Linux为孩子设置远程学校环境
  13. 力扣启蒙 - 开启算法的世界
  14. Arduino语法详解,部分带注释(学习笔记)
  15. 【FPGA】04_关于“复位“的理解与总结
  16. CSDN 博客 修改文章搜索为 bing 搜索,且只搜索自己的博客的方法
  17. 今天真是个好日子……
  18. Qt中setData()和data()用法
  19. python中datetime是什么意思_python中datetime的使用方法
  20. speedoffice(PPT)怎么添加饼图呢

热门文章

  1. 如何从自身寻找目标用户需求
  2. PC机和上位机是什么关系
  3. javascript正则表达式截取字符串
  4. openwrt 无线测速只能达到20Mbps
  5. 如何在开发项目里进行自我激励!
  6. iphone5隐藏功能
  7. sysctl与devlink总结
  8. 线上服装店PHP,服装店从0开始做线上社群营销的五大步骤
  9. consul重新注册,避免注册失败的情况。
  10. 个人自学常用的几个python网站