📄 planemodelsysdlg.cpp
字号:
//ch[0]
BYTE a=*((char*)rxdata+0);//读高位
//ch[1]
BYTE b=*((char*)rxdata+1);//读低位
// temp=int(int(a)*16+int(b));
// strtemp.Format("%c",ch[0]);
// temp = int(b);
m_strRXData+=temp;
*/
// m_strRXData+=int(len);
//m_strRXData++;
//temp=int(ch[0]);
//temp=int(int(ch[0])*16+int(ch[1]));//把接收到的2个字符转化为temp(0x03FF-0x0000)
//temp=int(int(ch[0])*10+int(ch[1]));//把接收到的2个字符转化为temp(0x03FF-0x0000)
//m_strRXData+=temp; //加入接收编辑框对应字符串
/* len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=1;k<len;k++)
//safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE数组
ch[0]=*(char*)rxdata;//读高位
m_strRXData+=ch[0];*/
/* for(k=0;k<len-1;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
*/
}
UpdateData(FALSE); //更新编辑框内容
}
void CPlaneModelSysDlg::OnOnCommMscomm2()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
char ch[3];
int temp;//临时变量
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
char a[2048];
if(m_ctrlComm2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm2.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=7;
for (k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE数组
ch[0]=*((char*)rxdata+3);//读百位
ch[1]=*((char*)rxdata+4);//读十位
ch[2]=*((char*)rxdata+5);//读个位
temp=int((int(ch[0])-48)*100+(int(ch[1])-48)*10+(int(ch[2])-48));//把接收到的2个字符转化为temp(0x03FF-0x0000)
m_strRXData2=temp;
}
UpdateData(FALSE); //更新编辑框内容
}
void CPlaneModelSysDlg::OnOnCommMscomm3()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
char ch[3];
int temp;//临时变量
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
char a[2048];
if(m_ctrlComm3.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm3.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=7;
for (k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE数组
ch[0]=*((char*)rxdata+3);//读百位
ch[1]=*((char*)rxdata+4);//读十位
ch[2]=*((char*)rxdata+5);//读个位
temp=int((int(ch[0])-48)*100+(int(ch[1])-48)*10+(int(ch[2])-48));//把接收到的2个字符转化为temp(0x03FF-0x0000)
m_strRXData3=temp;
}
UpdateData(FALSE); //更新编辑框内容
}
// OnStop()停止从录入数据
void CPlaneModelSysDlg::OnStop()
{
// TODO: Add your control notification handler code here
KillTimer(1);
}
void CPlaneModelSysDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//保留上两次的飞机在坐标上的位置
m_lastCoordinateX = m_CoordinateX;
m_lastCoordinateY = m_CoordinateY;
++m_temp;
//从编辑空件获得AM,BM,CM值
UpdateData(true);
float m_DstAM = m_strRXData1 / 100.0f;
float m_DstBM = m_strRXData2 / 100.0f;
float m_DstCM = m_strRXData3 / 100.0f;
m_CoordinateX = (pow(m_DstBM, 2) - pow(m_DstCM, 2) + 3) / 2;
m_CoordinateY = (pow(m_DstBM, 2) - pow(m_DstAM, 2) + 3) / 2;
m_CoordinateZ = abs(sqrt(2*pow(m_DstAM, 2) + 2*pow(m_DstBM, 2)*pow(m_DstCM, 2)
+ 2*pow(m_DstBM, 2)*pow(m_DstAM, 2) + 2*pow(m_DstCM, 2) -2
- 2*pow(m_DstBM, 4) - pow(m_DstCM, 4) - pow(m_DstAM, 4))) / 2;
//计算飞机的速度
if(m_temp > 1)
{
m_Speed = sqrt(pow(m_CoordinateX - m_lastCoordinateX, 2)
+ pow(m_CoordinateY - m_lastCoordinateY, 2)) / 1.0f;
}
UpdateData(false);
float g = 9.8;
float m_time = sqrt(2 * m_CoordinateZ / g);
m_oldDistant = m_distant;
m_distant = m_Speed * m_time;
//通过飞机前后两点连线的斜率和最新点与中心点连线的斜率
//判断飞机的飞行方向是否与投掷中心点一致
//飞机的坐标在目标区域内才显示出来
if (m_CoordinateX >= 0.0f && m_CoordinateX <= 3.0f &&
m_CoordinateY >= 0.0f && m_CoordinateY <= 3.0f)
{
if (m_arrayPosition > 11)
{
m_bLine = true;
m_FirstCoordinateX = m_CoordinateArray[0];
m_FirstCoordinateY = m_CoordinateArray[1];
m_SecondCoordinateX = m_CoordinateArray[2];
m_SecondCoordinateY = m_CoordinateArray[3];
for (int i=0; i < 10; ++i)
{
m_CoordinateArray[i] = m_CoordinateArray[i+2];
}
m_arrayPosition = 10;
}
m_CoordinateArray[m_arrayPosition] = m_CoordinateX;
m_CoordinateArray[m_arrayPosition + 1] = m_CoordinateY;
m_arrayPosition += 2;
CClientDC dc(this);
CBrush m_brushRed(RGB(255, 0, 0));
CBrush *m_pOldBrushRed = dc.SelectObject(&m_brushRed);
dc.Ellipse(m_CoordinateX * 100 + 26, 330 - m_CoordinateY * 100 - 4,
m_CoordinateX * 100 + 34, 330 - m_CoordinateY * 100 + 4);
dc.SelectObject(m_pOldBrushRed);
if (m_lastCoordinateX >= 0.0f && m_lastCoordinateX <= 3.0f &&
m_lastCoordinateY >= 0.0f && m_lastCoordinateY <= 3.0f)
{
CPen m_penMagenta(PS_SOLID, 2, RGB(255, 0, 255));
CPen *m_OldpenMagenta = dc.SelectObject(&m_penMagenta);
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(m_lastCoordinateX * 100 + 30, 330 - m_lastCoordinateY * 100);
dc.LineTo(m_CoordinateX * 100 + 30, 330 - m_CoordinateY * 100);
dc.SelectObject(m_OldpenMagenta);
float k = 0.0f;
float k1 = 0.0f;
//判断斜率是否为无穷大的情况
// k:目标区域内前后两个位置连线的斜率
// k1:飞机所在位置与投放区域的中心点的连线的斜率
if (m_CoordinateX == m_lastCoordinateX)
{
if (m_CoordinateX == 1.8f) // k,k1为无穷大
{
k = k1;
}
else if (m_CoordinateY == m_lastCoordinateY)
{
k = k1;
}
else // k为无穷大,k1不为无穷大, k != k1
{
k = 0.0f;
k1 = 1.0f;
}
}
else
{
if (m_CoordinateX != 1.8f)
{
k = (m_CoordinateY - m_lastCoordinateY) / (m_CoordinateX - m_lastCoordinateX);
k1 = (1.5f - m_CoordinateY) / (1.5f - m_CoordinateX);
}
else // k不为无穷大,k1为无穷大, k != k1
{
k = 0.0f;
k1 = 1.0f;
}
}
if (k1 == k)
{
m_position = _T("一致");
UpdateData(false);
CBrush *m_brush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *m_pOldbrush = dc.SelectObject(m_brush);
if (m_bCircle)
{
// 清除原先的投放半径所形成的圆
dc.Ellipse(180-m_oldDistant*100, 180-m_oldDistant*100, 180+m_oldDistant*100, 180+m_oldDistant*100);
}
//显示在当前速度和高度下的投掷位置
//第一个圆表示在刚好能投掷到中心点
dc.Ellipse(180-m_distant*100, 180-m_distant*100, 180+m_distant*100, 180+m_distant*100);
dc.SelectObject(m_pOldbrush);
m_bCircle = true;
}
else
{
m_position = _T("不一致");
UpdateData(false);
if (m_bCircle)
{
// 清除原先的投放半径所形成的圆
dc.Ellipse(180-m_oldDistant*100, 180-m_oldDistant*100, 180+m_oldDistant*100, 180+m_oldDistant*100);
}
m_bCircle = false;
}
// 删除先前两点之间的连线
CClientDC pdc(this);
CPen m_oldpen(PS_SOLID, 2, RGB(255, 0, 255));
CPen *m_oldpenmagenta = dc.SelectObject(&m_oldpen);
if (m_bLine)
{
dc.MoveTo(m_FirstCoordinateX * 100 + 30, 330 - m_FirstCoordinateY * 100);
dc.LineTo(m_SecondCoordinateX * 100 + 30, 330 - m_SecondCoordinateY * 100);
}
dc.SelectObject(m_oldpenmagenta);
}
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -