使用C语言实现二维,三维绘图算法(2)-解析曲面的显示

---- 引言----

每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想, Win32中既然存在画线画点函数, 利用计算机图形学的知识, 我们用可以用纯C调用Win32实现三维绘图, 完全不用借助OpenGL和DirectX, 这有重复造轮子的嫌疑, 但是自己动手实现一遍, 毕竟也是有意义的.

[效果演示]

原始效果(100条浮动曲线)

加密以后的效果(200条浮动曲线)

[浮动水平线法绘图过程]

固定一个y值按步长变换给定一个x值, 从而可计算出平面截线一个点的z坐标值. 将改点投影到xoy平面上, 然后再变换到屏幕上. 如果是曲线端点要填充边界值. 接着检验此点的可见性,并用1表示上方可见, 0表示不可见, -1表示下方可见. 可见性检测就是用当前点的y值与上下浮动水平线数组中相应的元素值进行比较,y值大于上水平线数组中元素值或小于下水平线数组中元素值, 则当前点可见, 否则不可见. 往下再计算同一平面截线的另一点, 和上面点一样, 先投影到坐标平面上, 再变换到屏幕上. 先前的点叫紧前点, 当前的点为当前点. 紧前点和当前点的可见性主要有下面一些可能情形:

[编程实现要点]

曲面函数的定义

float SurfaceFun(float X, float Y)
{
float w1, w2, w3, FV;
w1=*(X-)*(X-) + (Y-)*(Y-) - ;
w2=(X-)*(X-)/ + *(Y-)*(Y-) - ;
w3=(X-)*(X-)/ + *(Y-)*(Y-) - ; if(w1>) w1=;
if(w2>) w2=;
if(w3>) w3=; FV=w1*w1*exp(-w1) + w2*w2*exp(-w2) + w3*w3*exp(-w3); return(FV); }

绘制曲面函数

void DrawSurface()
{
int Xe, Ye, Ln, Pt, XPre, YPre, XCur, YCur, Xi, Yi;
int *pi, LimY, VisCur, VisPre;
float X, Y, Z; LimY=GetWindowHeight();
SetLineColor(BLUE); for(Ln=; Ln<=LNo; ++Ln)
{
Y=Y2-Ln*IncY;
X=X1;
Z=SurfaceFun(X,Y);
CalcuProject(X, Y, Z);
XPre = 0.5 + (XProj-F1)*EchX + C1;
YPre = 0.5 + (YProj-F3)*EchY + C3; FillEdge(XPre, YPre, Xd, Yd); VisPre = VisibilityTest(XPre, YPre); for(Pt=; Pt<=PNo; ++Pt)
{
X=X1+Pt*IncX;
Z=SurfaceFun(X,Y);
CalcuProject(X, Y, Z);
XCur = 0.5 + (XProj-F1)*EchX + C1;
YCur = 0.5 + (YProj-F3)*EchY + C3;
VisCur = VisibilityTest(XCur, YCur); if( (HMax[XCur]==) || (HMin[XCur]==LimY) ) VisCur = VisPre; if(VisCur == VisPre)
{
if( (VisCur==) || (VisCur==-) )
{
if(<=XCur)
PlotLine(XPre, LimY--YPre, Xi, LimY--YCur);
else if(<=YCur)
PlotLine(XPre, LimY--YPre, XPre, LimY--YCur);
else
PlotLine(Xi, LimY--YPre, XPre, LimY--YPre); HorizonInc(XPre, YPre, XCur, YCur);
}
}
else // VisCur!=VisPre
{
if(VisCur==)
{
if(VisPre == )
{
pi = Inter(XPre, YPre, XCur, YCur, HMax);
Xi = *pi;
Yi = *(pi+);
}
else
{
pi = Inter(XPre, YPre, XCur, YCur, HMin);
Xi = *pi;
Yi = *(pi+);
} if(<=Xi)
PlotLine(XPre, LimY--YPre, Xi, LimY--Yi);
else if(<=Yi)
PlotLine(XPre, LimY--Yi, XPre, LimY--Yi);
else
PlotLine(XPre, LimY--YPre, XPre, LimY--YPre); HorizonInc(XPre, YPre, Xi, Yi);
}
else
{
if(VisCur == )
{
if(VisPre == )
{
pi = Inter(XPre, YPre, XCur, YCur, HMax);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(Xi, LimY--Yi, XCur, LimY--YCur);
else if(<=Yi)
PlotLine(XCur, LimY--YCur, XCur, LimY--YCur);
else
PlotLine(XCur, LimY--YCur, XCur, LimY--YCur); HorizonInc(Xi, Yi, XCur, YCur);
}
else
{
pi = Inter(XPre, YPre, XCur, YCur, HMin);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(XPre, LimY--YPre, Xi, LimY--Yi);
else if(<=Yi)
PlotLine(XPre, LimY--YPre, XPre, LimY--Yi);
else
PlotLine(XPre, LimY--YPre, XPre, LimY--YPre); HorizonInc(XPre, YPre, Xi, Yi); pi = Inter(XPre, YPre, XCur, YCur, HMax);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(Xi, LimY--YCur, XCur, LimY--YCur);
else if(<=Yi)
PlotLine(XCur, LimY--Yi, XCur, LimY--YCur);
else
PlotLine(XCur, LimY--YCur, XCur, LimY--YCur); HorizonInc(Xi, Yi, XCur, YCur);
}
}
else // VisCur!=0, VisCur!=1
{
if(VisPre == )
{
pi = Inter(XPre, YPre, XCur, YCur, HMin);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(Xi, LimY--YCur, XCur, LimY--YCur);
else if(<=Yi)
PlotLine(XCur, LimY--Yi, XCur, LimY--YCur);
else
PlotLine(XCur, LimY--YCur, XCur, LimY--YCur); HorizonInc(Xi, Yi, XCur, YCur);
}
else // VisCur!=0, VisCur!=1, VisPre!=0
{
pi = Inter(XPre, YPre, XCur, YCur, HMax);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(XPre, LimY--YPre, Xi, LimY--Yi);
else if(<=Yi)
PlotLine(XPre, LimY--YPre, XPre, LimY--Yi);
else
PlotLine(XPre, LimY--YPre, XPre, LimY--YPre); HorizonInc(XPre, YPre, Xi, Yi); pi = Inter(XPre, YPre, XCur, YCur, HMin);
Xi = *pi;
Yi = *(pi+); if(<=Xi)
PlotLine(Xi, LimY--Yi, XCur, LimY--YCur);
else
PlotLine(XCur, LimY--YCur, XCur, LimY--YCur); HorizonInc(Xi, Yi, XCur, YCur);
}
}
}
} VisPre = VisCur;
XPre = XCur;
YPre = YCur;
} FillEdge(XCur, YCur, Xg, Yg);
}
}

