原题目: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在线段范围内;否则,在线段范围外。
于是: