算法:判断直线是否扫过点

iwantnon 2010-02-04 09:31:30
平面上,设O为原点,有射线OA,射线OB,和点P,
已知点A,B,P的坐标。求一个算法,判断:在OA绕O点逆时针转到OB的过程中是否扫过点P。
要求:出于效率考虑,算法中不许出现三角函数,除法及开方。(即只出现逻辑运算,加法和乘法)。
...全文
344 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhaifeng1976 2010-02-20
  • 打赏
  • 举报
回复
真是牛人。各位说说你们都是研究什么的呢?算法几何。这些只是我都没听说过。
Joe-xXx 2010-02-09
  • 打赏
  • 举报
回复
修正一下:12楼的结论是顺时针的啊~所以啊结果判断应该是<=0
Joe-xXx 2010-02-09
  • 打赏
  • 举报
回复
以OA、OB为坐标的X,Y轴建立坐标系,则OA、OB为正方向,引用12楼的结论:“扫过点p的条件:在直线OA的右侧,直线OB的左侧.. ” 转换为矢量运算就是:F(矢量)=OA X OP 和 H(矢量)=OP X OB 同方向(若结果是0向量必然符合要求),同方向的判断则转为 F·H>=0。
例子:O(0,0,0),A(xa,ya,0), B(xb,yb,0),P(xp,yp,0)则
F=(0,0,xa*yp-ya*xp),H=(0,0,xp*yb-yp*xb);
有:F·H=(xa*yp-ya*xp)*(xp*yb-yp*xb)
duguyue200 2010-02-08
  • 打赏
  • 举报
回复
比较容易,用线性规划的思想就行,带入已知方程后观察p点是否在符合数据的那一侧即可。
yymt168 2010-02-06
  • 打赏
  • 举报
回复
多言一句:LZ过原点射线的情况的话,C=x2*y1-x1*y2=0;
yymt168 2010-02-06
  • 打赏
  • 举报
回复
转载连接http://gisdb4o.blog.sohu.com/73979302.html

dotline.h(注意这里直线是有方向性的)
怎么判断坐标为(xp,yp)的点P是在直线的哪一侧呢?设直线是由其上两点(x1,y1)(x2,y2)确定的,直线方向是由(x1,y1)到(x2,y2)的方向。这时若直线方程记为Ax+By+C=0
则有:
A=y2-y1; B=x1-x2; C=x2*y1-x1*y2;
这时可以计算D:
D=A*xp+B*yp+C
若D<0,则点(xp,yp)在直线的左侧;若D>0,则点在直线的右侧;D=0点在直线上。



扫过点p的条件:在直线OA的右侧,直线OB的左侧..
keeya0416 2010-02-05
  • 打赏
  • 举报
回复
除法和 乘法有区别么,
一个逆运算而已。
判断下象限和斜率而已,具体我不说了,说说斜率不用除法判断吧
假设在第一象限:
a.y/a.x < p.y/p.x && b.y/b.x > p.y/p.x <=======> a.y*p.x < p.y*a.x && b.y*p.x >p.y*b.x
不知道这个算不算是没用除法。。。。。。。。。。。
其他的情况类推,不是什么难事吧
qiuzhenguang 2010-02-05
  • 打赏
  • 举报
回复
Google 或者 百度一下“计算几何 向量 叉积 顺时针”等字眼,很容易明白的。
qiuzhenguang 2010-02-05
  • 打赏
  • 举报
回复
这个很简单,你看一下向量的叉乘就行了。只有乘法,能判断两个向量之间的相对顺序,如OA相对OB是顺时针旋转还是逆时针旋转。
fire_woods 2010-02-05
  • 打赏
  • 举报
回复
1. |p| <= |A| = |B|
这个不需要除法,也不需要开方来验证.

2. 得到P, A, B所在的象限, 如果都不落在一个象限, 则直接判断.
如果有落在坐标轴上的,可以直接判断.
如果P和A落在同一个象限, 则比较tg(P)和tg(A), 根据在该象限tg的单调性已经B的象限得到结论.
同理可以处理P和B, P和A,B落在同一象限的问题.

3. 不用三角函数,除法开方比较同一象限两个点tg的大小, 比如P(x0, y0)和A(x1, y1)
tg(p)=y0/x0, tg(A)=y1/x1
可以在不等式两边同乘以x0*x1,因为在同一象限,所以大于0
即比较y0*x1与y1*x0的大小即可.
lryxxh 2010-02-05
  • 打赏
  • 举报
回复
把AB连成一条线,以这条线为对角线,做一个矩形(边分别和x轴和y轴垂直),看看P点是否在这个矩形中就可以了
Q_Jizi 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qiuzhenguang 的回复:]
这个很简单,你看一下向量的叉乘就行了。只有乘法,能判断两个向量之间的相对顺序,如OA相对OB是顺时针旋转还是逆时针旋转。
[/Quote]

叉乘就可以吧,通过叉乘的符号判断两矢量相互之间的顺逆时针关系,这个问题当OP在OA的逆时针方向,OP在OB的顺时针方向时是成立的。
keeya0416 2010-02-05
  • 打赏
  • 举报
回复
楼上的 楼主说不能用除法之类的,你那取余是不满足题目条件的
  • 打赏
  • 举报
回复
判断OAPB是否是逆时针,如果是的话,就说明OK
下面是判断逆时针的方法
public static int ClockWise(List<PointF> p)
{
int i, j, k;
int count = 0;
double z;

int n = p.Count;

if (n < 3)
return (0);

for (i = 0; i < n; i++)
{
j = (i + 1) % n;
k = (i + 2) % n;
z = (p[j].X - p[i].X) * (p[k].Y - p[j].Y);
z -= (p[j].Y - p[i].Y) * (p[k].X - p[j].X);

if (z < 0)
count--;
else if (z > 0)
count++;
}
if (count > 0)
return (1);
else if (count < 0)
return (-1);
else
return (0);

}
acdbxzyw 2010-02-04
  • 打赏
  • 举报
回复
思路:
分A,B点各在哪个象限,可讨论P点分别在直线OA,OB的上方还是下方,从而得出P点会否被扫描到。
liuxiaobing2008 2010-02-04
  • 打赏
  • 举报
回复
不用除法,这个就有点难度了
十八道胡同 2010-02-04
  • 打赏
  • 举报
回复
应该可以转换成点是否在面内

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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