精华内容
下载资源
问答
  • MATLAB三维图形绘制、渲染和交互

    千次阅读 2019-11-21 09:39:22
    介绍MATLAB三维图形的建模、着色、光照、材质、透明和交互操作全部内容。 【课程收益】 MATLAB三维绘图 MATLAB三维图形渲染和交互操作 视频教程入口 第章:课程简介 1. 课程简介 4:07 第章:三维...

    【课程介绍】
    介绍MATLAB三维图形的建模、着色、光照、材质、透明性和交互操作全部内容。
    【课程收益】
    MATLAB三维绘图
    MATLAB三维图形渲染和交互操作

    视频教程入口

    第一章:课程简介

        1. 课程简介 4:07
    

    第二章:三维图形的绘制

        1. 点 6:16
        2. 直线 8:11
        3. 面片 17:32
        4. 曲面 8:28
        5. 文本 5:16
    

    第三章:图形着色

        1. 规则网格曲面图的着色-主要的着色技术 4:03
        2. 规则网格曲面图的着色-颜色查找表 6:26
        3. 规则网格曲面图的着色-索引着色-直接映射和比例化映射 4:09
        4. 规则网格曲面图的着色-真彩色着色 5:06
        5. 规则网格曲面图的着色-纹理映射 4:46
        6. 多边形对象模型的着色-面片面的着色 10:41
        7. 多边形对象模型的着色-面片边的着色 3:10
        8. 多边形对象模型的着色-设置透明度 10:48
        9. 多边形对象模型的着色-渐变色曲线 3:17
    

    第四章:光照与材质

        1. Light对象 6:50
        2. 光照命令 13:03
        3. 影响光照效果的属性 9:22
        4. 光照算法 4:05
        5. 材质 13:54
    

    第五章:透明性

        1. alpha值 9:10
        2. 与透明性相关的属性 9:02
        3. 与透明性相关的函数 13:33
        4. 指定透明度值 5:10
        5. 将数据映射给透明度 10:00
        6. alpha查找表 14:44
    

    第六章:交互操作

        01. 视点和相机-用方位角和仰角设置视点 9:16
        02. 视点和相机-一个重要的交互工具-相机 6:03
        03. 低级相机属性 6:43
        04. 用相机工具条进行场景空间变换-交换主轴 6:54
        05. 用相机工具条进行场景空间变换-盘旋 5:44
        06. 用相机工具条进行场景空间变换-平移 2:04
        07. 用相机工具条进行场景空间变换-缩放 2:55
        08. 用相机工具条进行场景空间变换-滚动 1:17
        09. 相机相关函数-camdolly函数 12:17
        10. 相机相关函数-camlight函数 5:43
        11. 相机相关函数-camlookat函数 4:42
        12. 相机相关函数-camorbit函数 6:48
        13. 相机相关函数-campan函数 3:58
        14. 相机相关函数-campos函数 3:11
        15. 相机相关函数-camproj函数 3:49
        16. 相机相关函数-camroll函数 2:44
        17. 相机相关函数-camtarget函数 4:41
        18. 相机相关函数-camup函数 2:45
        19. 相机相关函数-camva函数 5:17
        20. 相机相关函数-camzoom函数 3:35
    

    视频教程入口

    展开全文
  • 基于双线插值的三维图像旋转 不知道双线插值应用在三维图像上还叫不叫双线性插值。 进入正题,三维图像是用numpy数组存储的三维矩阵。 三维图像旋转的基础: 这个T就是变换矩阵,当其分别绕X、Y、Z轴旋转...

    基于双线性插值的三维图像旋转

    不知道双线性插值应用在三维图像上还叫不叫双线性插值。

    进入正题,三维图像是用numpy数组存储的三维矩阵。

    三维图像旋转的基础:

    [x', y', z', 1] = [x, y, z, 1]\times T

    这个T就是变换矩阵,当其分别绕X、Y、Z轴旋转的时候,T分别为:

    T = \begin{bmatrix} 1&0 &0 &0 \\ 0& \cos (\theta ) & \sin (\theta) &0 \\ 0& -\sin (\theta)& \cos (\theta ) &0\\ 0& 0& 0& 1 \end{bmatrix}

    T = \begin{bmatrix} \cos (\theta )&0 & -\sin (\theta) &0 \\ 0& 1 & 0 &0 \\ \sin (\theta)& 0& \cos (\theta ) &0\\ 0& 0& 0& 1 \end{bmatrix}

    T = \begin{bmatrix} \cos (\theta )& \sin (\theta) &0&0 \\ -\sin (\theta)& \cos (\theta ) & 0 &0 \\ 0& 0& 1 &0\\ 0& 0& 0& 1 \end{bmatrix}

    但是呢,这里有一个问题,一般来说我们会想把我们的图像绕着图像的中心旋转,但是如果你直接套用上面的公式的话会发现图像时绕着x轴,y轴和z轴旋转的,所以我们先得转换一下坐标,将旋转中心由原点变成图像的中点。

    旋转中心坐标变换:

    这里的处理其实很简单,只需要做一下简单的平移,平移矩阵如下:

    T_{1} = \begin{bmatrix} \1& 0 &0&0 \\ 0 & 1 & 0 &0 \\ 0& 0& 1 &0\\ -N& -M& -O& 1 \end{bmatrix}

    N、M、O分别对应图像的长、宽、高的一半

    进行完上面的变换之后就可以进行旋转变换了

    变换完之后,再通过下面的平移矩阵将坐标变换回去就好了,平移矩阵如下:

    T_{2} = \begin{bmatrix} \1& 0 &0&0 \\ 0 & 1 & 0 &0 \\ 0& 0& 1 &0\\ N& M& O& 1 \end{bmatrix}

    所以,最后面旋转的公式为:

    [x', y', z', 1] = [x, y, z, 1]\times T_{1}\times T\times T_{2}

    更多三维图像的变换可以参看以下博客:

    https://blog.csdn.net/zl908760230/article/details/53965395

    双线性插值:

    但是,仅仅只是通过上面的坐标变换后得到的图像一定会由问题,因为旋转之后有的地方根本就没有对应的值。所以这时候就要对这些空位进行插值了。

    这里仅介绍双线性插值,插值的过程可以概括如下:

    先构造旋转后的图,然后通过将该图反向旋转回去找对应的值进行填空。这样子就能够将旋转后图像的所有值都补上。

    三维图像的双线性插值可以根据二维图像来推,一篇介绍二维图像的双线性插值:

    https://www.cnblogs.com/sdxk/p/4056223.html

    看看图片就能理解了,然后画个三维图像慢慢推三维的,我这里仅仅是单独绕着X、Y、Z一个轴旋转,所以和双线性插值也没什么区别了。当然写完代码之后还是要好好测试一下的,你会发现很多意想不到的错误。

    python代码如下:

    import numpy as np
    
    # 旋转,axis为旋转轴,0,1,2分别代表x,y,z轴
    # theta为旋转角度,单位已改为度,非弧度
    # center为旋转中心,其为一维np数组[x,y,z],默认值为图像中心点
    def rotation(data, axis, theta, c = np.array([])):# c代表旋转点
        theta = -np.pi * theta / 180
        if c.size == 0:
            c = np.array([np.floor((data.shape[0]-1)/2), np.floor((data.shape[1]-1)/2), np.floor((data.shape[1]-1)/2)])
        
        s = data.shape
        mean = np.mean(data)
        # new_data = np.ones(s) * mean # 补均值
        new_data = np.zeros(s) # 补零
        
        # 绕x轴旋转
        if axis == 0:
            for i in range(0, s[0]):
                for j in range(0, s[1]):
                    for k in range(0, s[2]):
                        x = i
                        y = (j-c[1])*np.cos(theta)-(k-c[2])*np.sin(theta)+c[1]
                        if(y < 0 or y > s[1]-1):
                            continue
                        z = (j-c[1])*np.sin(theta)+(k-c[2])*np.cos(theta)+c[2]
                        if(z < 0 or z > s[2]-1):
                            continue
                        y1 = np.floor(y).astype(int)
                        y2 = np.ceil(y).astype(int)
                        z1 = np.floor(z).astype(int)
                        z2 = np.ceil(z).astype(int)
                        dy = y - y1
                        dz = z - z1
                        new_data[i,j,k] = (data[x,y1,z1]*(1-dy)+data[x,y2,z1]*dy)*(1-dz) + (data[x,y1,z2]*(1-dy)+data[x,y2,z2]*dy)*dz
          
        # 绕y轴旋转              
        elif axis == 1:
            for i in range(0, s[0]):
                for j in range(0, s[1]):
                    for k in range(0, s[2]):
                        y = j
                        x = (i-c[0])*np.cos(theta)-(k-c[2])*np.sin(theta)+c[0]
                        if(x < 0 or x > s[0]-1):
                            continue
                        z = (i-c[0])*np.sin(theta)+(k-c[2])*np.cos(theta)+c[2]
                        if(z < 0 or z > s[2]-1):
                            continue
                        x1 = np.floor(x).astype(int)
                        x2 = np.ceil(x).astype(int)
                        z1 = np.floor(z).astype(int)
                        z2 = np.ceil(z).astype(int)
                        dx = x - x1
                        dz = z - z1
                        new_data[i,j,k] = (data[x1,y,z1]*(1-dx)+data[x2,y,z1]*dx)*(1-dz) + (data[x1,y,z2]*(1-dx)+data[x2,y,z2]*dx)*dz
    
        # 绕z轴旋转
        else:
            for i in range(0, s[0]):
                for j in range(0, s[1]):
                    for k in range(0, s[2]):
                        z = k
                        x = (i-c[0])*np.cos(theta)-(j-c[1])*np.sin(theta)+c[0]
                        if(x < 0 or x > s[0]-1):
                            continue
                        y = (i-c[0])*np.sin(theta)+(j-c[1])*np.cos(theta)+c[1]
                        if(y < 0 or y > s[1]-1):
                            continue
                        x1 = np.floor(x).astype(int)
                        x2 = np.ceil(x).astype(int)
                        y1 = np.floor(y).astype(int)
                        y2 = np.ceil(y).astype(int)
                        dx = x - x1
                        dy = y - y1
                        new_data[i,j,k] = (data[x1,y1,z]*(1-dx)+data[x2,y1,z]*dx)*(1-dy) + (data[x1,y2,z]*(1-dx)+data[x2,y2,z]*dx)*dy
                        
        return new_data

     

     

     

    展开全文
  • 三维变换到二维投影_OpenGL版本

    千次阅读 2017-11-02 09:53:40
    为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模拟的方式,假定用相机来拍摄这个世界,那么在相机的取景器中,就存在人眼和现实世界之间的个变换过程。    ...

    转自:http://blog.sina.com.cn/s/blog_957b9fdb0100zesv.html

    为了说明在三维物体到二维图象之间,需要经过什么样的变换,我们引入了相机(Camera)模拟的方式,假定用相机来拍摄这个世界,那么在相机的取景器中,就存在人眼和现实世界之间的一个变换过程。

       
     第一步:视点变换(如同拍照的时候设置相机的位置)
             在拍照的时候,我们首先要将相机置于三角架上,让它对准三维场景。在OpenGL中调整视点的位置就像是是要放置相机一样,我们称之为视点变换(Viewing Transformation)。
     
             视点变换确定了场景中物体的视点(即相机)的位置和方向,让相机对准要拍摄的物体。缺省时,相机(即视点)定位在世界坐标系的原点,(注意:初始时世界坐标系和当前绘图坐标系位于相同的位置);相机的初始方向都指向Z负轴。
             初始情况下,相机和物体都位于世界坐标系的原点,即相机(视点)与物体是重叠的。试想一下,在用相机拍摄物体时,我们可以保持物体的位置不动,而将相机移离物体,这就相当于视点变换。
     
            视点变换函数gluLookAt()         OpenGL实用库提供了gluLookAt()函数,该函数有三个变量,分别定义了视点的位置、相机瞄准方向的参考点以及相机的向上方向。该函数的原型为:
    void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble upx,GLdouble upy,GLdouble upz);
          该函数定义了视点矩阵,并用该矩阵乘以当前矩阵。eyex,eyey,eyez定义了视点的位置;centerx、centery和centerz变量指定了参考点的位置,该点通常为相机所瞄准的场景中心轴线上的点;upx、upy、upz变量指定了向上向量的方向。
       
            使用这个函数之后,只设定好了视点(相机)的位置了。

     

    第二步:模型变换(如同拍照时调整三维物体的位置)

           在拍照时,我们也可以保持相机的固定位置,将物体移离相机以将三维物体摆放在场景中的适当位置。在OpenGL中,对物体的显示位置方向的设置就与之类似,我们称之为模型变换(Modeling Transformation)。而显示位置与当前的绘图坐标系密切相关,因为物体总是在当前的绘图坐标系中进行绘制的,因此实际上模型变换可以说就是对当前绘图坐标系位置的变换,这一变换是在世界坐标系下进行的。 
          
          设置物体位置涉及到即对模型进行旋转、平移和缩放。缺省时,物体模型(即绘图坐标系)的中心定位在世界坐标系的中心处。OpenGL在这个坐标系中,有如下三个函数来实现模型变换。
         1、模型平移
     
    glTranslate{fd}(TYPE x,TYPE y,TYPE z);
          该函数用指定的x,y,z值沿着(世界坐标系的)x轴、y轴、z轴移动绘图坐标系(也即是按照相同的量值平移物体)。   
           2、模型旋转
     
    glRotate{fd}(TYPE angle,TYPE x,TYPE,y,TYPE z);
          该函数中第一个变量angle制定模型旋转的角度,单位为度,后三个变量表示以世界坐标系下的原点(0,0,0)到点(x,y,z)的连线为轴线逆时针旋转绘图坐标系。例如,glRotatef(45.0,0.0,0.0,1.0)的结果是绕z轴旋转45度。
         3、模型缩放
     
    glScale{fd}(TYPE x,TYPE y,TYPE z);
         该函数可以对物体沿着x,y,z轴分别进行放大缩小。函数中的三个参数分别是x、y、z轴方向的比例变换因子。缺省时都为1.0,即物体没变化。程序中物体Y轴比例为2.0,其余都为1.0,就是说将立方体变成长方体。
          注意:通常,视点转换操作在模型转换操作之前发出,以便模型转换先对物体发生作用。场景中物体的顶点经过模型转换之后移动到所希望的位置,然后再对场景进行视点定位等操作。模型转换和视点转换共同构成模型视景矩阵。
     
    第三步:投影变换(就如同拍照中的选镜头并调焦距)
            在相机和物体都放好后,我们要选择相机镜头并调焦拍照,使三维物体投影在二维胶片上。与之类似,OpenGL中把三维模型投影到二维屏幕上的过程,即OpenGL的投影变换(Projection Transformation)。
     
            为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影来降低维数。事实上,投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终进入图像的只是视景体内的有关部分。投影包括透视投影(Perspective Projection)和正视投影(Orthographic Projection)两种。
     
            1. 透视投影          
             透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被进行切割过的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面。
          OpenGL透视投影函数有两个glFrustum()和gluPerspective()。
      
     (1)函数glFrustum():
     
    void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);
          它创建一个透视视景体。其操作是创建一个透视投影矩阵,并且用这个矩阵乘以当前矩阵(三维物体的各个顶点坐标组成的矩阵)。这个函数的参数只定义近裁剪平面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near);最后一个参数far是远裁剪平面的Z负值,其左下角点和右上角点空间坐标由函数根据透视投影原理自动生成。near和far表示离视点的远近,它们总为正值。该函数形成的视景体如图三所示。
    图三、透视投影视景体
      (2)透视函数gluPerspective()是:
    void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar);
          它也创建一个对称透视视景体,但它的参数定义于前面的不同,参数fovy定义视野在X-Z平面的角度,范围是[0.0, 180.0];参数aspect是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。
    图四、透视投影视景体
           以上两个函数缺省时,视点都在原点,视线沿Z轴指向负方向。
     
          2.正射投影
         正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图五所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。
         图五、正射投影视景体
           OpenGL正射投影函数也有两个, glOrtho()和gluOrtho2D()     (1)glOrtho():
     
    void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top, GLdouble near,GLdouble far)
           它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。其中近裁剪平面是一个矩形,矩形左下角点三维空间坐标是(left,bottom,-near),右上角点是(right,top,-near);远裁剪平面也是一个矩形,左下角点空间坐标是(left,bottom,-far),右上角点是(right,top,-far)。所有的near和far值同时为正或同时为负。如果没有其他变换,正射投影的方向平行于Z轴,且视点朝向Z负轴。这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。
      (2)gluOrtho2D():
    void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
         它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。
     
     第四步:视口变换(即着拍照过程中的冲洗底片)
     
           我们知道,冲洗底片就决定二维相片的大小,是2寸是5寸还是10寸。它相当与OpenGL中的视口变换(Viewport Transformation),即在屏幕窗口内可以定义一个矩形,称为视口(Viewport),规定屏幕上场景的范围和尺寸,类似于照片的画布。视景体投影后的图形就在视口内显示,类似于拍摄的图像在画布上显示。   
          在计算机图形学中,视口变换就是将经过几何变换、投影变换和裁剪变换后的物体显示于屏幕窗口内指定的区域内,这个区域通常为矩形,称为视口。
     
          OpenGL中视口变换的相关函数是:
     
    glViewport(GLint x,GLint y,GLsizei width, GLsizei height);
          这个函数定义一个视口。函数参数(x, y)是视口在屏幕窗口坐标系中的左下角点坐标,参数width和height分别是视口的宽度和高度。缺省时,参数值即(0, 0, winWidth, winHeight) 指的是屏幕窗口的实际尺寸大小。所有这些值都是以象素为单位,全为整型数。
     
     
           通过上面的几个步骤,一个三维空间里的物体就可以用相应的二维平面物体绘制表示了,也就能在二维的电脑屏幕上正确显示了。总的来说,三维物体的显示过程如下:
    图二、三维物体的显示过程
    展开全文
  • matlab的二维绘图

    万次阅读 多人点赞 2018-11-11 09:47:42
    v = axis:返回包含x轴,y轴与z轴对的刻度因子的行向量,v是个四维或者六维的向量,取决于坐标是二维还是三维的。 axis auto:自动计算当前轴的范围。auto x:自动计算x轴的范围。 auto y z:自动计算y轴与z...

    matlab绘制图形的步骤为:

    1. 数据准备:产生自变量采样向量,计算相应的函数值向量。
    2. 选定图形窗口及子图位置:在默认情况下,MATLAB系统绘制的图形为figure(1).figure(2),...
    3. 调用绘制函数绘制图形,例如plot函数
    4. 设置坐标轴的范围、刻度及坐标网格
    5. 利用对象属性值或图形窗口工具栏设置线型、标记类型及其大小等
    6. 添加图形注释,例如图名,坐标名称,图例,文字说明等
    7. 图形的导出与打印

    二维绘图 

    1.基本二维绘图

    • plot函数
      • plot(Y):输入参数Y是Y轴的数据,一般是输入向量。若Y为复数,则等价于plot(real(Y),image(Y)).
      • plot(X1,Y1,...,Xn,Yn):
        • 若Xi,Yi均为实数向量,且为同维向量时,则plot先描出点(Xi,Yi)然后用直线依次相连
        • 若Xi,Yi均为复数向量,则不考虑虚数部分
        • 若Xi,Yi均为同型实数矩阵,则plot(Xi,Yi)依次画出矩阵的几条线段
        • 若Xi,Yi一个为向量,另一个为矩阵,且向量的维数等于矩阵的行数或列数,则矩阵按向量的方向分解为几个向量,在与向量配对分别画出。
      • plot(X1,Y1,LineSpec,...,Xn,Yn,LineSpec):LineSpec为选项字符串,用于设置颜色、线性、数据点等。
      • plot(X1,Y1,LineSpec,'PropertyName',PropertyValue);PropertyName用于设置线的属性值,显得长度,宽度,标记点的颜色,大小等。
      • h = plot(X1,Y1,LineSpec,'PropertyName',PropertyValue'):返回绘制函数的句柄值h
    • 极坐标轴函数
      • loglog函数用于绘制双对数极坐标轴图像
      • semilogx函数用于绘制对数x轴上的图像
      • semilogy函数用于绘制对数y轴上的图像
    % 例2-1:利用plot绘制不同效果的图形
    x1 = -pi:.1:pi;
    y1 = sin(x1);
    subplot(2,3,1);plot(x1,y1);
    title('plot绘制向量图');
    
    x2 = magic(8);
    subplot(2,3,2);plot(x2);
    title('plot绘制向量图');
    
    x3 = [3+2i,4+5i,5+7i,6+8i,7+9i,10+6i];
    subplot(2,3,3);plot(x3);
    title('plot绘制复数向量图');
    
    x4 = 0.01:0.3:2*pi;
    y2 = cos(x4 + 0.5) + 2;
    subplot(2,3,4);plot(x4,y2,'r-.*');
    title('给图形进行标识');
    
    x5 = -pi:pi/10:pi;
    y3 = tan(sin(x5)) - sin(tan(x5));
    subplot(2,3,5);plot(x5,y3,'--rs','LineWidth',2,...
                            'MarkerEdgeColor','k',...
                            'MarkerFaceColor','g',...
                            'MarkerSize',10);
    title('图像进行属性设置');
    
    x6 = -pi:pi/20:pi;
    y4 = [sin(x6);sin(x6+1);sin(x6+2)];
    z = [cos(x6);cos(x6+1);cos(x6+3)];
    subplot(2,3,6);plot(x6,y4,'r:*',x6,z,'g-.v');
    title('绘制多条曲线');
    

     

    % 绘制对数坐标及半对数坐标图
    clear all;
    x1 = logspace(-1,2);
    subplot(1,3,1);loglog(x1,exp(x1),'-s');
    title('loglog函数绘图');
    grid on;
    
    x2 = 0:0.1:10;
    subplot(1,3,2);semilogx(10.^x2,x2,'r-.*');
    title('semilogx函数绘图');
    
    subplot(1,3,3);semilogy(10.^x2,x2,'rd');
    title('semilogy函数绘图');

     

    2.格栅

    当图像需要对具体数值更加清楚的展示时,为图形添加格栅是十分有效的。

    • grid on:命令可以在当前图形的单位标记处添加格栅
    • grid off:取消格栅的显示
    • grid:单独的grid,则可以在on与off状态下交替转换。
    % 为图形添加格栅
    clear all;
    x = linspace(0,10);
    y = sin(x);
    ax1 = subplot(2,1,1);
    plot(x,y);
    grid on;
    
    y2 = sin(3*x);
    ax2 = subplot(2,1,2);
    plot(x,y2)
    grid on;grid;

     

    3.文字说明

    • title('text'):在图像窗口的顶端的中间位置输出字符串text作为标题
    • xlabel('text'):在x轴下的中间位置输出字符串text作为标注
    • ylabel('text'):在y轴边上的中间位置输出字符串text作为标注
    • zlabel('text'):咋z轴边上的中间位置输出字符串text作为标注
    • text(x,y,'text'):在图形窗口(x,y)处写字符串text
    • gtext('text'):通过使用鼠标或方向键,移动图形窗口中的十字光标,让用户将字符串text放置在图形窗口中。
    • legend(str1,str2,...,pos):在当前图形上添加图例,并用说明性文字str1,str2等做标注。参数pos值位置参数。
    • legend off:清除图例
    clear all
    x = (0:0.1:2*pi)';
    y1 = 2 * exp(-0.5 * x) * [1,-1];
    y2 = 2 * exp(-0.5 * x) .* sin(2 * pi * x);
    x1 = (0:12)/2;
    y3 = 2 * exp(-0.5 * x1) .* sin(2*pi*x1);
    plot(x,y1,':',x,y2,'--',x1,y3)
    title('曲线及其包络线');
    xlabel('变量X');ylabel('变量Y');
    text(3.2,0.5,'包络线');
    text(0.5,0.5,'曲线y');
    text(1.4,0.15,'离散数据点');
    legend('包络线','曲线y','离散数据点')

     

    4.坐标轴设置

    matlab提供了坐标轴控制函数axis。

    • axis([xmin xmax ymin ymax zmin zmax]):设置当前坐标轴的x轴与y轴与z轴的范围。
    • v = axis:返回一包含x轴,y轴与z轴对的刻度因子的行向量,v是一个四维或者六维的向量,取决于坐标是二维还是三维的。
    • axis auto:自动计算当前轴的范围。auto x:自动计算x轴的范围。 auto y z:自动计算y轴与z轴的范围。
    • axis manual:把坐标固定在当前的范围,如果保持状态hold on,后面的图形仍用相同的界限
    • axis tight:把坐标轴的范围定为数据的范围,三个方向上的纵高比设为同一个值
    • axis fill:用于将坐标轴的取值范围分别设置为绘制所用数据在相应方向上的最大、最小值
    • axis ij:将二维图形的坐标原点设置在图形窗口的左上角,坐标轴i垂直向下,坐标轴j水平向右
    • axis xy:使用笛卡儿坐标系
    • axis equal:设置坐标轴的纵横比,使在每个方向的数据单位都相同
    • axis square:设置当前图形为正方形,系统将调整x轴y轴和z轴,他们具有相同的长度。
    • axis vis3d:将冻结坐标系此时的状态,以便进行旋转
    • axis normal:自用调整纵横比,还用于填充图形区域的,显示与坐标轴上的数据单位的纵横比
    • axis off:关闭所有坐标轴上的标记、格栅、和单位标记。保留由text和getext设置的对象
    • axis on:显示坐标轴上的单位、标记和格栅
    • [mode,visibility,direction] = axis('state'):返回表明当前坐标轴的设置属性的三个参数
    clear all
    t = 0.01:0.01:pi;
    figure;
    plot(sin(t),cos(t));
    axis([-1 1 -2 2]) % 重新设置坐标轴

     

    5.图像迭绘

    在已经存在的图上绘制新的曲线,并保留原来的曲线。

    hold on:是当前的轴及图形保留下来而不被刷新,并接受即将绘制的新的曲线

    hold off:为不保留当前轴及图形,绘制新的区先后,原图被刷新

    hold:为hold on语句和hold off语句的切换

    % 利用hold函数绘制迭绘图形
    clear all
    x = -pi:pi/20:pi;
    plot(sin(x),'r:>');
    hold on
    plot(cos(x),'b-<');
    hold off

     

    6.子图绘制

    matlab允许用户在同一个图形窗口中同时绘制多幅相互独立的子图,使用subplot函数。

    • subplot(m,n,p):将当前图形窗口分成mxn个绘图区,即m行n列。函数选定第p个分区为当前的活动区。在每一个区允许使用不同的坐标系单独绘制图形。
    • subplot(m,n,p,'replace'):如果定义的坐标轴已经存在,则删除已经有的,并创建一个新的坐标轴
    • subplot(m,n,p,'align'):对齐坐标轴
    • subplot(h):使句柄h对应的坐标轴为当前的,用于后面图形的输出展示
    • subplot('Position',[left bottom widthheight]):在指定的位置上建立坐标轴
    • subplot(...,prop1,value1,prop2,value2,...):设置坐标轴的属性及属性值
    • h = subplot(...):返回坐标轴的句柄值h
    % 利用subplot绘制子图
    clear all
    x = 0:0.01*pi:pi*16;
    j = sqrt(-1);
    subplot(2,2,1);plot(abs(sin(x)) .* (cos(x) + j * sin(x)),'LineWidth',3);
    xlim([-1 1]);ylim([-1 1]);
    subplot(2,2,2);plot(abs(sin(x/2)) .* (cos(x) + j * sin(x)),'LineWidth',3);
    xlim([-1 1]);ylim([-1 1]);
    subplot(2,2,3);plot(abs(sin(x/3)) .* (cos(x) + j * sin(x)),'LineWidth',3);
    xlim([-1 1]);ylim([-1 1]);
    subplot(2,2,4);plot(abs(sin(x/4)) .* (cos(x) + j * sin(x)),'LineWidth',3);
    xlim([-1 1]);ylim([-1 1]);

    7.交互式绘图

    matlab中设置了相应的鼠标操作的图形操作指令,分别是ginput、gtext和zoom函数。

    • 除了ginput函数只能应用于二维图形外,其余两个函数对二维和三维图像均适用
    • ginput函数和zoom函数配合使用,可以从图形中获得较为准确的数据
    • 在逻辑顺序并不十分清晰的情况下,并不提倡这几个指令同时使用

    ginput函数:

    用于交互式从matlab绘制的图形中读取点的坐标。

    • [x,y] = ginput(n):用于交互式的通过鼠标读取图形中的点,返回点的横纵坐标值。其中x为点的横坐标值,y为点的纵坐标值,输入参数n为选择点的个数,可以按Enter键提前结束读点操作
    • [x,y] = ginput:可以无限地读取图形中点的坐标直到按下Enter键
    • [x,y,button] = ginput(...):button值返回读点时的鼠标操作,其中1代表按下鼠标左键读点,2代表按下鼠标中键读点,3代表按下鼠标右键读点。
    clear all
    x1 = 0:pi./100:2*pi;
    plot(x1,cos(x1));
    n = 10;
    [x,y] = ginput(n);
    >> x
    
    x =
    
        0.8548
        1.3602
        2.6075
        3.9194
        5.0269
        5.3710
        4.6075
        4.2419
        2.0806
        2.7258
    
    >> y
    
    y =
    
        0.6479
        0.1887
       -0.8735
       -0.7335
        0.2977
        0.5856
       -0.1381
       -0.5272
       -0.3755
        0.2821
    
    

     

    gtext函数: 

    gtext用于为图形添加交互式标记。

    gtext('str'):用鼠标把字符串或字符串元胞数组放置到图形中作为文字说明

    clear all
    x = -pi:.1:pi;
    y = sin(x);
    plot(x,y);
    xlabel('x');ylabel('y');
    gtext('y = sin(x)','fontsize',10) % 添加文本

     

    zoom函数:

    zoom函数可以将局部图像进行放大。

    • zoom on:打开交互式图形放大功能
    • zoom off:关闭交互式图形放大功能
    • zoom out:将系统返回非放大转态,并将图形恢复原状
    • zoom reset:系统将记住当前图形的放大状态,作为放大状态的设置值,当使用zoom out或双击鼠标时,图形并不是返回到原状,而是返回reset时的放大状态
    • zoom:用于切换放大系数,取值为on或off
    • zoom xon:只对x轴进行放大
    • zoom yon:只对y轴进行放大
    • zoom(factor):用放大系数factor进行放大或缩小,而不影响交互式放大的转态。如果factor>1,则将系统图形放大factor倍;如果0<factor<=1,则将系统图形放大1/factor倍
    • zoom(fig,option):对窗口fig(不一定为当前窗口)中的二维图形进行放大,其中参数option为on、off、xon、yon、reset、factor等
    clear all
    t = 0.01:0.01:2*pi;
    figure;
    subplot(2,2,1);plot(t,sin(t));
    axis([-5 10 -3 3]); % 设置坐标轴
    title('放大前');
    subplot(2,2,2);plot(t,sin(t));
    axis([0 6 -1.5 1.5]);
    zoom on; % 图像放大
    title('放大后');
    subplot(2,2,3);plot(t,sin(t));
    axis([0 6 -3 3]);
    zoom xon;
    title('x轴方法');
    subplot(2,2,4);plot(t,sin(t));
    axis([-5 10 -1.5 1.5]);
    zoom yon;
    title('y轴放大');

    8.双坐标轴绘制

    在MATLAB中,提供了plotyy函数实现双坐标轴的绘制功能。

    • plotyy(x1,y1,x2,y2):在一个图形窗口同时绘制两条曲线(x1,y1)和(x2,y2),曲线(x1,y1)用左侧的y轴,曲线(x2,y2)用右侧的y轴
    • plotyy(x1,y1,x2,y2,fun):fun是字符串格式,用来指定绘图的函数名
    • plotyy(x1,y1,x2,y2,fun1,fun2):用两种不同的函数分别绘制两种曲线。
    clear all
    x = 0:0.01:20;
    y1 = 200 * exp(-0.05 * x) .* sin(x);
    y2 = 0.8 * exp(-0.5 * x) .* sin(10 * x);
    [AX,H1,H2] = plotyy(x,y1,x,y2,'plot');
    xlabel('x');
    set(get(AX(1),'Ylabel'),'String','慢衰减');
    set(get(AX(2),'Ylabel'),'String','快衰减');
    set(H1,'LineStyle','--')
    set(H2,'LineStyle',':')

    9.函数绘图

    如果只知道函数的表达式,也可以绘制该函数的图形,函数fplot用于绘制一元函数的图形,函数explot用于 绘制二元函数的图形,函数ezploar用于绘制三元函数的图形。

    fplot函数:

    fplot函数根据函数的表达式自动调整自变量的范围,无须给函数赋值,直接生成或反映函数变化规律的图形,在函数变化快的区域,采用小的间隔,否则采用大的间隔。一般用在对横坐标取值间隔没有明确的要求,仅查看函数大致变化规律的情况下使用。

    • fplot(fun,limits,tol,LineSpec):limit是指定的范围,一般limit=[a,b,c,d],a,b为横轴的上下限,c,d为纵轴的上下限。
    • fplot(fun,limits,n):当n>=1时,至少画出n+1个点,最大步长不超过(xmax-xmin)/ n
    • [X,Y] = fplot(fun,limits,...):返回横坐标与纵坐标的值给变量X和Y,此时fplot不画出图形。如需画出图形,即可使用plot(X,Y)语句
    % 例2-12:利用fplot函数绘制f(x) = sin(tan(pi*x))
    x = 0:0.01:1;
    y = sin(tan(pi*x));
    subplot(1,2,1);plot(x,y);
    title('plot 函数绘图');
    subplot(1,2,2);fplot('sin(tan(pi*x))',[0,1],1e-4);
    title('fplot 函数绘图');

    ezplot函数:

    函数的表达式显示在图形的上方,同时对坐标轴可以不加任何限制作图。

    • ezplot(fum):绘制fun函数图形
    • ezplot(fun,[min,max]):绘制函数fun(x)在区间[min,max]的图形。
    • ezplot(fun2):绘制隐函数fun2=fun(x,y)的图形,且fun(x,y)=0.
    • explot(fun2,[xmin,xmax,ymin,ymax]):绘制隐函数fun(x,y)=0在区间[xmin,xmax]和[ymin,ymax]区间上的图形
    • ezplot(funx,funy):绘制参数方程x=funx,y=funy的函数图形
    subplot(2,1,1);
    ezplot('cos(5 * t)','sin(3 * t)',[0,2 * pi])
    grid on;
    subplot(2,1,2);
    ezplot('5 * x ^ 2 + 25 * y ^ 2 = 6',[-1.5,1.5,-1,1])
    grid on;

     

    10.二维特殊图形

    条形图:

    条形图可以显示适量数据和矩阵数据,如果用户需要表示跨时间段的运算结果、不同数据的比较结果以及部分相对整体比较结果,常会用到条形图绘制离散数据。

    • bar(Y)或barh(Y):绘制Y的条形图
    • bar(x,Y)或barh(Y):在位置x上绘制Y的条形图
    • bar(...,width)或barh(...,width):用width指定条形图的宽度,默认值为0.8,如果大于1,那么条与条之间将重合。
    • bar(...,'style')或barh(...,'style'):指定条形图的绘制类型,style可以取值grouped或stacked.group为排列型,stacked为堆型条状图
    • bar(...'bar_color')或barh(...,'bar_color'):指定条形图颜色
    • bar(...,'PropertyName',PropertyValue',...):指定条形图的属性名及属性值。
    • h = bar(...)或h=barh(...):返回条形图的句柄向量h
    % 条形图
    Y = [0.5 0.7 0.8;0.7 0.8 0.4;0.4 0.3 0.9;0.3 0.6 0.9;0.2 0.1 0.6];
    subplot(2,2,1)
    bar(Y,'grouped'),title 'Group';
    xlabel('销售数据');ylabel('销售直方图')
    subplot(2,2,2)
    bar(Y,'stacked');title 'Stack'
    xlabel('销售数据');ylabel('销售直方图')
    subplot(2,2,3)
    barh(Y,'stacked');title 'Stack'
    xlabel('销售数据');ylabel('销售直方图')
    subplot(2,2,4)
    bar(Y,1.2);title 'Width = 1.2';
    xlabel('销售数据');ylabel('销售直方图')

    饼形图:

    饼状图主要用于显示矩阵中每个元素在所有元素总和中所占的百分比及各部分之间的比例关系。

    • pie(X):X是向量,根据X中个分量所占的百分比,绘制出相应比例,如果总和小于1,只会绘制部分圆
    • pie(X,explode):可以把指定的部分从圆形中抽取出来,explode为一个与X长度相同的向量,其中不为0的数所对应的分量,将被抽取出来。
    • pie(X,label):对每个分块添加标注,labels为单元数组,长度与X相同,只能是字符串
    • pie(axes_handel,...):根据给定的句柄值绘制饼状图。
    • h = pie(...):返回图形对象的句柄向量图h
    % 饼形图
    x = [0.15 0.2 0.25 0.35];
    pie(x)

    直方图:

    条形直方图中的x轴反映了数据y中元素数值的范围,直方图的y轴显示出参数y中的元素落入该组的数目

    • n = hist(Y):把Y按其中数据的大小分为10个长度相同的段,统计每段中的元素个数并返回给n,如果Y是矩阵,那么按列分段。
    • n = hist(Y,x):输入参数x是向量,以x的值为中心生成直方图的各条。
    • n = hist(Y,nbins):输入参数nbins是正整数,用来设置分段的个数
    • [n,xout] = hist(...):不绘制数据Y的直方图,只返回反映每个条形图中元素的向量与反映每个条形图频率的向量
    • hist(...):只绘制直方图,不输出参数
    • hist(...):只绘制直方图,不输入参数
    • hist(axes_handle,...):根据给定的句柄值axes_handle绘制直方图。
    % 直方图
    rand('state',1);
    y = rand(100,1); % 生成待统计的数据
    [n,x] = hist(y); % 返回统计频数n和区域中心位置x
    s(1) = subplot(1,3,1);
    hist(y); % 绘制统计直方图
    xlabel('(a) hist(y)');
    s(2) = subplot(1,3,2);
    hist(y,7); % 绘制直方图并指定区域数目
    xlabel('(b) hist(y,7)');
    s(3) = subplot(1,3,3);
    hist(y,0:.1:1); % 绘制直方图,并指定每个区域的中心位置
    xlabel(' (x) hist(y,0:.1:1)');
    axis(s,'square');
    set(gcf,'Color','w');

    散点图:

    散点图将数据序列显示为一组点,在回归分析中较为常用,放映了因变量随自变量变化的趋势,便于观察两者关系。

    • scatter(X,Y):绘制关于X和Y的散点图,由于没有设置散点图的其他属性,因此matlab采用默认的颜色和大小绘制数据点
    • scatter(X,Y,S,C);根据指定颜色C绘制散点图
    • scatter(...,markertype):使用专门的标记类型o绘制散点图。
    • scatter(...,'filled'):对标记进行填充
    • scatter(...,'PropertyName',propertyvalue):设置散点的属性名及属性值
    • h = scater(...):返回散点图的句柄值。
    % 散点图
    x = linspace(0,3 * pi, 200);
    y = cos(x) + rand(1,200);
    c = linspace(1,10,length(x));
    scatter(x,y,[],x)

    二维绘图的基本内容应该都在这里了,补充之间的绘图内容,接下来还会有三维绘图、四维绘图。

    展开全文
  • 二维图像三维

    万次阅读 2018-09-29 11:40:49
    1: 物体表达的必要和重要 机器人能像人一样识别物体,是机器人视觉(robot vision)专家的梦想和追求。要想识别物体,不论是人还是机器人,仅仅看到是不够的,还需要知道物体的表达方式。表达是个与认知科学...
  • 三维人脸识别研究

    千次阅读 2019-11-05 09:42:19
    摘自: 三维人脸研究 三维人脸研究现状: 传统的人脸识别方法是基于二维图像分析的理论进行人脸的表示、...与二维数据相比,三维数据包含了人脸的空间信息,是人脸本身固有的信息,对外界条件的变化具有很好鲁...
  • 随着地理空间信息服务产业的快速发展,地理空间数据的要求越来越高。对地理空间数据的要求正朝着大信息量、高精度、可视...、地面三维激光扫描仪测量原理;三、三维激光扫描系统分类;四、三维激光扫描系统特点;五、
  • 怎么证明一个一维函数连续

    千次阅读 2018-09-03 19:32:32
    若想证明一个一维函数 f(x)f(x)f(x) 在 x=ax=ax=a 处连续,必须满足下列个条件: (1) f(x)f(x)f(x) 在 x=ax=ax=a 处有值. (2) limx→alimx→a\lim\limits_{x\rightarrow a} 存在. (3) limx→a=f(a)limx→...
  • 3.1 一维插值方法 1、数据处理的应用背景 2、插值的基本原理 3、引例 3.1、引例演示 4、一维插值定义 5、一维插值原理 6、一维插值方法 6.1、拉格朗日插值 6.2、分段线性插值 6.3、次样条插值 3.2 二维插值方法 1...
  • 一文读懂三维基因组

    千次阅读 2020-12-25 16:56:37
    文章目录、细胞核 *Nucleus*、染色质疆域 *Chromosome Territory,CT*、染色质区室 *A/B compartments*四、拓扑结构域 *Topologically associating Domains,TAD*五、层关联域 *Lamina Associating Domains,...
  • java二维数组初始化的种方式

    千次阅读 2019-07-30 17:16:10
    有些知识觉得很简单,但其中一些细节的东西我们未必知道,比如说...2、定义二维数组的大小,然后分别赋值 3、数组第二维的长度可变化 //第种方式:定义的同时大括号直接复制 int[][] array1={{1,3,1},{...
  • 一维形式,就是之前说的种数据组合类型了 二维数据,是一维数据的组合形式,由多个一维数据组合形成 多维数据,由一维数据或者二维数据在新维度上形成的 高维数据,仅利用最基本的二元关系展示数据间的复杂结构 ...
  • 简介:建立三维人脸模型 -> 参数化人脸生成 -> 从单张人脸的二维照片,利用三维人脸模型,重建三维人脸 -> 三维人脸参数化识别 1. 根据三维人脸的点云数据库,建立三维人脸模型 (高维向量人脸空间...
  • 双目三维成像

    千次阅读 2020-10-09 17:53:17
    自然界本来就是三维空间,自然界所有景物都是立体的。人眼观看自然界景物时,不仅能看到景物的高度与宽度,而且还能分辨出景物的深度,即人眼具有立体视觉。迄今人类使用的电视系统绝大部分仅能显示平面图像,故...
  • 九种常见的二维插值方法

    千次阅读 2021-03-08 13:40:01
    双线性插值在数学上,双线插值是线性插值的种推广,用于在二维直线网格上插值两个变量(如x和y)的函数。 双线性插值首先在个方向上使用线性插值,然后在另个方向上使用线性插值。虽然每一步在采样值和位置...
  • 三维数组(二维数组指针) * ( &a ) =a :对二维数组的地址取值等于首个一维数组的地址 * ( *(*(a+i)+j)+k) a+i: 第 i+1 个二维数组的地址 *(a+i): 第 i+1 个二维数组的首个一维数组的地址 *(*(a+...
  • 二维高斯核的可分离

    千次阅读 2013-03-19 11:01:04
    忽略常数k的影响,那么对一个图像做二维高斯滤波相当于先对列做一维高斯滤波,再对行作一维高斯滤波(注意到行列求和的可交换,也可以先行后列),而且行列的一维的高斯核的方差同二维高斯核的方差相同。
  • 三维重建基础

    万次阅读 多人点赞 2016-06-01 19:12:13
    三维重建技术通过深度数据获取、预处理、点云配准与融合、生成表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型。这种模型可以对如文物保护、游戏开发、建筑设计、临床医学等研究起到辅助的作用。1.1 研究...
  • CSDN中关于立三维重构的介绍层出不穷,CNKI中也有各类综述对三维重构进行总结,撰写这篇博客仅作为本人对该类博客、论文的总结学习,加深自身学习的印象、作为学习的笔记。如有错误的地方,欢迎指正。   1、三维...
  • 三维物体基本几何变换 主要讨论如下几个问题 :如何对三维图形进行方向、尺寸和形状方面的变换 ?三维物体如何在二维输出设备上输出 ?通过三维图形变换,可由简单图形得到复杂图形,三维图形变换则分为三维...
  • 简介 参考: ...DBSCAN(Density-based spatial clustering of applications with noise) 最常用的聚类分析算法之。 该算法以密度为本:给定某空间里的个点,这算法能把该点附...
  • 三维重建开源代码汇总【保持更新】

    千次阅读 多人点赞 2021-05-22 22:43:29
    三维重建开源代码汇总,不定期更新。SFM、MVS、SLAM、Mesh
  • 基于cesium的三维管线系统综述

    千次阅读 2021-02-17 00:22:27
    (1)cesium是个javascript库,地图数据通过cesium可以在浏览器中直接浏览,也就是它是个网络三维地图引擎; (2)web服务器使用Tomcat,有了cesium,建立三维地理信息服务的成本显著下降。 Cesium三维场景...
  • 三维重建技术概述

    万次阅读 多人点赞 2016-06-01 22:29:08
    基于视觉的三维重建,指的是通过摄像机获取场景物体的数据图像,并对此图像进行分析处理,再结合计算机视觉知识推导出现实环境中物体的三维信息。1. 相关概念(1)彩色图像与深度图像彩色图像也叫作RGB图像,R、G、B...
  • 文章目录一、一维卷积1.1 介绍1.2 类别1.2.1 一维Full卷积1.2.2 一维Same卷积1.2.3 一维Valid卷积1.3 具备深度的一维卷积1.4 具备深度的张量与多个卷积核的卷积、转置卷积2.1 定义2.2 过程2.3 计算2.4 转置卷积的...
  • 实景三维GIS的应用前景概述

    万次阅读 2018-08-02 23:41:29
    实景三维GIS的应用前景概述 佚名 1 引言 随着数字化城市进程的发展,各行业信息化建设也加紧步伐,地理信息系统(GIS)作为信息化的有力工具占据越来越重要的地位。然而,二维GIS本身也面临一些问题,数据太单一...
  • 几个三维引擎初探

    万次阅读 2019-02-21 15:47:31
    文章目录几个三维引擎初探1 术语2 对比3 非常好的学习资料(内有代码)4 参考资料 ...而个封装了硬件操作和图形算法、简单易用、功能丰富的三维图形开发环境,就可以称为三维图形引擎。 游戏引擎:3D游戏就是...
  • 三维GIS平台?

    千次阅读 2018-05-28 22:30:58
    1. 三维GIS平台选型需从哪几方面评价 1.1. 操作平台 1.2. 数据支持 1.2.1. 常用3D GIS数据支持 1.2.2. 海量(大数据量)三维数据支持 1.2.3. 数据分享 1.3. 自身业务支持 1.3.1. 业务数据支持 1.3.2. 工作流...
  • PCL三维重建笔记

    千次阅读 2019-07-12 14:58:41
    三维重建的三种方法: KinectFusion,直接获取人体的三维点云数据,但获得的点云分散而模糊 Opencv、OpenNI,操作过程过于繁琐、配置环境过于复杂 利用Processing软件编程,通过导入SimpleOpenNI库,连接...
  • SuperMap 三维产品白皮书

    万次阅读 2017-03-31 18:08:29
    SuperMap 三维基于完全自主研发的二三维一体化 GIS 技术体系,并将三维 GIS 技术贯穿 到从组件、桌面到客户端再到移动端的全系列产品中,为用户提供强大实用的 GIS 功能与逼真 的三维可视化效果,突破了单纯三维可视...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 291,902
精华内容 116,760
关键字:

一维性二维性三维性