码迷,mamicode.com
首页 > 其他好文 > 详细

高级图形绘制软件的原理猜想

时间:2020-10-09 20:23:55      阅读:27      评论:0      收藏:0      [点我收藏+]

标签:简化   高效   sof   ||   速度   三维空间   自己的   空格   图形化   

(因为直接把别的文档里的粘贴过来后,空格和制表符都会消失,所以偷懒全换成了“|”...)

考研复习空间几何的时候突然想到matlab,R语言,还有java里的一些绘图包,然后就有点好奇它们的原理,照着自己的思路猜测了下,或许下面想的思路也是它们曾经某个版本的实现方式吧。不过随着它们更新换代,我觉得它们一定采取了更加高效的方法来绘制图形。尽管如此 ... 就当下面这个是一些个人的想法吧。

 

p.s. 没学过图形学,矩阵也忘了,也没时间去实现,只是先把思路记录在这里。感觉这个思路还算不错,不过还能够进一步增加一些内容和改进(比如说具体的基准点寻找的策略,实现的优化等等),然而限于个人时间,就仅仅描述下面这些。

p.s. plus 最初是想着从零开始,用java,或者说C来实现一个图形绘制的包,不过近期没什么时间,以后说不定会干吧。。。(记得好像有前辈说过“‘以后再做’等于永远不会去做”?)

 

||||- 扫描画布
||||||||- 这种方式虽然实现起来逻辑简单,但是特别费时,而且效率极低,精度也不是很高,不建议采用这种方式实现
||||||||- 另外,这种方式绘制二维图形还可以,要是绘制三维图形的话,计算量就近乎无法处理了
||||||||- 因为扫描画布式实在太过低效,所以不作为单独一节,下面主要是针对扩散式的描述
||||- 扩散式
||||- 原理(以二维图为例)(关键是寻找基准点)
||||||||- 使用n条基准线,扫描这些线上的点,代入曲线公式f(x, y)=0中,然后取其中结果f(x0, y0)最接近0的几个点(x0, y0)作为基准点
||||||||- 设置好初始的画布窗口位置,比如说x和y坐标上下±30以内,选取这个窗口之内,或是最接近这个窗口的基准点,然后同时沿着x和y的正反方向向两头扩散,每次扩散的坐标距离根据画布而定。如果在扩散的过程中,出现了f(x0, y0)的值超过某个阈值的情况,就将其舍弃,取另外的f(x0, y0)值最接近0的点作为函数图像的一个点,如此进行下去,直到超出画布范围。
||||- 关于不常见函数的处理
||||||||- 简单来说,y=±x就足以处理大多数常见曲线,但是如果想要提升处理能力以及软件性能,就需要具体规划其它的基准线
||||||||- 具体来说,除了增加基准线的类型以外,还要考虑对数坐标,基准线切换等等策略。
||||||||- 比如一个距离原点非常远,但是半径却非常小的圆(或球),如果只靠最初选取的基准线,是几乎不可能找到基准点的。这时可以考虑利用函数的单调性,在最接近基准点的地方进行基准线的重新设置,然后再次寻找基准点,重复这个步骤下去,总会找到基准点的。
||||||||- 或者,可以考虑对函数的原型进行分析,尝试直接获取一个基准点,然后进行扩散。
||||||||- 或者,可以考虑对空间进行划分,结合对数坐标,迅速缩小基准点的范围,然后在这个范围内再使用基准线寻找基准点。
||||- 非连续函数的处理
||||||||- 考虑到函数可能不是连续的,所以可能需要采用从多个基准点进行并行扩散,直到它们的定义域对接起来
||||||||- 如果所有基准点都已经扩散完毕,就需要寻找新的基准点
||||- 具体示例
||||||||- 就拿y=sin(x)来说,基准线y=x在(0, 0)就遇到了f(x0, y0)=0的情况,这时就可以直接从(0, 0)开始扩散
||||- 图形化展示
||||||||- 二维图形比较容易,直接就可以画出来,三维图形的展示就比较复杂了,需要一定的图形学转化。
||||||||- 三维空间下,比如,你计算出了一个椭球体的图形,然后画出了包含这个椭球体的一个范围内的空间坐标系,具体一点,可以是x^2+5*y^3+2*z^2=1,坐标系范围是(-5, -5, -5) ~ (5, 5, 5)
||||||||- 在绘制三维图的时候,需要对已经计算出的点进行转化。为了加快计算,还要把这些点组合成矩阵,或者说,在一开始就使用矩阵的形式存储和计算,之后利用矩阵的变换,描出对应的点。
||||||||- 在描点的过程中,可能还要考虑到这些点在视觉上的前后位置,用不同的颜色将他们标出来,也就是将矩阵的某一片区域变色。
||||- 一些需要的技术
||||||||- 稀疏矩阵及其压缩存储
||||||||||||- 在图形化展示时,计算出的点只有很少一部分有值,其它的都是0,这时候就是稀疏矩阵了。
||||||||||||- 即便这个图形看起来有多大,它在那个坐标空间里面也就是一层纸,矩阵中表现出来的就是一小串有值的点,所以稀疏矩阵的相关知识对于性能优化来说是必需的。
||||||||- 并行计算
||||||||||||- 这个是进阶要求。利用并行计算,加速基准点的查找,进而提高软件的响应速度。
||||||||- 图形学基础
||||||||||||- 这个要用在图形的展示上,因为图形从各个角度看去都不同,每次重新计算太浪费性能,需要利用矩阵变换简化处理
||||||||||||- 另外,其它的一些进阶的图形展示也需要这一点。比如不同层次的染色,不同函数的标记等等。
||||- 优点
||||||||- 一旦找到了函数上的几个点,就能立刻沿着这些点绘制出整个图形
||||||||- 速度上相对画布扫描式大幅度提升,精度上也因为计算量的降低,可以通过减小扫描的步长来获得相对画布扫描式更高的精度
||||- 缺点
||||||||- 基准点的寻找比较困难
||||||||- 并行编程
||||||||- 对比较“偏僻”的图形的绘制比较困难,可能需要花费很长时间寻找,即便它的函数表达式很简单,比如(x-99999)^2 + (y-99999)^2 = 0.0000001
||||||||- 计算机本身数据类型的精度限制

高级图形绘制软件的原理猜想

标签:简化   高效   sof   ||   速度   三维空间   自己的   空格   图形化   

原文地址:https://www.cnblogs.com/atoshdustosh/p/13782975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!