Matplotlib 画直线

有时候需要演示一下直线是怎么样生成的,就可以使用matplotlib作为教学工具,把演示过程动态化,并且可视化,也可以让学生快速地学习和修改直线的算法。知道两点坐标画直线有很多种方法,这里主要介绍使用DDA算法:

DDA算法是计算机图形学中最简单的绘制直线算法。其主要思想是由直线公式y = kx + b推导出来的。

我们已知直线段两个端点P0(x0,y0)和P1(x1,y1),就能求出 k 和 b 。

在k,b均求出的条件下,只要知道一个x值,我们就能计算出一个y值。如果x的步进为1(x每次加1,即x = x +1),那么y的步进就为k+b;同样知道一个y值也能计算出x值,此时y的步进为1,x的步进为(1-b)/k。根据计算出的x值和y值,向下取整,得到坐标(x’,y’),并在(x’,y’)处绘制直线段上的一点。

为进一步简化计算,通常可令b取0,将起点看作(0,0)。设当前点为(xi, yi)则用DDA算法求解(xi+1,yi+1)的计算公式可以概括为:

xi+1 = xi + xStep(1)
yi+1 = yi + yStep(2)

我们一般通过计算 Δx 和 Δy 来确定xStep和yStep:

  • 如果 Δx > Δy ,说明x轴的最大差值大于y轴的最大差值,x轴方向为步进的主方向,xStep = 1,yStep = k;

  • 如果 Δy> Δx,说明y轴的最大差值大于x轴的最大差值,y轴方向为步进的主方向,yStep = 1,xStep = 1 / k。

根据这个公式,就能通过(xi,yi)迭代计算出(xi+1、yi+1),然后在坐标系中绘制计算出的(x,y)坐标点。

根据上面的算法进行一下修改,可以把代码写成这样:

import numpy as np
import matplotlib.pyplot as plt

plt.axis([-20, 130, 80, -20])
plt.axis('on')
plt.grid(True)

#显示辅助坐标系
plt.arrow(0,0, 20,0, head_length = 4, head_width = 3, color = 'k')
plt.arrow(0,0, 0,20, head_length = 4, head_width = 3, color = 'k')
plt.text(15, -3, 'x')
plt.text(-5, 15, 'y')

#画一条蓝色线
x1 = 20
x2 = 120
y1 = 40
y2 = 20

q = np.sqrt((x2-x1)**2 + (y2-y1)**2)
ux = (x2-x1)/q
uy = (y2-y1)/q

for step in np.arange(0, q, 0.5):
    px = x1 + step*ux
    py = y1 + step*uy
    plt.scatter(px, py, s = 1, color = 'g')
plt.show()

上面主要计算两点的距离,然后沿着两点距离的方向不断地增加,那么就可以计算出中间的坐标值,就可以依次地显示点,再把这些点显示出来,就成为了一条直线。

Matplotlib 画直线

在这里绘制的直线,并不是把两点连接到一起,而是采用不同的点组成了一条直线,也演示了画一条直线的原理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程