资源简介
计算机图形学课程设计代码(运用MFC编写的)之真实感图形学
代码片段和文件信息
/////////////////////////////////////////////////////////////////////////////////
//
// BLine.cpp: implementation of the CBLine class.
#include “stdafx.h“
#include “BLine.h“
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBLine::CBLine()
{
}
CBLine::~CBLine()
{
}
//绘制一条直线直线的宽度为1直线的颜色由直线两个端点的颜色共同决定
//注意浮点颜色的有效值为[01]区间内的浮点小数
//与Windows相对应该算法也不包含最后一个点(x2y2)
//z1z2为当前点的深度值
//pCBpZB分别为颜色缓冲和深度缓冲
//注意从(x1y1)--(x2y2)与(x2y2)--(x1y1)略有些许不同.
//评价:该函数绘制的直线(像素位置)与Windows的LineTo()函数绘制的结果是完全一致的
void CBLine::Draw(int x1int y1 int x2 int y2 float z1 float z2 FLOATCOLORRGBA clr1 FLOATCOLORRGBA clr2 CColorBuffer* pCB CZBuffer* pZB)
{
//两端点间的水平偏移量和垂直偏移量
int nDx = x2 - x1;
int nDy = y2 - y1;
//两端点间的水平距离和垂直距离
int nIx = ABS(nDx);
int nIy = ABS(nDy);
//描点步数(增量总值)
int nInc = MAX(nIxnIy);
//直线当前点的颜色
float fPlotR = clr1.red fPlotG = clr1.green fPlotB = clr1.blue fPlotA = clr1.alpha;
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
//主要考察区开始
//缓冲区中的深度
float zInBuffer = pZB->GetDepth(x1y1);
//当前深度
float z = z1;
//如果当前点的z坐标小于深度缓冲区中的相同位置z的坐标
if(z < zInBuffer)
{
//在颜色缓冲区中绘制第一个点
pCB->SetPixel(x1 y1 fPlotR fPlotG fPlotB fPlotA);
//重置深度缓冲区的值
pZB->SetDepth(x1 y1 z);
}
if(nInc < 2) return;
//沿直线的深度增量
float fIncZ = (z2 - z1) / nInc;
//结束
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
//用于判断是否在nJudgeXnJudgeY方向上向前进
int nJudgeX = -nIy nJudgeY = -nIx;
//通过增量计算得到的当前点
int x = x1 y = y1;
//开始进行增量计算
//采用Bresenham算法.在这里我们将算法进行改进
//使其对于任意斜率的直线都能绘制而且绘制方向始终为从起点绘制到终点
//与Windows相对应该算法也不包含最后一个点(x2y2)
nInc--;
//注意整数乘2在计算机中采用移位实现
//Bresenham算法
int nTwoIx = 2 * nIx nTwoIy = 2 * nIy;
//颜色增量
float fIncR = (clr2.red - fPlotR) / nInc;
float fIncG = (clr2.green - fPlotG) / nInc;
float fIncB = (clr2.blue - fPlotB) / nInc;
float fIncA = (clr2.alpha - fPlotA) / nInc;
//开始增量计算
for(int i = 0;i < nInc; i++)
{
nJudgeX += nTwoIx;
nJudgeY += nTwoIy;
//通过增量法计算的当前点是否属于直线上的点
BOOL bPlot = FALSE;
//检测 nJudgeX 方向
if(nJudgeX >= 0)
{
bPlot = TRUE;
nJudgeX -= nTwoIy;
//将任意走向的直线统一起来
if(nDx > 0)x++;
else if(nDx < 0)x--;
}
//检测 nJudgeY 方向
if(nJudgeY >= 0)
{
bPlot = TRUE;
nJudgeY -= nTwoIx;
//将任意走向的直线统一起来
if(nDy > 0)y++;
else if(nDy < 0)y--;
}
//如果当前点在直线上
if(bPlot)
{
fPlotR += fIncR;
fPlotG += fIncG;
fPlotB += fIncB;
fPlotA += fIncA;
////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4183 2004-11-28 23:11 真实感图形学\BLine.cpp
文件 554 2004-11-28 23:11 真实感图形学\BLine.h
文件 12025 2004-11-28 23:11 真实感图形学\BRender.cpp
文件 987 2004-11-28 23:11 真实感图形学\BRender.h
文件 15402 2004-11-28 23:11 真实感图形学\BTriangle.cpp
文件 929 2004-11-28 23:11 真实感图形学\BTriangle.h
文件 4834 2004-11-28 23:11 真实感图形学\ColorBuffer.cpp
文件 1181 2004-11-28 23:11 真实感图形学\ColorBuffer.h
文件 7363 2004-11-28 23:15 真实感图形学\Debug\BLine.obj
文件 33931 2004-11-28 23:15 真实感图形学\Debug\BRender.obj
文件 18243 2004-11-28 23:15 真实感图形学\Debug\BTriangle.obj
文件 15285 2004-11-28 23:15 真实感图形学\Debug\ColorBuffer.obj
文件 28281 2004-11-28 23:15 真实感图形学\Debug\Edge.obj
文件 27824 2004-11-28 23:15 真实感图形学\Debug\Facet.obj
文件 8204 2004-11-28 23:15 真实感图形学\Debug\FloatColor.obj
文件 21016 2004-11-28 23:15 真实感图形学\Debug\Lighting.obj
文件 10976 2004-11-28 23:15 真实感图形学\Debug\LightObj.obj
文件 21050 2004-11-28 23:45 真实感图形学\Debug\MainFrm.obj
文件 8000 2004-11-28 23:15 真实感图形学\Debug\Material.obj
文件 42504 2004-11-28 23:15 真实感图形学\Debug\Matrix3d.obj
文件 89044 2004-11-28 23:15 真实感图形学\Debug\ob
文件 56337 2004-11-28 23:15 真实感图形学\Debug\Sphere.obj
文件 106155 2004-11-28 22:59 真实感图形学\Debug\StdAfx.obj
文件 4230 2004-11-28 23:15 真实感图形学\Debug\Subob
文件 2161 2004-11-28 23:15 真实感图形学\Debug\TypedStack.obj
文件 304128 2004-12-06 13:17 真实感图形学\Debug\vc60.idb
文件 389120 2004-12-06 13:17 真实感图形学\Debug\vc60.pdb
文件 26026 2004-11-28 23:15 真实感图形学\Debug\Vector3d.obj
文件 28144 2004-11-28 23:15 真实感图形学\Debug\Vertex3d.obj
文件 6446 2004-11-28 23:15 真实感图形学\Debug\ViewFinder.obj
............此处省略76个文件信息
- 上一篇:白话C++全本23章
- 下一篇:计算机图形学简单CAD系统
评论
共有 条评论