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

📄 planemodelsysdlg.cpp

📁 该系统可用于航模定位,输入三维空间中某一点到固定三点的距离即可计算出该点的三维坐标.并调用了MATLAB画出三维图形
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		//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 + -