欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

objective-c实现点到直线的距离及与垂足的交点

程序员文章站 2024-02-13 23:30:22
问题描述 点到直线或者线段的距离 实现思路 假设有一点坐标p(x0,y0),有一线段ab,a坐标(x1,y1),b坐标(x2,y2),求p点到ab线段或所在直线的距离...

问题描述

点到直线或者线段的距离

实现思路

假设有一点坐标p(x0,y0),有一线段ab,a坐标(x1,y1),b坐标(x2,y2),求p点到ab线段或所在直线的距离d以及p点在直线上的垂足c(x,y)。

这需要复习一下高中的数学知识。

首先需要将a,b两点坐标转换为直线方程的一般式ax+by+c = 0,过程就不推演了。

参数计算:

a=y2-y1;

b=x1-x2;

c=x2*y1-x1*y2;

1、点到直线的距离公式:

d= ( ax0 + by0 + c ) / sqrt ( a*a + b*b );

2、垂足c(x,y)计算公式:

x = (  b*b*x0  -  a*b*y0  -  a*c  ) / ( a*a + b*b );

y  =  ( -a*b*x0 + a*a*y0 – b*c  ) / ( a*a + b*b );

程序的实现:

//垂足交点
-(cgpoint)pedalpoint: (cgpoint)p1 : (cgpoint )p2: (cgpoint)x0{

float a=p2.y-p1.y;
float b=p1.x-p2.x;
float c=p2.x*p1.y-p1.x*p2.y;

float x=(b*b*x0.x-a*b*x0.y-a*c)/(a*a+b*b);
float y=(-a*b*x0.x+a*a*x0.y-b*c)/(a*a+b*b);

//点到直线距离
float d=(a*x0.x+b*x0.y+c)/sqrt(a*a+b*b);

cgpoint ptcross=ccp(x,y);
nslog(@”d======%f”,d);
nslog(@”a=======%f,b=======%f,c=======%f”,a,b,c);
nslog(@”垂足======x=%f,y=%f”,x,y);
return ptcross;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。