什么是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人点赞

图形学

懵懂先生