购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.2 创建类:Point

根据欧几里得《几何原本》一书第一卷,点是“无法分割的”。换句话说,点是一个没有宽度、长度或深度的实体。它是空间中的一个位置,肉眼无法看到。点是欧几里得几何学的基础,其著作全部基于这个简单的概念。因此,我们的几何大厦也将基于这个强大的基元。

点可以表示为两个数字 ——x y ——也就是其坐标,有时也称为投影(projection)。图4-1描绘了点 P 及其在欧氏平面上的坐标。

让我们创建一个代表二维点的类。与之前一样,右击geom2d包文件夹,选择New(新建)→Python File(Python文件),以创建一个新文件。将其命名为Point,然后单击OK(确定)按钮。在该文件中,输入清单4-3的代码。

图4-1 平面上的一点 P

清单4-3 Point类的代码

点的坐标会被传递给初始化方法(__init__),以类的属性存储。

完成初始化方法以后,让我们实现一些功能。

4.2.1 计算两点间的距离

使用公式(4.1)计算 P Q 两点之间的距离 d P Q ):

其中, P x P y 是点 P 的坐标, Q x Q y 是点 Q 的坐标。图4-2给出计算的示意图。

图4-2 点 P 和点 Q 的距离

我们可以用两种算法来实现距离计算。我们可以在点 P 上调用该方法,计算其到另一点 Q 的距离,即p.distance_to(q)。我们将两个点都作为参数传递给负责计算的函数:distance_between(p,q)。前者是面向对象的风格,后者是函数式编程的风格。因为本书做的是面向对象编程,所以我们会选择前者。

清单4-4是在类中实现公式(4.1)的代码。

清单4-4 计算两点之间的距离

首先,我们需要导入math模块,它会将很多有用的数学运算加载到我们的类中。我们定义接收self和other两个实参的方法distance_to:self表示当前点,而other表示需要计算距离的另一个点。然后,我们计算两个坐标之间的距离(或delta),并使用power(**)运算符计算两个delta的平方,最后返回平方和的平方根。

让我们来测试一下。从IDE中打开Python控制台,并尝试以下操作:

太令人兴奋了!我们已经迈出了建立几何大厦的第一步——欧几里得也会为我们感到自豪的。你可以用计算器同样操作一遍,确认我们的算法结果是否正确。在本章的后面,我们将进行一个自动化测试,以检验该方法是否产生正确的结果。

控制台既然已经打开,且已加载p和q,请尝试以下操作:

输入p会生成一个字符串,意思是,p是Point类的对象,内存地址是0x10f8a2588。请注意,你得到的内存地址可能与我的不同。如果不了解计算机的内存(和十六进制的含义),这段描述就没有多大帮助了。你还可以检查任何类的__dict__属性,以获得一个字典,包含它拥有的所有属性。这个关于实例的信息有趣多了。在本章的后面,我们将构建一个特殊的方法,它可以输出更有效的对象信息,如坐标(2,5)。

现在,让我们把重点放在Point类重载+和-操作符上。

4.2.2 加减操作

下一个需要构建的基本操作是加减法,向量类上也需要构建。我们将经常使用这些基本方法,包括直接使用和用于构建更复杂的方法。我们可以将它们写成普通的方法,用p.plus(q)和p.minus(q)等代码进行调用,但我们可以做得更好。Python允许我们通过重载+和-操作符(我们在2.2.2节学过),之后输入p+q和p-q,Python就可以执行相应的操作。重载操作符可以让代码更容易阅读和理解。

表4-1 Python中的重载操作符

在Python中重载操作符需要构建一个方法,其名称必须与操作符对应。这样,当Python遇到操作符时,会将其替换为对应的方法并调用。+操作符的名称为__add__,-操作符的名称为__sub__。表4-1包含了能够在类中重载的常用操作符。

让我们将加法和减法操作构建成方法。在Point类中,distance_to方法之后,添加清单4-5中的代码。

清单4-5 对点进行加减操作

方法__add__创建并返回一个新点,其投影是两个参数投影的和。从代数上来讲,这个操作没有太大意义,但以后我们会发现它的用处。

方法__sub__类似,结果的投影是输入点的投影之差。两点的减法 P-Q 可以得到从 Q P 的向量,但是我们还没有为向量创建类。下一节我们会重构这段代码,使它返回一个向量的实例。

让我们实现下一个关键的基元:向量。 wdixaD2uxWzL0x/HmpIu2PkSp1KOd27VwCfrDSumfo3GisFoVMvq3F0WkLHppxbh

点击中间区域
呼出菜单
上一章
目录
下一章
×