3d 绘图应用问题
3d Graphing Application Questions
对于我的一个 类,我制作了一个 3D 绘图应用程序(使用 Visual Basic)。它接受一个字符串 (z=f(x,y)) 作为输入,将其解析为 RPN 符号,然后计算方程并绘制图形。虽然它确实有效,但绘制图表大约需要 20 秒。我本来想添加滑动条来垂直和水平旋转图形,但它确实太慢了。
有谁知道哪种编程语言最适合这类事情?理想情况下,我将能够在绘制函数后平滑地旋转函数。
此外,我正在尝试找到一种更好的方法来旋转函数。现在,我在一堆点上对其进行评估,然后将这些点绘制到屏幕上。每次旋转时,都必须重新评估并绘制所有新点。这与原始图形过程一样长,因为它基本上将其视为一个全新的函数。
最后,我需要一种更好的方式来显示图表。目前(使用 VB 和 visual studio)我在图表上绘制了 200,000 个点,但这无论如何看起来都不太好。最终,我希望能够根据高度和其他图形操作更改颜色,使其看起来更好。
需要说明的是,我并不是要别人为我做任何这些,而是要以一种有效的方式进行编码的方法。我将非常感谢任何人可以提供的任何建议来帮助解决这三个问题中的任何一个。
编程语言大多不相关,因此 VB 本身可能不是问题。在Python、C#、C++等语言中你可能会遇到同样的问题。当然你必须掌握你选择的编程语言。
一个关键方面是使用正确的算法和数据结构。正确使用内存分配和内存布局来最大化 CPU(和 GPU)缓存也是关键。那么您必须利用平台和硬件功能(GPU 和多线程)。对于最后一点,您肯定需要使用图形库,例如 OpenGL 或 Vulkan。
所以我将解释我将如何使用 C++ 和 OpenGL 进行处理。这并不意味着这些是您必须使用的工具,它们只是标准图形工具。
您的函数表面本质上是一个 2D 流形,它具有很好的 属性 直观映射到 2D space。什么是通常所说的UV映射。
您应该做的是选择要显示的矩形域的范围(最小 x、最大 x、最小 y、最大 y)并制作 2 个嵌套 for 循环,格式如下:
// Pseudocode
for (x=minimum; x<maximum; x++)
for (y=minimum; y=maximum; y++)
3D point = (x,y, f(x,y))
将所有这些点存储到一个容器中(c++ 的标准向量工作正常),这将是您的 "mesh"。
这是在渲染之前完成一次。然后,您使用 GL_POINTS 等方式渲染这些点,并使用 GPU 上的旋转来旋转图形网格。
这只会显示散点,而不是表面。
如果您还希望显示函数的表面,而不仅仅是点,则可以很容易地对该组点进行三角剖分。
将每 4 个连续顶点分组(即索引 <x,y>, <x+1,y>, <x+1,y>, <x+1,y+1>)
处的顶点并创建 2 个三角形:
(<x,y>, <x+1,y>, <x,y+1>), (<x+1,y>, <x+1,y+1>, <x,y+1>)
这将填充网格表面的三角形。
基本上你只需要建立你的网格一次,这种方式渲染应该是 60 fps 对于有 20 000 个顶点的东西,不管你是只渲染点还是三角形。
对于我的一个 类,我制作了一个 3D 绘图应用程序(使用 Visual Basic)。它接受一个字符串 (z=f(x,y)) 作为输入,将其解析为 RPN 符号,然后计算方程并绘制图形。虽然它确实有效,但绘制图表大约需要 20 秒。我本来想添加滑动条来垂直和水平旋转图形,但它确实太慢了。
有谁知道哪种编程语言最适合这类事情?理想情况下,我将能够在绘制函数后平滑地旋转函数。
此外,我正在尝试找到一种更好的方法来旋转函数。现在,我在一堆点上对其进行评估,然后将这些点绘制到屏幕上。每次旋转时,都必须重新评估并绘制所有新点。这与原始图形过程一样长,因为它基本上将其视为一个全新的函数。
最后,我需要一种更好的方式来显示图表。目前(使用 VB 和 visual studio)我在图表上绘制了 200,000 个点,但这无论如何看起来都不太好。最终,我希望能够根据高度和其他图形操作更改颜色,使其看起来更好。
需要说明的是,我并不是要别人为我做任何这些,而是要以一种有效的方式进行编码的方法。我将非常感谢任何人可以提供的任何建议来帮助解决这三个问题中的任何一个。
编程语言大多不相关,因此 VB 本身可能不是问题。在Python、C#、C++等语言中你可能会遇到同样的问题。当然你必须掌握你选择的编程语言。
一个关键方面是使用正确的算法和数据结构。正确使用内存分配和内存布局来最大化 CPU(和 GPU)缓存也是关键。那么您必须利用平台和硬件功能(GPU 和多线程)。对于最后一点,您肯定需要使用图形库,例如 OpenGL 或 Vulkan。
所以我将解释我将如何使用 C++ 和 OpenGL 进行处理。这并不意味着这些是您必须使用的工具,它们只是标准图形工具。
您的函数表面本质上是一个 2D 流形,它具有很好的 属性 直观映射到 2D space。什么是通常所说的UV映射。
您应该做的是选择要显示的矩形域的范围(最小 x、最大 x、最小 y、最大 y)并制作 2 个嵌套 for 循环,格式如下:
// Pseudocode
for (x=minimum; x<maximum; x++)
for (y=minimum; y=maximum; y++)
3D point = (x,y, f(x,y))
将所有这些点存储到一个容器中(c++ 的标准向量工作正常),这将是您的 "mesh"。
这是在渲染之前完成一次。然后,您使用 GL_POINTS 等方式渲染这些点,并使用 GPU 上的旋转来旋转图形网格。
这只会显示散点,而不是表面。
如果您还希望显示函数的表面,而不仅仅是点,则可以很容易地对该组点进行三角剖分。
将每 4 个连续顶点分组(即索引 <x,y>, <x+1,y>, <x+1,y>, <x+1,y+1>)
处的顶点并创建 2 个三角形:
(<x,y>, <x+1,y>, <x,y+1>), (<x+1,y>, <x+1,y+1>, <x,y+1>)
这将填充网格表面的三角形。
基本上你只需要建立你的网格一次,这种方式渲染应该是 60 fps 对于有 20 000 个顶点的东西,不管你是只渲染点还是三角形。