绘制几何形状

三大类形状绘制函数

在Easy Graphics中,绘制形状的函数可以分为三大类:

  • 只绘制形状轮廓线的函数。这类函数用’xxx()’ 的形式命名(“xxx”是所绘制形状的名称,如circle)。下面的程序绘制了一个边线为蓝色的圆。
from easygraphics import *
init_graph(200, 150)
set_color(Color.BLUE)
set_fill_color(Color.RED)
circle(100, 75, 60)
pause()
close_graph()
  • 同时绘制形状轮廓并填充形状内部的函数。这类函数用’draw_xxx()’ 的形式命名(“xxx”是所绘制形状的名称,如draw_circle)下面的程序绘制了一个边线为蓝色内部为红色的圆。
from easygraphics import *
init_graph(200, 150)
set_color(Color.BLUE)
set_fill_color(Color.RED)
draw_circle(100, 75, 60)
pause()
close_graph()
  • 不绘制形状轮廓线,只填充形状内部的函数。这类函数用’fill_xxx()’ 形式命名(“xxx”是所绘制形状的名称,如fill_circle)下面的程序绘制(填充)了一个无边线内部为红色的圆。
from easygraphics import *
init_graph(200, 150)
set_color(Color.BLUE)
set_fill_color(Color.RED)
fill_circle(100, 75, 60)
pause()
close_graph()
circle draw_circle fill_circle
circle() draw_circle() fill_circle()

在Easygraphics中,所有的角都使用“角度”作为单位。

在画弧(arc),饼(pie)和弓形(chord)时,正的角度值为逆时针旋转;负的角度值为顺时针旋转。0度位于三点钟方向(X轴正向)。

下面的程序画了一个从45度到135度的饼(pie)。

init_graph(400, 300)

set_color("red")
set_fill_color("lightyellow")
draw_pie(200, 150, 45, 135, 100, 70)
pause()
close_graph()
../_images/04_pie.png

多边形(Polygon)

使用polygon()/draw_polygon()/fill_polygon()函数,我们可以绘制或者填充多边形(polygon)。

在绘制多边形时,我们必须指明多边形的各个顶点(vertices)

polygon()/draw_polygon()/fill_polygon()需要提供一个list(列表)参数,其中存放着各顶点的位置。在列表中,每个顶点用两个数来表示(其x和y坐标)。所以,如果有n个顶点,那么列表中应该有2n个数。

下面的程序绘制了一个三角形,它的三个顶点分别位于 (50, 50), (350,250)和(50, 150):

from easygraphics import *

init_graph(400, 300)
set_color(Color.DARK_BLUE)
set_fill_color(Color.LIGHT_MAGENTA)
draw_polygon(50, 50, 350, 250, 50, 150)
pause()
close_graph()
../_images/04_polygon.png

折线(Polylines)

使用poly_line()或draw_poly_line(),我们可以绘制折线。

../_images/polyline.gif

折线(Polyline) 是一条由一个或多个依次相连的线段组成的线。因此,要绘制一条折线,我们必须指明连接各线段的端点

poly_line() and draw_poly_line()需要提供一个list(列表)参数,其中存放着各端点的位置。在列表中,每个端点用两个数来表示(其x和y坐标)。所以n个端点就需要2n个数来表示。

下面程序绘制了一条依次连接了点(50,50)、(350,75)、(50,150)、(350,175)、(50,250)和(350,275)的折线。

from easygraphics import *

init_graph(400, 300)
draw_poly_line(50, 50, 350, 75, 50, 150, 350, 175, 50, 250, 350, 275)
pause()
close_graph()
../_images/04_polyline.png

贝塞尔曲线(Bézier curve)

贝塞尔曲线 是一种 以 伯恩斯坦多项式 为基础的参数曲线。

每条贝塞尔曲线由一组控制点P0到Pn定义,其中n是曲线的阶数(n=1称为线性曲线,2为二次曲线,3为三次曲线,以此类推)。第一个和最后一个控制点是曲线的端点,中间的控制点一般则不在曲线上。

三次贝塞尔曲线(Cubic Bézier curves)是最常见的贝塞尔曲线。

../_images/bezier_curve.png

平面或者空间中的4个点P0、P1、P2和P3定义了一条贝塞尔曲线。这条曲线从P0出发,走向P1,并从P2的方向到达P3。通常该曲线不会通过P1和P2,这两个点只是为曲线提供方向信息。P1和P2之间的距离决定了曲线在转向P2前,向P1方向前进”多远”和”多快”。

曲线的参数形式为:

../_images/bezier_curve_formula.svg

我们可以使用bezier()或draw_bezier()来绘制贝塞尔曲线。它们需要一个列表作为参数来指明各控制点的位置。在列表中,每个控制点对应两个数值(x和y坐标)。因为一条贝塞尔曲线需要4个控制点,因此列表中应该有8个数。

下面的程序绘制了一条三次贝塞尔曲线,其四个控制点分别为(300,50)、(200,50)、(200,200)和(100,200)。

from easygraphics import *

init_graph(600, 400)
points = [300, 50, 200, 50, 200, 200, 100, 200]
draw_bezier(*points)
pause()
close_graph()

泛洪填充(Flood Fill)

Non-regular shapes can be filled by flood fill. The shape to be filled must be enclosed by an outline. The follow program uses flood fill to fill a pedal.

from easygraphics import *

init_graph(400,200)
set_color(Color.BLACK)
arc(200,-40,180,360,220,220)
arc(200,240,0,180,220,220)

set_fill_color(Color.DARK_RED)
flood_fill(200,100,Color.BLACK)
pause()
close_graph()

下面是绘制的结果:

../_images/04_pedal.png

高级绘图

EasyGraphics支持绘制所有的基本图形:点、线、圆、椭圆(弧、扇形、弓形)、矩形、多边形、圆角矩形等。如果需要更高级的绘制功能,可以通过 Image 对象的成员方法get_painter()来获取内部的 QPainter 对象,然后直接用它来进行绘制。