什么是3dmax扫描线(概念化行业适于设)

2023年8月20日19:04:26什么是3dmax扫描线(概念化行业适于设)已关闭评论

数据结构:

CPoint3D: 3维点类CPolygon: 多边形类CEdge: 边类CActiveEdge: 活化边类

CScanLineZbufferProcess: 扫描线ZBuffer算法实现类,包括3ds文件加载,旋转,扫描过程,显示等。

CPoint3D

classCPoint3D{public:
CPoint3D(void);
CPoint3D(doublea,doubleb,doublec);
~CPoint3D(void);

CPoint3D(CPoint3D&rth);
CPoint3D&operator=(CPoint3D&rth);CPointGetPoint2D();public:doublex;doubley;doublez;

};

CPoint3D::CPoint3D(void)
{
x=y=z=0;
}
CPoint3D::CPoint3D(doublea,doubleb,doublec)
{
x=a;y=b;z=c;
}
CPoint3D::CPoint3D(CPoint3D&rth)
{
x=rth.x;
y=rth.y;
z=rth.z;
}

CPoint3D& CPoint3D::operator=(CPoint3D&rth)
{
x=rth.x;
y=rth.y;
z=rth.z;return*this;
}

CPoint CPoint3D::GetPoint2D()
{CPointp(x,y);returnp;
}

CPoint3D::~CPoint3D(void)
{
}

CEdge 类

