matlab3dobject.cpp

来自「VC&Matlab混合编程实现无线电导航指示器」· C++ 代码 · 共 277 行

CPP
277
字号
// Matlab3DObject.cpp: implementation of the CMatlab3DObject class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RADIO.h"
#include "Matlab3DObject.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMatlab3DObject::CMatlab3DObject(mwArray mwParentAx)
{
 m_patchList.SetSize(0,3);
 m_OriginalDataList.SetSize(0,3);
 m_mwhParentAx=mwParentAx;

}

CMatlab3DObject::CMatlab3DObject()
{
 m_patchList.SetSize(0,3);
 m_OriginalDataList.SetSize(0,3);
}

CMatlab3DObject::~CMatlab3DObject()
{

}

void CMatlab3DObject::AddPatchElement(mwArray mwPatch)
{   
	mwArray zdata=get(mwPatch,"zdata");
	if(tobool(isempty(zdata))){
		mwArray newzdata=zeros(1,length(get(mwPatch,"xdata")));
		Vset(mwPatch,"zdata",newzdata);
	}
	m_patchList.Add(mwPatch);
	mwArray x=get(mwPatch,"xdata");
	mwArray y=get(mwPatch,"ydata");
	mwArray z=get(mwPatch,"zdata");
	mwArray c;
	c.cell(1)=x;c.cell(2)=y;c.cell(3)=z;
	m_OriginalDataList.Add(c);
}

mwArray CMatlab3DObject::GetPatchElements()
{
	int n=m_patchList.GetSize();
	if(n<=0) return mwArray(-1);
	mwArray mwElements=(mwArray)m_patchList[0];
	for (int i=1;i<n;i++){
		mwElements=horzcat(mwElements,(mwArray)m_patchList[i]);
	}
	return mwElements;
}

mwArray CMatlab3DObject::GetParentAx()
{
return m_mwhParentAx;
}

void CMatlab3DObject::Show()
{//显示
int n=m_patchList.GetSize();
	if(n<=0) return ;
	mwArray mwElements=(mwArray)m_patchList[0];
	for (int i=1;i<n;i++){
		mwElements=horzcat(mwElements,(mwArray)m_patchList[i]);
	}
	Vset(mwElements,"visible","on");
}

void CMatlab3DObject::Hide()
{//隐藏
int n=m_patchList.GetSize();
	if(n<=0) return ;
	mwArray mwElements=(mwArray)m_patchList[0];
	for (int i=1;i<n;i++){
		mwElements=horzcat(mwElements,(mwArray)m_patchList[i]);
	}
	Vset(mwElements,"visible","off");
}

void CMatlab3DObject::SetParent(mwArray mwParent)
{
 m_mwhParentAx=mwParent;
}

void CMatlab3DObject::OffSet(double x, double y, double z)
{//偏置
	int n=m_patchList.GetSize();
	if(n<=0) return ;
	mwArray mwElement,d1,d2,d3;
	for (int i=0;i<n;i++){
		mwElement=m_patchList[i];
        d1=get(mwElement,"xdata");
		d2=get(mwElement,"ydata");
		d3=get(mwElement,"zdata");
		Vset(mwElement,"xdata",d1+x,"ydata",d2+y,"zdata",d3+z);
	}
}



void CMatlab3DObject::Scale(double x, double y, double z)
{
//缩放	
	int n=m_patchList.GetSize();
	if(n<=0) return ;
	mwArray mwElements,d1,d2,d3;
	for (int i=0;i<n;i++){
		mwElements=(mwArray)m_patchList[i];
        d1=get(mwElements,"xdata");
		d2=get(mwElements,"ydata");
		d3=get(mwElements,"zdata");
		Vset(mwElements,"xdata",d1*x,"ydata",d2*y,"zdata",d3*z);
	}	
}

void CMatlab3DObject::ResetToOriginal()
{//设为原始值
	int n=m_patchList.GetSize();
	if(n<=0) return ;
	mwArray mwElement,mwData,d1,d2,d3;
	for (int i=0;i<n;i++){
		mwElement=(mwArray)m_patchList[i];
		mwData=(mwArray)m_OriginalDataList[i];
        d1=mwData.cell(1);
		d2=mwData.cell(2);
		d3=mwData.cell(3);
		Vset(mwElement,"xdata",d1,"ydata",d2,"zdata",d3);
	}	
}

void CMatlab3DObject::ScaleOriginal(double x, double y, double z)
{//相对于原始大小缩放
	mwArray mwData,mwElement,d1,d2,d3;
	int n=m_OriginalDataList.GetSize();
	if(n<=0) return ;
	for (int i=0;i<n;i++){
		mwData=(mwArray)m_OriginalDataList[i];
		mwElement=(mwArray)m_patchList[i];
        d1=mwData.cell(1);
		d2=mwData.cell(2);
		d3=mwData.cell(3);
		Vset(mwElement,"xdata",d1*x,"ydata",d2*y,"zdata",d3*z);
	}	
}

