点到线段的距离 题解(C++)

深渊向深渊呼唤

原题目:wzoi P573

初步分析

这道题之前有《点到直线的距离》一题。

如图,我们不妨来下个定义(名字是乱起的,如果有雷同就以以下定义为准):

对于任意线段l,在其两个端点上分别作垂直于l的直线,若点在两直线之间,则称点在“线段范围内”,否则在“线段范围外”。

这两条直线(蓝色的两条)称为“线段范围界线”。

上图中,点A在线段范围内,点B和点C都在线段范围外。

不难发现,当点在线段范围内,则点到线段的距离即点到线段所在直线的距离,套公式即可。

当点在线段范围外,则点到线段的距离即点到较近的一端点的距离。

于是第一代代码应运而生:

第一代代码思路

输入ABC三点坐标,计算出线段AB所在直线的表达式,利用二直线垂直,斜率相乘得-1,计算出两条界线的表达式。

判断C点是否处于两直线之间,给出相应的答案。

判断C点

作过C的铅垂线交两界线,纵坐标分别为y1,y2,y3,如图所示。

如果y1>y2>y3,则C在线段范围内,否则在线段范围外。

但是当时作图时只考虑到了如此的线段,未考虑水平、铅锤的情况,所以很可惜没做出来(其实是懒得讨论)

大家可以试着讨论一下,有时间我会把代码补上。

第二代代码思路

可不可以少讨论一些呢?

我苦思冥想,终于,第二代思路出来了!

如图,实线部分为线段AB,虚线部分为线段外。

所以,C1在线段范围内,C2在线段范围外。

对于任何到直线AB距离相等为d的点C1与C2,连结与之较远的线段端点(比如不连C1B与C2B)。

利用勾股定理:

于是得出:

小于等于AB,则C在线段范围内;否则,在线段范围外。

于是:

第二代代码

栏目