classCEdge{public:CEdge(void);CEdge(CEdge&rth);~CEdge(void);public:CEdge&operator=(CEdge &rth);voidPoints2Edge(CPoint3D p1, CPoint3D p2);public:doublex;//边的上端点x的坐标doubledx;//相邻两条扫描线交点的x坐标差dx (-1/k)intdy;//边跨越的扫描线数目intid;//边所属多边形的编号intyMax;//CEdge*next;};CEdge::CEdge(void){x=0;dx=0;dy=0;id=-1;next=NULL;yMax=-100000;}CEdge::CEdge(CEdge &rth){x=rth.x;dx=rth.dx;dy=rth.dy;id=rth.id;next=rth.next;yMax=rth.yMax;}CEdge&CEdge::operator=(CEdge &rth){x=rth.x;dx=rth.dx;dy=rth.dy;id=rth.id;next=rth.next;yMax=rth.yMax;return*this;}CEdge::~CEdge(void){if(next)deletenext;}voidCEdge::Points2Edge(CPoint3D p1, CPoint3D p2){/*CPoint3DtopPoint = p1;yMax=p1.y;dy=abs(p1.y-p2.y);*/dy=abs(p1.y-p2.y);if(p1.y>p2.y){//p1是TOPpointyMax=p1.y;x=p1.x;if(dy!=0){dx=(p2.x-p1.x)/(p1.y-p2.y);}}else{//p2是TOPpointyMax=p2.y;x=p2.x;if(dy!=0){dx=(p1.x-p2.x)/(p2.y-p1.y);}}dy+=1;}

CEdgeList

classCEdgeList{public:
CEdgeList(void);
~CEdgeList(void);public:intymax;
CEdge *head;
};
CEdgeList::CEdgeList(void)
{
ymax =-1;
head=NULL;
}

CEdgeList::~CEdgeList(void)
{
}

CActiveEdge

classCActiveEdge{
public:CActiveEdge(void);
~CActiveEdge(void);
public:doublexl;//左交点的x坐标doubledxl;//(左交点边上)两相邻扫描线交点的x坐标之差intdyl;//以和左交点所在边相交的扫描线数为初值,doublexr;//右交点的x坐标doubledxr;//(右交点边上)两相邻扫描线交点的x坐标之差intdyr;//以和右交点所在边相交的扫描线数为初值,doublezl;//左交点处多边形所在平面的深度值;doubledzx;//沿扫描线向右走过一个像素时,多边形所在平面的深度增量。对于平面方程,dzx=-a/c(c≠0);doubledzy;//沿y方向向下移过一根扫描线时,多边形所在平面的深度增量。对于平面方程,dzy=b/c(c≠0);intid;//交点对所在的多边形的编号;CActiveEdge*next;

};CActiveEdge::CActiveEdge(void)
{
dxl =0;
dxr=0;
dyl=0;
dyr=0;
dzx=0;
dzy=0;
xl=0;
xr=0;
zl=0;

next =NULL;id=-1;
}CActiveEdge::~CActiveEdge(void)
{
}

CPolygon

//这里的多边形都是三角形,方便计算classCPolygon{public:
CPolygon(void);
CPolygon(CPolygon &rth);voidPoint2Face(CPoint3D p1, CPoint3D p2, CPoint3D p3);voidPoint2Face(CPoint3D *p,intnpoints);voidget_dy();CEdge*getEdgeList();//获取边表voidClearHorizontalEdge();//清除水平边.平行X的边~CPolygon(void);public:
CPolygon&operator=(CPolygon &rth);public:doublea,b,c,d;//多边形所在平面的方程系数ax+by+cz+d=0intid;//多边形的编号intdy;//多边形跨越的扫描线数目COLORREF color;//多边形的颜色intyMax;intnPoints;//点数CPolygon *next;

CPoint3D *point;//按顺序的点,要求前三个不能是共线的点};include"StdAfx.h"include"Polygon.h"CPolygon::CPolygon(void)
{
a =0;
b =0;
c =0;
d =0;

id =-1;
dy =0;

color = RGB(255,255,255);//默认底色为白next =NULL;

nPoints =0;
yMax =-100000;
}
CPolygon::CPolygon(CPolygon &rth)
{
a = rth.a;
b = rth.b;
c = rth.c;
d = rth.d;

id = rth.id;
dy = rth.dy;
color = rth.color;

next = rth.next;

}
CPolygon& CPolygon::operator=(CPolygon &rth)
{
a =rth.a;
b =rth.b;
c =rth.c;
d = rth.d;

id = rth.id;
dy = rth.dy;
color = rth.color;

point = rth.point;
nPoints = rth.nPoints;

next = rth.next;return*this;
}//三点不共线下求平面方程参数voidCPolygon::Point2Face(CPoint3D p1, CPoint3D p2, CPoint3D p3)
{doublex1 = p1.x, y1 = p1.y, z1 = p1.z;doublex2 = p2.x, y2 = p2.y, z2 = p2.z;doublex3 = p3.x, y3 = p3.y, z3 = p3.z;

a = (y2-y1)*(z3-z1)-(y3-y1)*(z2-z1);
b = (x3-x1)*(z2-z1)-(x2-x1)*(z3-z1);
c = (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);

d = -(a*x1+b*y1+c*z1);

}//voidCPolygon::Point2Face(CPoint3D *p,intnpoints)
{
point = p;
nPoints = npoints;

Point2Face(p[0],p[1],p[2]);
}//求出dyvoidCPolygon::get_dy()
{
CPoint3D *p = point;intyMin =100000;for(inti=0;iCScanLineZbufferProcessclassCScanLineZbufferProcess{public:
CScanLineZbufferProcess(void);
~CScanLineZbufferProcess(void);public:intnWidth,nHeight;//显示屏幕的尺寸CPaintDC *pDC;
CPolygonList *PolygonList;//分类的多边形表CEdgeList *EdgeList;//分类边表CPolygonList *ActivePolygonList;//活化分类的多边形表CActiveEdge *ActiveEdgeList;//活化分类边表COLORREF *FrameBuffer;//帧缓冲器double*ZBuffer;//z缓冲器COLORREF BackGroundColor;//背景色doubleminZ;//最小z值public:voidInitBuffer(intwidth,intheight,CPaintDC *pdc);//void InitPolygonListEdgeList();voidSortEdge(CEdge* pEdge);boolAddActivePolygonList(inty);//添加新多边形进活化多边形表voidUpdateActivePolygonList();//更新多边形进活化多边形表boolAddActiveEdgeList(inty);//添加新边堆到活化边表voidUpdateActiveEdgeList(inty);//更新新边对中的一边,由于一边结束,而多边形还在扫描区域,删除一条边,加入新边boolIsInActivePolygonList(intid);//指定的多边形是否在活化多边形表中COLORREFGetPolygonColor(intid);//获取多边形的颜色voidUpdateZBufferColor(inty);voidScan();voidShow();voidOnX(doubleangle, CPoint3D *p);voidOnY(doubleangle, CPoint3D *p);voidAddFace(CPoint3D *pFacePoint,intnpoints, COLORREF faceColor);//增加面intfaceid;public:
Lib3dsFile *model;boolLoad3ds(char*argv);//加载3ds文件voidrender_node(Lib3dsNode *node);boolbInit;floatm_Scale;//缩放比例floatm_Max;voidgetScalFor3dsFile(char*argv);voidget_nodeMax(Lib3dsNode *node);voidClear();//清除所有数据boolm_bYZ;boolm_EdgeShow;doubleangle_x;//绕x轴旋转角度doubleangle_y;//绕y轴旋转角度include "StdAfx.h"include "ScanLineZbufferProcess.h"include CScanLineZbufferProcess::CScanLineZbufferProcess(void)
{
faceid =-1;
BackGroundColor = RGB(255,255,255);//背景为白色minZ =-100000;

bInit =false;

m_bYZ =false;//false:Y轴在上,Z轴为深度 true:Z轴在上,Y轴为深度angle_x =0.0;
angle_y =0.0;

m_EdgeShow =false;

}

CScanLineZbufferProcess::~CScanLineZbufferProcess(void)
{
Clear();
}//清除所有数据void CScanLineZbufferProcess::Clear()
{for(int y = nHeight/2; y>-nHeight/2;y--)//从上往下扫描{try{//删除多边形表CPolygon *oldPolygon = PolygonList[y+nHeight/2].head;//y是当前的扫描线y值if(oldPolygon)
delete oldPolygon;

PolygonList[y+nHeight/2].head =NULL;

CEdge* tpEdge = EdgeList[y+nHeight/2].head;//删除边表if(tpEdge)
delete tpEdge;

EdgeList[y+nHeight/2].head =NULL;

}catch(...)
{
}
}//清除FrameBuffer、ZBufferint nCount = nWidth*nHeight;for(int i=0;i0人点赞

图形学


懵懂先生