?? matlab3dobject.cpp
字號:
// 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -