使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
使用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)-解析曲面的显示的更多相关文章
- 使用C语言实现二维,三维绘图算法(1)-透视投影
使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- ARCGIS二维三维导航
在使用代码前需要先安装arcgis10.0 或者10.1都可以 不过本人建议初学者安装10.0比较容易安装.. 安装方式和二维三维地图的加载网上都有,就不在此一一赘述了. 先从基本的功能开 ...
- Atitit zxing二维码qr码识别解析
Atitit zxing二维码qr码识别解析 1.1. qr码识别解析 by zxing1 1.2. 解码lib:qrcode.jar 2 1.3. atitit.二维码生成总结java zxing ...
- ZXing二维码的生成和解析
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法, 现在我简单介绍一下使用Java利用Zxing生成与解析二维码 注意: 二维码的生成需要借助辅助类( ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- .net core 的图片处理及二维码的生成及解析
写代码这事,掐指算来已经十有余年. 从html到css到javascript到vbscript到c#,从兴趣到职业,生活总是失落与惊喜并存. 绝大部分时候,出发并不是因为知道该到哪里去,只是知道不能再 ...
- 关于java的二维码的生成与解析
本文说的是通过zxing实现二维码的生成与解析,看着很简单,直接上代码 import java.io.File; import java.io.IOException; import java.nio ...
- C语言之二维数组
二维数组 还是一个数组,只不过数组中得每一个元素又是一个数组 1). 声明语法 类型 数组名[行][列]; 例: int nums[2][3];//2行3列的二维数组,保存的数据类型是int类型 c ...
随机推荐
- 基于Vuforia的Hololens图像识别
微软官方Hololens开发文档中有关于Vuforia的内容,https://developer.microsoft.com/en-us/windows/holographic/getting_sta ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...
- DX 的.x 文件
template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags;} ...
- ACM题集以及各种总结大全!
ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...
- memmove 和 memcpy的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void * ...
- hadoop No FileSystem for scheme: hdfs
http://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file This is a typical c ...
- WebViewJavascriptBridge的基本原理
前言 WebViewJavascriptBridge是支持到iOS6之前的版本的,用于支持native的iOS与javascript交互.如果需要支持到iOS6之前的app,使用它是很不错的.本篇讲讲 ...
- Qt: 把内容写进字符串中与C++很相似(使用QTextStream包装QString)
#include <iostream>#include <QChar>#include <QFile>#include <QTextStream>#in ...
- 雷军北大演讲:除了聪明和勤奋我们还需要什么(关键是有了梦想以后,你能不能把这个东西付诸实践)good
雷军北大演讲:除了聪明和勤奋我们还需要什么 昨天我在乌镇参加了全球互联网峰会,在这个会议上有马云,也有苹果公司的高级副总裁,主持人抛出了一个问题,说雷军你说你有一个目标,要用5到10年的时间做智能手机 ...
- JavaScript DOM高级程序设计 4.2 事件类型--我要坚持到底!
对象事件 load和unload(载入页面的时候调用load,关闭页面的时候调用unload) abort和error 对于载入图像时出现错误的情况,可以使用error事件侦听器来进行说明: ADS. ...