C#中已知一任意点坐标是否在已知直线上的算法???

ghost_029 2010-10-25 03:08:59
C#中已知一任意点坐标和直线的两点坐标(起始点和终点),求此点是否在直线上的算法???
...全文
499 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
最后一只恐龙 2010-10-25
  • 打赏
  • 举报
回复
没有那么复杂,如果两端点分别是A和B,判断点P是否在改直线上,使用如下公式:
|AP|+|BP|-|AB|<=delt
其中delt是一个很小的数。
即如果P到两端点距离之和与直线长度相比,只大一点点的话就算在直线上(理论上应该相等)。
bloodish 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ghost_029 的回复:]
to bloodish:C# 中找不到Vector定义啊
[/Quote]

.Net Framework3.0 及以后的版本才有Vector的实现.
SaintLance 2010-10-25
  • 打赏
  • 举报
回复
P1(x1,y1),P2(x2,y2)构成直线(x1!=x2 || y1!=y2)==true,点P(x,y)在直线P1P2上么?
欧式几何法(斜率法)

if(x1==x || x2==x)
{
if(x1==x2 || x==x1 && y==y1 || x==x2 || y==y2) ;//在
else ;//不在
}
else if((x1-x)*(y1-y)==(x2-x)*(y2-y))
{
;//在
}
else
{
;//不在
}

向量法

double vx1=x-x1;
double vy1=y-y1;//向量v1
double vx2=x-x2;
double vy2=y-y2;//向量v2
double m1=vx1*vx1+vy1*vy1;//|v1|^2
double m2=vx2*vx2+vy2*vy2;//|v2|^2
if(m1==0 || m2==0) ;//在
else if((vx1*vx2+vy1*vy2)*(vx1*vx2+vy1*vy2)==m1*m2);//在
else ;//不在

注意你的数据类型和精度要求。
polarissky 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 flyerwing 的回复:]

是不是看满足直线方程式?
[/Quote]
我同意这个建议
ghost_029 2010-10-25
  • 打赏
  • 举报
回复
我刚都试了一遍
对于和X轴平行的直线还行,但有斜率的就不管用了,谁能帮忙提供一个经过验证的???
ghost_029 2010-10-25
  • 打赏
  • 举报
回复
to bloodish:C# 中找不到Vector定义啊
flyerwing 2010-10-25
  • 打赏
  • 举报
回复
是不是看满足直线方程式?还是怎么回事情.
叫我三三 2010-10-25
  • 打赏
  • 举报
回复
用向量的不错,还在上学的时候,就喜欢用向量处理点与线,点与面之间的关系,而且简单方法LS几位都给了
debug1984 2010-10-25
  • 打赏
  • 举报
回复

//判断坐标点P到线段两端点(AB)的距离。
//只要满足公式 AB=PA+PB 点P就在线段点上
bool isPointInLine(Point pt,Point lnstart,Point lnEnd)
{
double lenpt2start=Math.sqrt(Math.Power(pt.x-lnstart.x,2)+Math.Power(pt.y-lnstart.y,2));
double lenpt2end=Math.sqrt(Math.Power(pt.x-lnend.x,2)+Math.Power(pt.y-lnend.y,2));
double len=Math.sqrt(Math.Power(lnstart.x-lnend.x,2)+Math.Power(lnstart.y-lnend.y,2));

//Math开方计算出来的结果可能会有点点误差
return (lenpt2start+lenpt2end-len)<0.000001;
}
gomoku 2010-10-25
  • 打赏
  • 举报
回复
线段起点和终点为:
P1 (x1,y1)
P2 (x2,y2)

P(x,y)点,如果在直线上,那么它必须满足( 0 <= t <= 1 )。
P = P1 + t(P2 - P1)

t = (x - x1)/(x2 - x1)
t = (y - y1)/(y2 - y1)
bloodish 2010-10-25
  • 打赏
  • 举报
回复
参考

关于判断点和线段的关系的问题

也可以用向量Vector判断

判断点(5,5),是否在直线(1,1)->(10,10)上

Vector v1 = new Vector(1, 1);
Vector v10 = new Vector(10, 10);
Vector v5 = new Vector(5, 5);

Vector v110 = v1 - v10;
Vector v15 = v1 - v5;

if (Math.Abs((double)Vector.AngleBetween(v110, v15)) < 1e-6)
{
//to do
}
wangyue4 2010-10-25
  • 打赏
  • 举报
回复
/******************************************************************************
用 途 :求不共线的三点确定一个圆
输 入 :三个点p1,p2,p3
返回值 :如果三点共线,返回false;反之,返回true。圆心由q返回,半径由r返回
*******************************************************************************/
bool cocircle(POINT p1,POINT p2,POINT p3,POINT &q,double &r)
{
double x12=p2.x-p1.x;
double y12=p2.y-p1.y;
double x13=p3.x-p1.x;
double y13=p3.y-p1.y;
double z2=x12*(p1.x+p2.x)+y12*(p1.y+p2.y);
double z3=x13*(p1.x+p3.x)+y13*(p1.y+p3.y);
double d=2.0*(x12*(p3.y-p2.y)-y12*(p3.x-p2.x));
if(abs(d)<EP) //共线,圆不存在
return false;
q.x=(y13*z2-y12*z3)/d;
q.y=(x12*z3-x13*z2)/d;
r=dist(p1,q);
return true;
}
这个问题我觉得可以用判断直线两点和另外一点是否能画出圆来解决,代码马马虎虎这么写

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