使用C语言实现二维,三维绘图算法(2)-解析曲面的显示的更多相关文章

  1. 使用C语言实现二维,三维绘图算法(1)-透视投影

    使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...

  2. 使用C语言实现二维,三维绘图算法(3)-简单的二维分形

    使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  3. ARCGIS二维三维导航

    在使用代码前需要先安装arcgis10.0    或者10.1都可以    不过本人建议初学者安装10.0比较容易安装.. 安装方式和二维三维地图的加载网上都有,就不在此一一赘述了. 先从基本的功能开 ...

  4. Atitit zxing二维码qr码识别解析

    Atitit zxing二维码qr码识别解析 1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar  2 1.3. atitit.二维码生成总结java zxing ...

  5. ZXing二维码的生成和解析

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法, 现在我简单介绍一下使用Java利用Zxing生成与解析二维码 注意: 二维码的生成需要借助辅助类( ...

  6. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  7. .net core 的图片处理及二维码的生成及解析

    写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...

  8. 关于java的二维码的生成与解析

    本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio ...

  9. C语言之二维数组

    二维数组 还是一个数组,只不过数组中得每一个元素又是一个数组 1). 声明语法 类型 数组名[行][列]; 例:  int nums[2][3];//2行3列的二维数组,保存的数据类型是int类型 c ...

随机推荐

  1. 基于Vuforia的Hololens图像识别

    微软官方Hololens开发文档中有关于Vuforia的内容,https://developer.microsoft.com/en-us/windows/holographic/getting_sta ...

  2. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序

    Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...

  3. DX 的.x 文件

    template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags;} ...

  4. ACM题集以及各种总结大全!

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  5. memmove 和 memcpy的区别

    memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void * ...

  6. hadoop No FileSystem for scheme: hdfs

    http://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file This is a typical c ...

  7. WebViewJavascriptBridge的基本原理

    前言 WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲 ...

  8. Qt: 把内容写进字符串中与C++很相似(使用QTextStream包装QString)

    #include <iostream>#include <QChar>#include <QFile>#include <QTextStream>#in ...

  9. 雷军北大演讲:除了聪明和勤奋我们还需要什么(关键是有了梦想以后,你能不能把这个东西付诸实践)good

    雷军北大演讲:除了聪明和勤奋我们还需要什么 昨天我在乌镇参加了全球互联网峰会,在这个会议上有马云,也有苹果公司的高级副总裁,主持人抛出了一个问题,说雷军你说你有一个目标,要用5到10年的时间做智能手机 ...

  10. JavaScript DOM高级程序设计 4.2 事件类型--我要坚持到底!

    对象事件 load和unload(载入页面的时候调用load,关闭页面的时候调用unload) abort和error 对于载入图像时出现错误的情况,可以使用error事件侦听器来进行说明: ADS. ...