65.9K
CodeProject 正在变化。 阅读更多。
Home

绘制3D表面

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (53投票s)

2007年2月21日

2分钟阅读

viewsIcon

263683

downloadIcon

17225

简单地在屏幕上渲染3D表面,无需OpenGL/DirectX。

Screenshot - Plot3D_sample1.png

引言

本文介绍了一种在2D平面上渲染3D表面的简单方法。它不使用OpenGL或DirectX之类的东西。它只是利用了CPU的功能。当然,简单性是有代价的 - 渲染过程不像使用硬件加速时那样快。

它的应用范围从简单地欣赏美丽的3D表面到数据可视化,再到任何需要的用途。我曾在为优化方法、识别、微积分(数学分析)和量纲分析课程编写的程序中使用过它。

属性

  • Density - 跨越网格的大小。
  • PenColor - 绘图笔的颜色。用于绘制网格。
  • StartPoint - 绘图起始点。
  • EndPoint - 绘图结束点。
  • Function - 用于计算表面顶点的函数。
  • ColorSchema - 分配给网格的颜色方案。

方法

  • ReCalculateTransformationsCoeficients - 根据新参数重新计算变换系数。
  • Project - 执行投影。计算3D点的屏幕坐标。
  • RenderSurface - 主要方法。在给定的图形上渲染表面。

关注点

其他类ColorSchemaCompiledFunction是代码中有趣的部分。第一个封装了一个Color条目的数组。它有一些预定义的调色板。另一个将给定的公式编译成一个函数委托,提供简单的解析器服务。

用法

Surface3DRenderer sr = new Surface3DRenderer(70, 35, 40, 
                       0, 0, ClientRectangle.Width, 
                       ClientRectangle.Height, 0.5, 0, 0);
//new hue-based palette
sr.ColorSchema = new ColorSchema(120);
//enter your function here        
sr.SetFunction("sin(x1)*cos(x2)/(sqrt(sqrt(x1*x1+x2*x2))+1)*10");

使用它来实际渲染一些东西

sr.RenderSurface(e.Graphics);

每当绘图区域大小改变时,使用它

sr.ReCalculateTransformationsCoeficients(70, 35, 40, 0, 0, 
     ClientRectangle.Width, ClientRectangle.Height, 0.5, 0, 0);

Copyright

历史

  • 2007年2月22日 - 第一个版本。
  • 2007年2月23日 - 添加了示例图像。

示例(应用程序)

下面,我发布了一个为我的优化方法(寻找函数的最小值/最大值)学术课程编写的应用程序的屏幕截图。标签是波兰语,但我希望它们是不言自明的。

Screenshot - wykres.png

输入公式

Screenshot - wzor.png

使用最大斜率法寻找函数的最小值

Screenshot - tabelka.png

© . All rights reserved.