C++根据三点求平行四边形的平分阵列

该代码片段展示了如何使用C++在已知三点和平行四边形条件的基础上,计算并创建一个平分阵列,其中包含了平行四边形各点的坐标。通过计算对角线交点和向量,确定了阵列中点的分布规律。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++根据三点求平行四边形的平分阵列

如下图,已知ABC三个点,且ABCD是平行四边形,求各个点的(阵列)的坐标
在这里插入图片描述


void OnBnClickedButtonCreatematrix3point()
{
	//通过前面三点,计算出第四点
	POINTF64 t_pointMiddle;//对角线交点
	t_pointMiddle.x = (pMain->m_NodeMatrix.m_point_ld.x+
		pMain->m_NodeMatrix.m_point_ru.x)/2;
	t_pointMiddle.y = (pMain->m_NodeMatrix.m_point_ld.y+
		pMain->m_NodeMatrix.m_point_ru.y)/2;

	POINTF64 t_pointRd;//右下角第四点坐标
	t_pointRd.x = 2*t_pointMiddle.x-pMain->m_NodeMatrix.m_point_lu.x;
	t_pointRd.y = 2*t_pointMiddle.y-pMain->m_NodeMatrix.m_point_lu.y;
	//到此四点坐标全部获取到

	POINTF64 vec_upSide;//上边向量
	vec_upSide.x = pMain->m_NodeMatrix.m_point_ru.x - pMain->m_NodeMatrix.m_point_lu.x;
	vec_upSide.y = pMain->m_NodeMatrix.m_point_ru.y - pMain->m_NodeMatrix.m_point_lu.y;
	POINTF64 vec_downSide;//下边向量
	vec_downSide.x = t_pointRd.x - pMain->m_NodeMatrix.m_point_ld.x;
	vec_downSide.y = t_pointRd.y - pMain->m_NodeMatrix.m_point_ld.y;

	
	POINTF64 vec_upUnit;//求上边单位向量,整体向量除以列数
	vec_upUnit.x = vec_upSide.x/(pMain->m_NodeInfo.m_s32Col-1);
	vec_upUnit.y = vec_upSide.y/(pMain->m_NodeInfo.m_s32Col-1);
	POINTF64 vec_downUnit;//求下边单位向量,整体向量除以列数
	vec_downUnit.x = vec_downSide.x/(pMain->m_NodeInfo.m_s32Col-1);
	vec_downUnit.y = vec_downSide.y/(pMain->m_NodeInfo.m_s32Col-1);


	vector<POINTF> vec1;
	vector<POINTF> vec2;
	vector<POINTF> vecdst;
	//开始获取上\下边的所有点
	for(int i=0;i<pMain->m_NodeInfo.m_s32Col;++i)
	{
		POINTF tep;
		tep.x = i*vec_upUnit.x+pMain->m_NodeMatrix.m_point_lu.x;
		tep.y = i*vec_upUnit.y+pMain->m_NodeMatrix.m_point_lu.y;
		vec1.push_back(tep);

		POINTF tep1;
		tep1.x = i*vec_downUnit.x+pMain->m_NodeMatrix.m_point_ld.x;
		tep1.y = i*vec_downUnit.y+pMain->m_NodeMatrix.m_point_ld.y;
		vec2.push_back(tep1);
	}



	//1\先获取上下两边向量,求平均点
	pMain->m_dstPos.clear();
	for(int i=0;i<pMain->m_NodeInfo.m_s32Col;++i)
	{
		if(i%2==0)
		{
			vecdst.push_back(vec1[i]);
			vecdst.push_back(vec2[i]);
		}
		else
		{
			vecdst.push_back(vec2[i]);
			vecdst.push_back(vec1[i]);
		}
	}

	int m=0;
	if(pMain->Databuf!=NULL)
	{
		delete pMain->Databuf;
		pMain->Databuf =NULL;
	}
	pMain->Databuf = new T2DCompareData[pMain->m_NodeInfo.m_s32Col*pMain->m_NodeInfo.m_s32Row];
	if(pMain->Databuf==NULL)
	{
		AfxMessageBox(_T("动态申请内存空间失败,请联系工程师"));
		return;
	}
	bool t_bturn = true;
	for(int i=0;i<vecdst.size()-1;)
	{
		POINTF vec_Unit;
		vec_Unit.x = (vecdst[i+1].x-vecdst[i].x)/(pMain->m_NodeInfo.m_s32Row-1);
		vec_Unit.y = (vecdst[i+1].y-vecdst[i].y)/(pMain->m_NodeInfo.m_s32Row-1);
		if(t_bturn==true)//从上到下
		{
			for(int j=0;j<pMain->m_NodeInfo.m_s32Row;++j)//起始点+单位向量
			{
				T2DCompareData tep;
				tep.px= vecdst[i].x+vec_Unit.x*j;
				tep.py= vecdst[i].y+vec_Unit.y*j;
				pMain->Databuf[m++] = tep;
				pMain->m_dstPos.push_back(tep);
			}
			t_bturn = !t_bturn;
		}
		else//从下到上
		{
			for(int j=0;j<pMain->m_NodeInfo.m_s32Row;++j)//起始点+单位向量
			{
				T2DCompareData tep;
				tep.px= vecdst[i].x+vec_Unit.x*j;
				tep.py= vecdst[i].y+vec_Unit.y*j;
				pMain->Databuf[m++] = tep;
				pMain->m_dstPos.push_back(tep);
			}
			t_bturn = !t_bturn;
		}
		i+=2;
	}
	//开始保存点阵的中心点参数,下次开机直接取用
	SaveMatrix();
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值