void CMatlab3DObject::OffSetOriginal(double x, double y, double z)
{//相对于原始位置移动
	mwArray mwData,mwElement,d1,d2,d3;
	int n=m_OriginalDataList.GetSize();
	if(n<=0) return ;
	for (int i=0;i<n;i++){
		mwData=(mwArray)m_OriginalDataList[i];
		mwElement=(mwArray)m_patchList[i];
        d1=mwData.cell(1);
		d2=mwData.cell(2);
		d3=mwData.cell(3);
		Vset(mwElement,"xdata",d1+x,"ydata",d2+y,"zdata",d3+z);
	}	
}



void CMatlab3DObject::Rotate( mwArray azel, mwArray alpha, mwArray origin)
{
//指定方向和原点转
// ROTATE([THETA PHI],ALPHA,[x0,y0,z0]) 
//或ROTATE([X Y Z],ALPHA,[x0,y0,z0]) 
//逆时针转为正。角度单位是度

	mwArray theta,phi,u;
	mwArray alph,cosa,sina,vera;
	mwArray x,y,z;
	mwArray rot;
	mwArray t;
	mwArray skip;
	mwArray m,n;
	mwArray newxyz,newx,newy,newz;
	mwArray p;
	mwArray h=GetPatchElements();
    // 得到转轴的单位矢量
	if (tobool(prod(size(azel)) == mwArray(2)))//theta, phi
	{ 
		theta = pi()*azel(1)/mwArray(180);
		phi = pi()*azel(2)/mwArray(180);
		u = horzcat(cos(phi)*cos(theta), cos(phi)*sin(theta),sin(phi));
	}
	else if (tobool(prod(size(azel)) == mwArray(3)))// 方向向量
	{   
		u = azel(colon())/norm(azel);
	}
	
	alph = alpha*pi()/mwArray(180);
	cosa = cos(alph);
	sina = sin(alph);
	vera = mwArray(1) - cosa;
	x = u(1);
	y = u(2);
	z = u(3);
	rot =transpose(vertcat(horzcat(cosa+x*x*vera ,x*y*vera-z*sina ,x*z*vera+y*sina),
	                       horzcat(x*y*vera+z*sina ,cosa+y*y*vera, y*z*vera-x*sina),
                           horzcat(x*z*vera-y*sina ,y*z*vera+x*sina ,cosa+z*z*vera)));
	
	for (int i=1;i<=(int)(prod(size(h)).ExtractScalar(1));i++)
	{
		t = get(h(i),"type");
		skip = mwArray(0);
		if (tobool(strcmp(t,"surface")) || tobool(strcmp(t,"patch")) || tobool(strcmp(t,"line")))
		{
			x = get(h(i),"xdata");
			y = get(h(i),"ydata");
			z = get(h(i),"zdata");
			if (tobool(isempty(z)))
			{
				z = -origin(3)*ones(size(y));
			}
			m= size(z,1);
			n=size(z,2);
			if (tobool(prod(size(x)) < m*n))
			{
				x = meshgrid(&y,x,y);
			}
		}
		else if (tobool(strcmp(t,"text")))
			{
				p = get(h(i),"position");
				x = p(1); y = p(2); z = p(3);
			}
		else if (tobool(strcmp(t,"image")))
			{
				x = get(h(i),"xdata");
				y = get(h(i),"ydata");
				z = zeros(size(x));
			}
		else
			{
				skip = mwArray(1);
			}		
		
		if (!tobool(skip))
		{
			m=size(x,1);
			n=size(x,2);
			newxyz = horzcat(x(colon())-origin(1), y(colon())-origin(2), z(colon())-origin(3));
			newxyz = newxyz*rot;
			newx = origin(1) + reshape(newxyz(colon(),1),m,n);
			newy = origin(2) + reshape(newxyz(colon(),2),m,n);
			newz = origin(3) + reshape(newxyz(colon(),3),m,n);
			
			if (tobool(strcmp(t,"surface")) || tobool(strcmp(t,"patch")) || tobool(strcmp(t,"line")))
			{
				Vset(h(i),"xdata",newx,"ydata",newy,"zdata",newz);
			}
			else if (tobool(strcmp(t,"text")))
			{
				Vset(h(i),"position",horzcat(newx,newy,newz));
			}
			else if (tobool(strcmp(t,"image")))
			{
				Vset(h(i),"xdata",newx,"ydata",newy);
			}
		}
	}	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?