想要将一个围栅中提取到的所有元素同时进行平移旋转需要每个元素都确定一个平移的终点吗

如图 想将上图中每个围栅中所有的内容进行平移旋转到X轴上

Parents
  • 平移实际不是指定的平移终点,而是平移的量,例如下图所示的构造Transform实例的函数,translation这个参数并不是指的是将元素平移到这个点上,而是将元素平移这个量,例如translation传(1000,0,0)的话表示将元素沿+X方向平移1000。对于您图中的情况,显然是每个围栅都要确定一个平移量,而且还要构造一个旋转才能完成最终的变换。

  • 我这有个思路是想把所有元素加到cell中一起处理

  • 没必要,除非您最终目的就是为了把各个围栅中的元素合并成一个cell,还是我上边回复的,您需要对每一个围栅构造一个旋转变换矩阵,然后对这个围栅内的所有元素都施加这个旋转变换即可,构造旋转矩阵请参考如下代码:

    FenceManagerR fenceManager = FenceManager::GetManager();
    	if (fenceManager.IsFenceActive() == false)
    		return;
    
    	DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP();
    	FenceParamsP fenceParams = FenceParams::Create(pActiveModel);
    	if (SUCCESS != FenceManager::GetManager().InitFromActiveFence(*fenceParams, true, true, FenceClipMode::Copy))
    		return;
    	ClipPrimitivePtr clipPri = fenceParams->GetClipVector()->at(0);
    	ClipPolygonCP clipPoly=	clipPri->GetPolygon();
    	bvector< DPoint3d> ptVec;
    	TransformP tran= fenceParams->GetTransform();
    	mdlTMatrix_getInverse(tran, tran);
    	for (ClipPolygon::const_iterator iter = clipPoly->begin(); iter != clipPoly->end(); ++iter)
    	{
    		DPoint3d curPt = { iter->x,iter->y,0 };
    		mdlTMatrix_transformPoint(&curPt, tran);
    		ptVec.push_back(curPt);
    	}
    	DVec3d vecX = DVec3d::FromStartEnd(ptVec[0], ptVec[1]);
    	vecX.Normalize();
    	DVec3d vecZ = DVec3d::UnitZ();
    	DVec3d vecY;
    	vecY.CrossProduct(vecZ, vecX);
    	RotMatrix rMatrix = RotMatrix::FromRowVectors(vecX, vecY, vecZ);
    	Transform tranTo = Transform::FromMatrixAndFixedPoint(rMatrix, ptVec[0]);
    	Transform tranTemp = Transform::FromIdentity();
    	DPoint3d offset = ptVec[0];
    	offset.Negate();
    	tranTemp.SetTranslation(offset);
    	mdlTMatrix_multiply(&tranTo, &tranTemp, &tranTo);

Reply
  • 没必要,除非您最终目的就是为了把各个围栅中的元素合并成一个cell,还是我上边回复的,您需要对每一个围栅构造一个旋转变换矩阵,然后对这个围栅内的所有元素都施加这个旋转变换即可,构造旋转矩阵请参考如下代码:

    FenceManagerR fenceManager = FenceManager::GetManager();
    	if (fenceManager.IsFenceActive() == false)
    		return;
    
    	DgnModelP pActiveModel = ISessionMgr::GetActiveDgnModelP();
    	FenceParamsP fenceParams = FenceParams::Create(pActiveModel);
    	if (SUCCESS != FenceManager::GetManager().InitFromActiveFence(*fenceParams, true, true, FenceClipMode::Copy))
    		return;
    	ClipPrimitivePtr clipPri = fenceParams->GetClipVector()->at(0);
    	ClipPolygonCP clipPoly=	clipPri->GetPolygon();
    	bvector< DPoint3d> ptVec;
    	TransformP tran= fenceParams->GetTransform();
    	mdlTMatrix_getInverse(tran, tran);
    	for (ClipPolygon::const_iterator iter = clipPoly->begin(); iter != clipPoly->end(); ++iter)
    	{
    		DPoint3d curPt = { iter->x,iter->y,0 };
    		mdlTMatrix_transformPoint(&curPt, tran);
    		ptVec.push_back(curPt);
    	}
    	DVec3d vecX = DVec3d::FromStartEnd(ptVec[0], ptVec[1]);
    	vecX.Normalize();
    	DVec3d vecZ = DVec3d::UnitZ();
    	DVec3d vecY;
    	vecY.CrossProduct(vecZ, vecX);
    	RotMatrix rMatrix = RotMatrix::FromRowVectors(vecX, vecY, vecZ);
    	Transform tranTo = Transform::FromMatrixAndFixedPoint(rMatrix, ptVec[0]);
    	Transform tranTemp = Transform::FromIdentity();
    	DPoint3d offset = ptVec[0];
    	offset.Negate();
    	tranTemp.SetTranslation(offset);
    	mdlTMatrix_multiply(&tranTo, &tranTemp, &tranTo);

Children