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