精华内容
下载资源
问答
  • Matlab画图常用的线条符号、颜色

    万次阅读 多人点赞 2018-05-06 16:26:00
    线型说明标记符说明颜色说明-...实心圆c青绿色x叉号符m洋红色s(square)正方形y黄色d菱形k黑色^三角形w白色v下三角形> 右三角形< 左三角形p(pentagram)五角星h(hexagram)六边形square正方形pentagram...

    目录

    一、matlab颜色表

    二、matlab调色板

    1、常用颜色的RGB值

    2、产生标准调色板的函数

    三、matlab线条

    1、例子1

    2 、例子2

    3 、若要改变颜色,在座标对后面加上相关字串即可

    4 、若要同时改变颜色及图线型态(Line style),也是在坐标对后面加上相关字串即可

    5、用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围

    6 、MATLAB也可对图形加上各种注解与处理:(见上表)

    7、画椭圆

    8 、绘制函数 在0 ≤ x ≤ 1时的曲线。

    9 、画出衰减振荡曲线 与它的包络线 及 。t 的取值范围是[0, 4π] 。

    10 、在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图


    一、matlab颜色表

    线型

    说明

    标记符

    说明

    颜色

    说明

    -

    实线(默认)

    +

    加号符

    r

    红色

    --

    双划线

    o

    空心圆

    g

    绿色

    :

    虚线

    *

    星号

    b

    蓝色

    :.

    点划线

    .

    实心圆

    c

    青绿色

      

    x

    叉号符

    m

    洋红色

      

    s(square)

    正方形

    y

    黄色

      

    d

    菱形

    k

    黑色

      

    ^

    上三角形

    w

    白色

      

    v

    下三角形

      
      

    >

    右三角形

      
      

    <

    左三角形

      
      

    p(pentagram)

    五角星

      
      

    h(hexagram)

    六边形

      square正方形  
      pentagram五角形  
      hexagram六角形  

    二、matlab调色板

    1、常用颜色的RGB值

      --------------------------------------------
        颜色   R   G   B     颜色   R   G  B
      --------------------------------------------
         黑    0   0  1     洋红    1  0   1
         白    1   1  1     青蓝    0  1   1
         红    1   0  0     天蓝 0.67 0   1
         绿    0   1  0     橘黄    1 0.50
         蓝    0   0  1     深红   0.5 0  0
         黄    1   1  0      灰    0.5 0.50.5      
      --------------------------------------------
    ⚠️注意:MATLAB中调色板色彩强度[0,1],0代表最暗,1代表最亮。

    2、产生标准调色板的函数

      -------------------------------------------------
        函数名      调色板
      -------------------------------------------------
         Hsv     色彩饱和度,以红色开始,并以红色结束
         Hot     黑色-红色-黄色-白色
         Cool    青蓝和洋红的色度
         Pink     粉红的色度
         Gray     线型灰度
         Bone    带蓝色的灰度
         Jet      Hsv的一种变形,以蓝色开始,以蓝色结束
         Copper   线型铜色度
         Prim     三棱镜,交替为红、橘黄、黄、绿和天蓝
         Flag     交替为红、白、蓝和黑
    --------------------------------------------------
    缺省情况下,调用上述函数灰产生一个64×3的调色板,用户也可指定调色板大小。
     

    三、matlab线条

    Matlab画的线较多时,线的颜色的选取对图的美观是有很大的影响的Jonathan C. Lansey
    Matlab-code提供了在不同线上画不同颜色简单易用的函数。
    Examples demonstrating thecolors.
    % LINECOLORS 
    N=6; 
    X =linspace(0,pi*3,1000); 
    Y =bsxfun(@(x,n)sin(x+2*n*pi/N), X.',1:N); 
    C =linspecer(N); 
    axes('NextPlot','replacechildren','ColorOrder',C); 
    plot(X,Y,'linewidth',5) 
    ylim([-1.1 1.1]);
    
    % SIMPLER LINE COLOREXAMPLE 
    N = 6; X =linspace(0,pi*3,1000); 
    C =linspecer(N) 
    holdoff; 
    forii=1:N 
       Y =sin(X+2*ii*pi/N); 
      plot(X,Y,'color',C(ii,:),'linewidth',3); 
       hold on; 
    end
    
    % COLORMAPEXAMPLE 
    A =rand(15); 
    figure; imagesc(A); % defaultcolormap 
    figure; imagesc(A);colormap(linspecer); % linspecer colormap

    注:C即为生成的RGB颜色(非常好用)

    【用法】

    grid 打开网格线 -- 虚线
    hold on 命令用于在已画好的图形上添加新的图形

    1、例子1

    x=0:0.001:10; % 0到10的1000个点(每隔0.001画一个点)的x座标
    y=sin(x); % 对应的y座标
    plot(x,y); % 绘图

    注:matlab画图实际上就是描点连线,因此如果点取得不密,画出来就成了折线图,请试验之

    2 、例子2

    Y=sin(10*x);
    plot(x,y,'r:',x,Y,'b') % 同时画两个函数

    3 、若要改变颜色,在座标对后面加上相关字串即可

    x=0:0.01:10;
    plot(x,sin(x),'r')

    4 、若要同时改变颜色及图线型态(Line style),也是在坐标对后面加上相关字串即可

    plot(x,sin(x),'r*')

    5、用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围

    axis([0,6,-1.5,1])

    6 、MATLAB也可对图形加上各种注解与处理:(见上表)

    xlabel('x轴'); % x轴注解
    ylabel('y轴'); % y轴注解
    title('余弦函数'); % 图形标题
    legend('y = cos(x)'); % 图形注解
    gtext('y = cos(x)'); % 图形注解 ,用鼠标定位注解位置
    grid on; % 显示格线

    7、画椭圆

    a = [0:pi/50:2*pi]'; %角度
    X = cos(a)*3; %参数方程
    Y = sin(a)*2;
    plot(X,Y);
    xlabel('x'), ylabel('y');
    title('椭圆')

    8 、绘制函数 在0 ≤ x ≤ 1时的曲线。

    x=0:0.1:1
    y=x.*exp(-x) %为什么用点运算?若不用会怎样
    plot(x,y),xlabel('x'),ylabel('y'),title('y=x*exp(-x)')

    9 、画出衰减振荡曲线 与它的包络线 及 。t 的取值范围是[0, 4π] 。

    t=0:pi/50:4*pi;
    y0=exp(-t/3);
    y=exp(-t/3).*sin(3*t);
    plot(t,y,'-r',t,y0,':b',t,-y0,':b') % -r表示红色实线,:b表示蓝色点线,看上表
    grid

    10 、在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图

    x=linspace(0,2*pi,30); y=sin(x); z=cos(x);
    u=2*sin(x).*cos(x); v=sin(x)./cos(x);
    subplot(2,2,1),plot(x,y),axis([0 2*pi -1 1]),title('sin(x)')
    subplot(2,2,2),plot(x,z),axis([0 2*pi -1 1]),title('cos(x)')
    subplot(2,2,3),plot(x,u),axis([0 2*pi -1 1]),title('2sin(x)cos(x)')
    subplot(2,2,4),plot(x,v),axis([0 2*pi -20 20]),title('sin(x)/cos(x)')

     

    展开全文
  • 相比于Breanham算法,中点画线算法更加直接。 中点算法的重要假设是,我们能绘出没有间隔的最细的直线。两对角像素之间的连接是没有间隔的。 一、中点画线算法原理 设线段端点为:(x1, y1),(x2, y2),∆x和∆y为...

    相比于Breanham算法,中点画线算法更加直接(非效率)。

    中点算法的重要假设是,我们能绘出没有间隔的最细的直线。两对角像素之间的连接是没有间隔的。

    一、中点画线算法原理

    设线段端点为:(x1, y1),(x2, y2),∆x和∆y为水平和垂直偏移量
    { ∆ y = y 2 − y 1 ∆ x = x 2 − x 1 \left\{ \begin{array}{c} ∆y=y_2-y_1 \\ ∆x=x_2-x_1 \end{array} \right. {y=y2y1x=x2x1

    直线的隐式方程: f ( x , y ) ≡ ( y 1 − y 2 ) x + ( x 2 − x 1 ) y + x 1 y 2 − x 2 y 1 = 0 f(x,y)≡(y_1-y_2)x+(x_2-x_1)y+x_1y_2-x_2y_1=0 f(x,y)(y1y2)x+(x2x1)y+x1y2x2y1=0

    那么直线斜率为: k = y 1 − y 2 x 1 − x 2 k=\frac{y_1-y_2}{x_1-x_2} k=x1x2y1y2

    假设已经确定了要显示的点(xk , yk),那么,需要确定下一个点 ( x k + 1 , y k + 1 ) (x_k+1 , y_{k+1}) (xk+1,yk+1)是绘制在像素B ( x k + 1 , y k ) (x_k+1, y_k) (xk+1,yk)还是A ( x k + 1 , y k + 1 ) (x_k+1, y_k+1) (xk+1,yk+1)上。

    设M为AB的中点,Q为线段与AB边的交点。若Q在M的上面,则应取像素点A作为 ( x k + 1 , y k + 1 ) (x_k+1 , y_k+1) (xk+1,yk+1) ,否则应取像素点B。
    ​​​​在这里插入图片描述
    平面任一点 ( x , y ) (x, y) (x,y)与直线的相对位置可由 ( x , y ) (x, y) (x,y)的符号确定:
    { f ( x , y ) < 0 , ( x , y ) 位 于 直 线 下 方 f ( x , y ) = 0 , ( x , y ) 位 于 直 线 上 f ( x , y ) > 0 , ( x , y ) 位 于 直 线 上 方 \left\{ \begin{array}{c} f (x, y) < 0,(x, y)位于直线下方 \\ f (x, y) = 0,(x, y)位于直线上 \\ f (x, y) > 0,(x, y)位于直线上方 \end{array} \right. f(x,y)<0(x,y)线f(x,y)=0(x,y)线f(x,y)>0(x,y)线
    设决策参数 p k p_k pk为M点的函数值:

    p k = f ( x k + 1 , y k + 1 2 ) = a ( x k + 1 ) + b ( y k + 1 2 ) + c p_k = f (x_k+1, y_k+\frac12) = a (x_k+1) + b (y_k + \frac12) + c pk=f(xk+1,yk+21)=a(xk+1)+b(yk+21)+c
    那么,

    p k ≤ 0 p_k ≤ 0 pk0,Q应取A ( x k + 1 , y k + 1 ) (x_k+1, y_k+1) (xk+1,yk+1)

    p k > 0 p_k > 0 pk0,Q应取B ( x k + 1 , y k ) (x_k+1, y_k) (xk+1,yk)
    因此,有如下关系:

    p k ≤ 0 p_k ≤ 0 pk0时, y k + 1 = y k + 1 y_{k+1} = y_k+1 yk+1=yk+1
    p k > 0 p_k > 0 pk0时, y k + 1 = y k y_{k+1} = y_k yk+1=yk
    既然像素取值取决于pk的符号,为避免浮点数运算,不妨取:

    p k = 2 f ( x k + 1 , y k + 1 2 ) = 2 a ( x k + 1 ) + 2 b ( y k + 1 2 ) + 2 c p_k = 2 f (x_k+1, y_k+\frac12) = 2a (x_k+1) + 2b (y_k + \frac12) + 2c pk=2f(xk+1,yk+21)=2a(xk+1)+2b(yk+21)+2c
    其中

    { a = y 1 − y 2 , a = − ∆ y b = x 2 − x 1 , b = ∆ x c = x 1 y 2 − x 2 y 1 \left\{ \begin{array}{lr} a=y_1-y_2,a=-∆y \\ b=x_2-x_1,b=∆x\\ c=x_1y_2-x_2y_1 \end{array} \right. a=y1y2,a=yb=x2x1,b=xc=x1y2x2y1
    进一步推导 p k p_k pk p k + 1 p_{k+1} pk+1的递推关系:

    p k + 1 = 2 a ( x k + 1 + 1 ) + 2 b ( y k + 1 + 1 / 2 ) + 2 c p_{k+1}=2a (x_{k+1}+1) + 2b (y_{k+1} + 1/2) + 2c pk+1=2a(xk+1+1)+2b(yk+1+1/2)+2c

    p k + 1 − p k = 2 a ( x k + 1 − x k ) + 2 b ( y k + 1 − y k ) = 2 a + 2 b ( y k + 1 − y k ) p_{k+1}-p_k=2a(x_{k+1}-x_k)+2b(y_{k+1}-y_k)=2a+2b(y_{k+1}-y_k) pk+1pk=2a(xk+1xk)+2b(yk+1yk)=2a+2b(yk+1yk)

    最终,得到如下递推关系:
    { p k + 1 = p k + 2 a + 2 b = p k − 2 ∆ y + 2 ∆ x , p k ≤ 0 p k + 1 = p k + 2 a = p k − 2 ∆ y , p k > 0 \left\{ \begin{array}{lr} p_{k+1} = p_k + 2a + 2b= p_k - 2∆y + 2∆x& , p_k ≤ 0\\ p_{k+1}= p_k + 2a = p_k - 2∆y &,p_k > 0& \end{array} \right. {pk+1=pk+2a+2b=pk2y+2xpk+1=pk+2a=pk2y,pk0pk0
    对于线段的起始端点(x1, y2),决策变量p0为

      p 0 = 2 f ( x 0 + 1 , y 0 + 1 2 ) = 2 a ( x 0 + 1 ) + 2 b ( y 0 + 1 2 ) + 2 = 2 a x 0 + 2 a + 2 b y 0 + b + 2 = 2 f ( x 0 , y 0 ) + 2 a + b = 2 a + b = − 2 ∆ y + ∆ x \begin {aligned} \ p_0 = 2 f (x_0+1, y_0+\frac12) & = 2a (x_0+1) + 2b (y_0+\frac12) + 2\\ & = 2a x_0+ 2a + 2b y_0+ b + 2&\\ & = 2 f(x_0, y_0) + 2a + b&\\ &= 2a + b = -2∆y +∆x \end{aligned}  p0=2f(x0+1,y0+21)=2a(x0+1)+2b(y0+21)+2=2ax0+2a+2by0+b+2=2f(x0,y0)+2a+b=2a+b=2y+x
    可见,中点画线算法与Bresenham算法的原理相同,只是在确定决策参数pk时不同。

    中点画线算法也仅包含整数运算,算法效率很高。

    二、C语言实现

    
    void MidpointLine(int x0,int y0,int x1,int y1,int color)
    {
    	int dx = abs(x1 - x0);int sx = x0<x1: 1: -1;
    	int dy = abs(y1 - y0);int sy = y0<y1: 1: -1;
    	int a = -sy*dy,b=sx*dx;
    	int p = 2*a + b;
    	 
    	while(putpixle(x0,y0),x0 != x1 || y0 !=y1){
    		if(dx > dy){
    			x0+=sx;
    			if(p < 0) {p +=2*(a+b);y+=sy;}
    			else	  {p+=2*a;}
    		}				
    		else{
    			y0+=sy;
    			if(p < 0) {p +=2*(a+b);x +=sx;}
    			else	  {p+=2*a;}
    		}	
    	}
    }
    
    展开全文
  • 小白谈计算机图形学(一)如何划线引言如何画线基本思想数值微分法(DDA算法)数值微分基本思路数值微分改进中点画线法中点画线引言中点画线改进Bresenham画线法Bresenham基本思路Bresenham画线改进小结 引言 大家好...

    引言

    大家好,众所周知,计算机的图像显示是由一个一个像素组成,正如分子组成了世界,当像素合理分布,同样可以还原很多真实世界的场景。

    如何画线

    基本思想

    已知过端点 p 0 ( x 0 , y 0 ) p_0(x_0,y_0) p0(x0,y0) p 1 ( x 1 , y 1 ) p_1(x_1,y_1) p1(x1,y1)的直线:
    y = k x + b y=kx+b y=kx+b
    直观的做法是把每个 x x x的值代入直线方程求出相应的 y y y值。取像素点 ( x , i n t ( y ) ) (x, int(y)) (x,int(y))作为当前点坐标。光栅直线算法属于图形学最底层的算法,因此要精益求精。

    数值微分法(DDA算法)

    数值微分基本思路

    增量算法变乘法为加法,这里利用斜截式,首先 y i + 1 = y i + k Δ x y_{i+1}= y_i+ k\Delta x yi+1=yi+kΔx,当 Δ x = 1 \Delta x=1 Δx=1时:
    y i + 1 = y i + k y_{i+1}= y_i+ k yi+1=yi+k

    数值微分改进

    • 此处,我们做细节处理,将像素格划分为上半和下半, 用 i n t ( y + 0.5 ) int(y+0.5) int(y+0.5)判断是上方还是下方涂色。
      在这里插入图片描述
    • 同时该算法只能画 ∣ k ∣ ≤ 1 |k| \leq1 k1,超过则会出现离散的点,失真。可以采用:
      { y i + 1 = y i + k ( ︱ k ︱ < 1 , Δ x = 1 ) x i + 1 = x i + 1 k ( ︱ k ︱ > 1 , Δ y = 1 ) \left\{ \begin{aligned} y_{i+1} = y_i+k( ︱k︱<1,\Delta x =1)\\ \\ x_{i+1} = x_i+\frac{1}{k}( ︱k︱>1,\Delta y =1) \end{aligned} \right. yi+1=yi+k(k1Δx=1xi+1=xi+k1(k1Δy=1
    • 优点:简单直观,迭代的算法
      缺点:浮点运算,每步都需四舍五入取整。

    中点画线法

    中点画线引言

    利用后一中点与前一中点的函数关系,采用了直线的一般式方程
    F ( x , y ) = y − y 1 − y 0 x 1 − x 0 x − b F(x,y)=y-\frac{y_1-y_0}{x_1-x_0}x-b F(x,y)=yx1x0y1y0xb
    认为 Δ x > 0 \Delta x>0 Δx>0,即:
    F ( x , y ) = ( Δ x ) y − ( Δ y ) x − ( Δ x ) b F(x,y)=(\Delta x)y-(\Delta y)x-(\Delta x)b F(x,y)=(Δx)y(Δy)x(Δx)b
    直线方程将平面分为三个区域:
    { F ( x , y ) = 0 ( 直 线 上 的 点 ) F ( x , y ) > 0 ( 直 线 上 方 的 点 ) F ( x , y ) < 0 ( 直 线 下 方 的 点 ) \left\{ \begin{aligned} F(x, y) = 0(直线上的点)\\ F(x, y) > 0(直线上方的点) \\ F(x, y) < 0(直线下方的点) \end{aligned} \right. F(x,y)=0(线)F(x,y)>0(线)F(x,y)<0(线)
    在这里插入图片描述
    M M M Q Q Q的下方,则说明 P u P_u Pu离直线近,应为下一个像素点;当 M M M Q Q Q的上方,应取 P d P_d Pd 为下一点。但是…每一个像素的计算量是4个加法,两个乘法。比DDA算法的计算量大多了,毫无可取之处!

    中点画线改进

    根据上一次计算的 d d d值判断接下来 d d d值的变化

    • d < 0 d<0 d<0时,则取右上方像素 p u ( x i + 1 , y i + 1 ) p_u(x_i+1, y_i+1) pu(xi+1,yi+1)。判断再下一
      像素,则要计算:
      d n e w = F ( x i + 2 , y i + 1.5 ) = a ( x i + 1 ) + b ( y i + 0.5 ) + c + a = F ( x i + 1 , y i + 0.5 ) + a + b = d o l d + a + b \begin{aligned} d_{new}&=F(x_i+2,y_i+1.5)\\ &=a(x_i+1)+b(y_i+0.5)+c+a\\ &=F(x_i+1,y_i+0.5)+a+b\\ &=d_{old}+a+b \end{aligned} dnew=F(xi+2,yi+1.5)=a(xi+1)+b(yi+0.5)+c+a=F(xi+1,yi+0.5)+a+b=dold+a+b
    • d ≥ 0 d \geq 0 d0情况,则取正右方像素 ( x i + 1 , y i ) (x_i+1, y_i) (xi+1,yi), 判断下一个像素位置要计算:
      d n e w = F ( x i + 2 , y i + 0.5 ) = a ( x i + 1 ) + b ( y i + 0.5 ) + c + a = F ( x i + 1 , y i + 0.5 ) + a = d o l d + a \begin{aligned} d_{new}&=F(x_i+2,y_i+0.5)\\ &=a(x_i+1)+b(y_i+0.5)+c+a\\ &=F(x_i+1,y_i+0.5)+a\\ &=d_{old}+a \end{aligned} dnew=F(xi+2,yi+0.5)=a(xi+1)+b(yi+0.5)+c+a=F(xi+1,yi+0.5)+a=dold+a
    • 迭代需要初始值 d 0 d_0 d0
      d 0 = F ( x 0 + 1 , y 0 + 0.5 ) = a ( x 0 + 1 ) + b ( y 0 + 0.5 ) + c = a + 0.5 b \begin{aligned} d_0&=F(x_0+1,y_0+0.5) \\&=a(x_0+1)+b(y_0+0.5)+c \\&=a+0.5b \end{aligned} d0=F(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=a+0.5b
    • 由于我们只用 d d d的符号,所以使用 2 d 2d 2d摆脱小数运算更新后的公式为:
      { d 0 = 2 a + b d n e w = d o l d + 2 a + 2 b ( d < 0 ) d n e w = d o l d + 2 a ( d ≥ 0 ) \left\{ \begin{aligned} &d_0= 2a+b\\ &d_{new}=d_{old}+2a+2b(d<0) \\ &d_{new}=d_{old}+2a(d \geq 0) \end{aligned} \right. d0=2a+bdnew=dold+2a+2b(d<0)dnew=dold+2a(d0)

    Bresenham画线法

    Bresenham基本思路

    采用增量计算,检查误差项的符号,就可以确定该列的所求像素。

    • 直线的起始点在像素中心,所以误差项d的初值
      { d 0 = 0 d n e w = d o l d + k x i + 1 = x i + 1 ( 右 移 一 格 ) y i + 1 = { y i + 1 , d = d − 1 ( d ≥ 0.5 ) ( 上 移 一 格 ) y i ( d < 0.5 ) ( 保 持 不 动 ) \left\{ \begin{aligned} &d_0=0\\ &d_{new}=d_{old}+k\\ &x_{i+1}= x_i+1(右移一格)\\ &y_{i+1}= \left\{ \begin{aligned} &y_i+1,d=d-1&(d\geq0.5)(上移一格)\\ \\ &y_{i}&(d < 0.5)(保持不动) \end{aligned} \right. \\ \end{aligned} \right. d00dnew=dold+kxi+1=xi+1()yi+1=yi+1,d=d1yi(d0.5)()(d<0.5)()
      在这里插入图片描述

    Bresenham画线改进

    • e = d − 0.5 e=d-0.5 e=d0.5
      { e 0 = − 0.5 e n e w = e o l d + k x i + 1 = x i + 1 ( 右 移 一 格 ) y i + 1 = { y i + 1 , e = e − 1 ( e ≥ 0 ) ( 上 移 一 格 ) y i ( e < 0 ) ( 保 持 不 动 ) \left\{ \begin{aligned} &e_0=-0.5\\ &e_{new}=e_{old}+k\\ &x_{i+1}= x_i+1(右移一格)\\ &y_{i+1}= \left\{ \begin{aligned} &y_i+1,e=e-1&(e\geq0)(上移一格)\\ \\ &y_{i}&(e < 0)(保持不动) \end{aligned} \right. \\ \end{aligned} \right. e0=0.5enew=eold+kxi+1=xi+1()yi+1=yi+1,e=e1yi(e0)()(e<0)()
    • e ∗ 2 e*2 e2 e 0 e_0 e0变为整数,由于 p 0 ( x 0 , y 0 ) , p 1 ( x 1 , y 1 ) p_0(x_0,y_0),p_1(x_1,y_1) p0(x0,y0),p1(x1,y1)皆为整数,故 d ∗ Δ x d* \Delta x dΔx即为斜率乘 Δ x \Delta x Δx即为 Δ y \Delta y Δy为整数,故第二步改进令:
      e = e ∗ 2 ∗ Δ x e=e*2*\Delta x e=e2Δx
      判断 e e e的正负,更新后的公式为:
      { e = − Δ x ( 初 始 值 ) e n e w = e o l d + 2 Δ y ( 初 始 值 ) x i + 1 = x i + 1 ( 右 移 一 格 ) y i + 1 = { y i + 1 , e = e − 2 Δ x ( e ≥ 0 ) ( 上 移 一 格 ) y i ( e < 0 ) ( 保 持 不 动 ) \left\{ \begin{aligned} &e= -\Delta x(初始值)\\ &e_{new}= e_{old}+2\Delta y(初始值)\\ &x_{i+1}= x_{i}+1(右移一格)\\ &y_{i+1}= \left\{ \begin{aligned} &y_i+1,e=e-2\Delta x&(e\geq0)(上移一格)\\ \\ &y_{i}&(e < 0)(保持不动) \end{aligned} \right. \\ \end{aligned} \right. e=Δx()enew=eold+2Δy()xi+1=xi+1()yi+1=yi+1,e=e2Δxyi(e0)()(e<0)()

    小结

    避免浮点运算,进行整数算法判断像素点位置,就必须判断符号,如中点画线法和Bresenhanm算法,判断大小不能搞成整数加法。
    wuli放几张做好的图,大家康康c语言可以画图呀!
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    超链接

    如果你还想了解其他内容:
    小白谈计算机图形学(一)如何画线
    小白谈计算机图形学(二)如何画圆
    小白谈计算机图形学(三)二维图形裁剪
    小白谈计算机图形学(四)二维三维图形变换—1

    展开全文
  • 最近花了好多时间终于完成了5110液晶屏的画图函数库,是在之前nios ii的工程基础之做的,完善了画图的基本函数,有点,直线,折线,矩形,画圆和贴图的基本功能。函数库提供了使用缓冲区和不使用缓冲区的...
  • 实验一:虚拟铁路、自行车骑行路线符号(通用线符号的制作) ** ** 标题制作虚拟铁路符号 ** 第一步:创建符号图层 打开ArcMap 软件,单击菜单栏中的【自定义(C)】→【样式管理器(S)】,在符号管理器中添加...

    **

    实验一:虚拟铁路、自行车骑行路线符号(通用线符号的制作)

    **
    **

    标题制作虚拟铁路符号

    **
    第一步:创建符号图层
    打开ArcMap 软件,单击菜单栏中的【自定义(C)】→【样式管理器(S)】,在符号管理器中添加自定义样式文本(*.style),创建新的符号;
    弹出的符号管理器右侧窗口中,选中【线符号】右击,单击【新建】→【线符号】,
    在这里插入图片描述
    在弹出的符号属性编辑器窗口中,单击【添加图层】(Add Layer)图标,添加线符号图层,结果如图所示:
    在这里插入图片描述
    第二步:设置符号图层的属性
    在符号属性编辑器窗口的两个图层中,把【属性】一栏中的【类型】均设置为【制图线符号】,均选择【制图线】(Cartographic Line Symbol)。底部的图层较宽,宽度设置为6,颜色为黑色,线端头为【平端头】(Butt),顶部的图层较窄,宽度设置为3,颜色通常为白色,线端头为Butt,
    在这里插入图片描述
    第二个图层的【模板】页为一个方块开,一个方块关,【间隔】为8磅,
    在这里插入图片描述
    单击【确定】,保存符号,名称设置为虚拟铁路符号。制作完成的符号样式如下:
    在这里插入图片描述
    第三步:引用该符号图层
    在ArcMap软件中,新建一个要素类,【名称】为虚拟铁路符号,【要素类型】为线要素;
    单击新建的线要素符号,在弹出的符号选择器窗口中,选用刚刚的虚拟铁路符号,
    在这里插入图片描述
    结果如图所示:
    在这里插入图片描述

    制作自行车路线符号

    第一步:创建符号图层
    在符号管理器右侧窗口中,右击,再单击【新建】→【线符号】;
    在弹出的符号属性编辑器窗口中,单击【添加图层】(Add Layer)图标,添加线符号图层;
    在这里插入图片描述

    第二步:设置符号图层的属性
    在符号属性编辑器窗口中,把第四个符号图层的【属性】一栏中的【类型】均设置为【制图线符号】,【颜色】为绿色,
    在这里插入图片描述
    另一个符号图层的【属性】一栏中的【类型】设置为【标记现状符号】;
    标记线符号为三图层字符标记符号。底部的两个图层有“ESRI默认标记”字体中的Unicode190字形组成(圆角方形)。单击【标记线】→【符号】。
    在弹出的符号选择器窗口中,单击【编辑符号】。
    在这里插入图片描述
    弹出的符号属性编辑器窗口中,单击【添加图层】图标(共3个图层);
    第三个图层为黑色(圆角方形),大小为12磅。
    第二个图层为绿色(圆角方形),大小为11磅。
    第一个标记符号图层由Unicode189(符号化的骑车者)组成。单击【属性】复选框中的骑行者符号,颜色设置为白色且大小为10磅,单击【确定】,
    在这里插入图片描述
    连续单击【确定】,回到符号属性编辑器窗口,标记图层的【模板】为一个方块开,九个方块关,【间隔】为3磅,
    在这里插入图片描述
    单击【确定】,保存符号,名称设置为虚拟铁路符号。制作完成的符号样式如下:
    在这里插入图片描述

    展开全文
  • Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算。另外Bresenham算法还可用于显示圆和其他曲线。图3.8和图3.9给出了绘制线段的屏幕局部。垂直轴表示扫描线位置,...
  • 类似gis坐标定位功能,暂时只提供方法,整个程序太大了
  • winform鼠标画线

    千次阅读 2011-08-29 13:16:47
    鼠标画线要用到mousedown、mouseup和mousemove事件,这里先介绍三个事件然后再给出鼠标画线的代码。 1.MouseDown事件 当鼠标指针位于控件并按下鼠标键时发生。 语法: public event MouseEventHandler MouseD
  • Bresenham 画线算法

    千次阅读 2007-12-14 16:27:00
    Bresenham 画线算法Bresenham 画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用了整数的增量来实现的。Bresenham算法将对整形参数的符号检测,整形参数的值比于实际险段之间的偏量。 ...
  • 中点画线算法: 所需绘制直线的左下端点记为,右上端点记为 令 ,,则直线的斜截式为 : 所以,用隐函数表示直线的方程为 : 容易验证,点(x , y)若在直线,F(x , y)= 0 ;若在直线上方,F(x , y)>0...
  • Bresenham 画线算法推导过程

    千次阅读 2018-09-26 21:01:59
    符号并不会因此而改变,于是我们不妨假设 p i = Δ x ( d 1 − d 2 ) p_i = \Delta{x}(d_1 - d_2) p i ​ = Δ x ( d 1 ​ − d 2 ​ ) 。 p i = 2 Δ y ( x i + 1 ) − Δ x ⋅ 2 y i + Δ x ⋅ ( 2 b − 1 )...
  • 直线扫描转换算法-中点画线

    千次阅读 2017-12-05 19:40:35
    采用增量思想的DDA算法,直观、易实现,每一个像素坐标只需计算一个加法。 改进:(1)一般情况下k与y都是小数,而且每一步运算都要对y进行四舍五入后取整。将浮点运算变为整数加法可提高效率。...中点画线法:
  • 标记符号 颜色 例如: plot(x,y,'-.or') 使用点划线 (-.) 绘制 x-y 图,在数据点位置放置圆形标记 (o),并将线条和标记设置为红色 (r)。可在数据参数之后,以字符向量形式指定各要素(任意顺序)。请注意,线条...
  • matlab 画线 plot

    千次阅读 2012-12-12 16:16:30
    如果已经知道每条要画线的向量值,也可以直接通过调用plot(x1,y1,x2……)来实现。 如果是要通过多次调用plot()函数来实现,而且希望所有画的线在同一张图,那就需要用到hold on命令。 比如: for k=1:1:10 ...
  • Bresenham画线算法

    千次阅读 2010-03-29 21:10:00
    Bresenham画线算法Bresenham算法是计算机图形学领域使用最广泛的直线扫描转换算法。仍然假定直线斜率在0~1之间,该方法类似于中点法,由一个误差项符号决定下一个象素点。 算法原理如下:过各行各列象素中心构造一组...
  • MATLAB plot画线的颜色设定

    千次阅读 2020-07-19 21:01:39
    MATLAB plot画线的颜色设定 plot中画线的颜色通常是八种: 标记符 颜色 r 红 g 绿 b 蓝 c 蓝绿 m 紫红 y 黄 k 黑 w 白 但是线的颜色是由红绿蓝(RGB)三原色组成的,通过设定三原色的权重可以改变线的颜色,命令...
  • 通过从画板的开始到结尾画线来解决难题。 拼图中的不同符号对于如何绘制线条具有不同的规则。 弄清楚这些符号对解决每个难题的意义。 建于 HTML5画布,CSS,JavaScript 线算法 Obelus中的线条必须易于绘制,这意味着...
  • 中点画线

    千次阅读 2010-03-29 20:32:00
    中点画线法 收藏 算法目的:画一条直线算法思想:判断两个像素点的重点是在直线的下方,上方还是直线,从而确定该选择那一个像素点。线内:F(x,y) ==0;上方:F(x,y) > 0;下方:F(x,y) ------------------------------...
  • 中点画线算法-原理及实现

    千次阅读 2020-04-15 20:32:41
    在编写的FDGK/GUI决定采用中点画线算法绘制直线。故先研究了一下算法。 中点画线算法的原则是:如下图所示,但斜率K<1时,选定一个点之后,再计算中点M。如果M>0,这线更靠近E点,下一点选择为E点。反之选择NE...
  • 我的webgl学习之路(三)用webgl画线

    千次阅读 2018-05-08 23:49:05
    我的webgl学习之路(三)用webgl画线 我们都知道两个点决定一条线段;那么我们怎么画两个点呢?甚至是多个点呢?用gl.vertexAttrib3f(a_Position,1.0,0.0,0.0)循环?实在太麻烦了;那么不得不说的缓冲区对象; ...
  • 四、画线函数 1、函数名:line  功 能: 在指定两点间画一直线  用 法: void farline(int x0, int y0, int x1, int y1); 2、函数名:lineto  功能:画一作从现行光标到点(x, y)的直线 ...
  • 常见的线型字符有:'-'(直线), '--'(虚线), ':'(点线), '-.'(点画线) 等。常见的颜色字符有:'r'(red,红色), 'b'(blue,蓝色), 'g'(green,绿色), 'c'(cyan,青色), 'k'(black,黑色), 'w'(white,白色), 'm'(magenta,...
  • 任意斜率的中点画线算法

    千次阅读 2017-03-17 22:54:39
    一、中点画线算法的基本原理 在画直线的过程中,当前像素点P(xp,yp),则下一个点与直线最接近的像素只能是P1或者P2,即P点的正右方或者右角的点。设M(xp+1,yp+0.5)为P1与P2的中点,Q为与理想直线与x=xp+1线相交的...
  • 声明:此代码是在mapxtreme中文版学习资料实例代码修改后的,如有上述资料的实例代码,请不要下载此文件 mapxtreame vs2005 c#,可以画线、图层管理、多边形、矩形、写字、按矩形或圆选择对象,画特殊符号等。
  • LCD 画线算法及C语言实现

    万次阅读 2012-05-12 16:06:34
    LCD 画线方法及C语言实现(转贴)  http://www.dianyuan.com/article/43522 显示器与数学直线定义的区别:  数学的直线是没有宽度、由无数个点构成的集合,显然,光栅显示器只能近地似显示直线.当...
  • 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直... 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段。通常,这会导致一组未连接的线段,除非重复某些坐标位置。如果只描述了一个端点则

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,169
精华内容 23,667
关键字:

上画线符号