使用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 ...
随机推荐
- C语言关键字-volatile
1.C语言关键字volatile C 语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取 不能缓存 ...
- 通过jq更改img的src值
$(".help_ul li:eq(1) img")[0].src; $(".help_ul li:eq(1) img").attr('src','images ...
- good mind
1.如果你能做的事,员工也能做,就让员工做好了. 2.代码是一行一行执行的. 3.如果你找不到NB的人,那就找勤奋点的人.
- 【数学/扩展欧几里得/Lucas定理】BZOJ 1951 :[Sdoi 2010]古代猪文
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- Discuz云平台站点信息同步失败,An unknown error occurred. May be DNS Error.
站点信息同步失败 An unknown error occurred. May be DNS Error. (ERRCODE:1) 经过Discuz教程网(http://www.1314study.c ...
- Injection Attacks-XML注入
注入攻击 XML注入 虽然JSON的出现实现了服务器与客户端之间的"轻量级"数据交流,但是,作为另一种流行的可行方案,许多web服务API同时还是继续支持XML.另外,除了web服 ...
- hdu 4294 Multiple
思路: 首先给出一个结论,就是最多用两个数就可以表示任何数的倍数. 证明 :对于一个数字a,可以构造出的数字有 a,aa,aaa,aaaa,aaaaa,…… 每一个数对于n都有一个余数,余数最多有n个 ...
- Java Web开发 之JavaBean整理
JavaBean是一种Java组件技术,就其本质就是一个类,具有如下特点:1:实现可序列化2:有一个public的无参的构造方法3:所有实例变量都是private的4:为每一个属性提供getter和s ...
- linux xxd 命令
http://www.cnblogs.com/openix/archive/2012/04/23/2466320.html xxd -i dht.jpg dht.h
- Servlet课程0424(一) 通过实现Servlet接口来开发Servlet
//这是我的第一个Servlet,使用实现Servlet接口的方式来开发 package com.tsinghua; import javax.servlet.*; import java.io.*; ...