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

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

考研复习空间几何的时候忽然想到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
||||||||- 计算机自己数据类型的精度限制性能

相关文章
相关标签/搜索