点到线段的距离


最近由于工作任务的需要简单研究了一下

1.可以列方程组,但太麻烦,繁琐,不适合程序中运行

2.先通过边长的关系求出 点到线段的垂点不在线段上的情况下的距离 (线段两头到点的距离),然后在根据海伦公式求得垂线的距离。

这种方法靠谱但还不够精简

3.用向量的方法,简单实用,效率高。以下是我用AS实现的代码,


点到线段的距离 As代码实现
var A:Point = new Point(0, 0); // 线段起始点
var B:Point = new Point(0, 0); // 线段终点

var C:Point = new Point(0, 0); // 任意点

// 已知两点 求向量 不多说
var AB:Point = new Point(B.x - A.x, B.y - A.y);
var AC:Point = new Point(C.x - A.x, C.y - A.y);
var CB:Point = new Point(B.x - C.x, B.y - C.y);

var distance:Number = 0;

var f1:Number = AB.x*AC.x + AB.y*AC.y; // 向量AB 与向量AC的点乘
if (f1 < 0) // 表示 AB AC的夹角为钝角,所以AC就是点C到线段AB的距离
{
    distance = AC.length;
}
else
{
    var f2:Number = AB.x*CB.x + AB.y*CB.y; // 同理求出AB 和CB的数量积
    if (f2 < 0) //表示 AB CB的夹角为钝角,所以CB就是点C到线段AB的距离
    {
        distance = CB.length;
   }
   else // 否则 点C到AB的垂线的长度就是 要找的距离 设垂点为D
   {
        // (f1/AB.length) 等于 向量AD的模 ,AD的模乘上AB方向上的单位向量 就是向量AD了
       // var AD:Point = new Point((f1/AB.length)*(AB.x/AB.length), (f1/AB.length)*(AB.y/AB.length));
       // 向量AD 减去 向量AC就是向量 CD了,向量CD的模就是点C到线段AB的距离
        //var CD:Point = new Point(AD.x - AC.x, AD.y - AC.y);
        //distance = CD.length;

        // 利用向量的叉乘后的大小为这两个向量围成的平行四边形面积来求更简单
                  distance = Math.abs(((AC.x * AB.y) - (AB.x * AC.y))) / AB.length;
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值