怎样判断一个点是否在另四个点组成的矩形里?矩形是可以倾斜的

Takuma 2002-07-04 01:17:47
怎样判断一个点是否在另四个点组成的矩形里?
矩形是可以倾斜的
谢谢!
...全文
2626 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
许野平 2002-07-08
  • 打赏
  • 举报
回复
dext(德克斯特) 的贴子已经讲得很明白了.
Takuma 2002-07-07
  • 打赏
  • 举报
回复
有什么API可以用吗?
许野平 2002-07-06
  • 打赏
  • 举报
回复 1
其实如果仅仅判定一个点是否落在矩形区域内没有必要大动干戈。方法如下:
设矩形为ABCD,点为P.P在矩形ABCD内的充分必要条件是:向量AP在AB上的投影大于0小于|AB|,向量AP在AD上的投影大于0小于|AD|.即:
   0 < AP*AB/|AB|
0 < AP*AD/|AD|
这里*表示向量的点积,具体一点就是
  0 < (Xp-Xa)(Xb-Xa)+(Yp-Ya)(Yb-Ya) < (Xb-Xa)^2+(Yb-Ya)^2
0 < (Xp-Xa)(Xd-Xa)+(Yp-Ya)(Yd-Ya) < (Xd-Xa)^2+(YD-Ya)^2

许野平 2002-07-06
  • 打赏
  • 举报
回复
在计算机图形学教材里提供了只用加减法和比较判断快速画线段,圆与椭圆的算法.至于用来判断任意多边形内的点的问题,用这类方法肯定不能解决矢量图的情况,至于点阵情况,恐怕难度系数会很高.
对于任意多边形我上面的帖子已经讲的很明白,对于矩形情况也没必要在浪费时间了.
libi 2002-07-06
  • 打赏
  • 举报
回复
好方法,充分利用矩形的特性,最后可以得到一个行列式的结果。
atlantis13579 2002-07-06
  • 打赏
  • 举报
回复
推荐用旋转变换化为水平的矩形判断
许野平 2002-07-06
  • 打赏
  • 举报
回复
atlantis13579(更深的蓝)(_L_) 的方法不适用于非凸四边形,反例在上面已经给出。
dext 2002-07-06
  • 打赏
  • 举报
回复
楼上的有理,服了!
atlantis13579 2002-07-06
  • 打赏
  • 举报
回复
工程师、物理学家和数学家同时接到一个任务:将一根钉子钉进一堵墙。 工程师造了一件万能打钉器,即能把任何一种可能的钉子打进任何一种可能的墙里的机器。 物理学家对于榔头、钉子和墙的强度做了一系列的测试,进而发展出一项革命性的科技—— 超低温下超音速打钉技术。 数学家将问题推广到N维空间,考虑一个1维带扭结的钉子穿透一个N-1维超墙的问题。很多基本定理被证明...当然啦,这个题目之深奥使得一个简单解的存在性都远非显然。
atlantis13579 2002-07-06
  • 打赏
  • 举报
回复
大哥啊,哪有这么麻烦,要懂得充分利用图形的特点选择最佳的解法

求方程 <---> 求向量

f(x0,y0)的正负 <---> 向量积的正负

f1(x0,y0)*f3(x0,y0)<0&&f2(x0,y0)*f4(x0,y0)<0 (利用矩形的特殊性)
<---> P在ab,bc,cd,da四线的同一侧的最简单的实现方式
许野平 2002-07-06
  • 打赏
  • 举报
回复
解决这个问题可以分成两种情况:
一、矢量图形
  采用把多变形区域剖分成若干三角形的方法,只要该点在任何一个三角形内部(含边界)即可判定该点也在该多变形区域内(含边界)。
二、点阵图形
  可以利用简单的算法判定一点是否落在一个单连通区域内(可能是多变形区域,也可能是曲线边界)。方法是在区域内任选一点Q,如果点P能通过一条连续曲线和Q连接起来,则可判定P在该区域内。下面给出伪代码:

FUNCTION IsInArea(x,y : INTEGER) BOOLEAN;
BEGIN
IF COLOR(x,y)=BOUNDCOLOR) THEN
IsInArea = FALSE
ELSE IF COLOR(x,y)=COLOR(Qx,Qy) THEN
IsInArea = TRUE
ELSE
BEGIN
COLOR(x,y)=BOUNDCOLOR;
IF IsInArea(x+1,y) OR IsInArea(x,y+1)
OR IsInArea (x-1,y) OR IsInArea(x,y-1)THEN
IsInArea = TRUE
ELSE
IsInArea = FALSE;
END
END

stormywaters 2002-07-06
  • 打赏
  • 举报
回复
两条平行的边分别是F1(X,Y)=0,F2(X,Y)=0和G1(X,Y)=0,G2(X,Y)=0,
(X0,Y0)为待判断的点,
若F1(X0,Y0)*F2(X0,Y0)<0而且G1(X0,Y0)*G2(X0,Y0)<0,则(X0,Y0)在矩形内,
该方法可以用来判断已知点是否在任意对边平行的多边形内。
cnken 2002-07-06
  • 打赏
  • 举报
回复
任意多边形的情况:
从点P开始画出一条射线;
规律:如果跟多边形的交点为奇数,那么P点就在多边形内;
那么主要问题就是求交点个数。
选P点出发方向向下的射线跟多边形为研究对象会比较简单。
首先还是判断P点是否在多边形一条边为对角线的矩形R内(循环)。
此时的P不一定只在一个R内(因为有复杂多边形跟凹多边形的情况);
如果在,那求出y=Px直线跟形成该R的边的交点Q;
比较Qy值跟Py值的大小就可以得出点P的射线跟该多边形的边有没交点;
判断交点总数的奇偶性,就可得出点P点在不在多边形内。
该做法求交点的时候用到了乘除,但可以用移位运算来代替,上面也是。
有一点需要注意:
多边形的每条边表示都应该是只包含一个端点(规定某方向的端点不属于直线),
这样,当射线跟边交在多边形顶点的时候,也就保证只有一个交点,
即只跟该顶点的一条边相交。
好了,我的文字表达水平不够,对这做法有兴趣的可以多提意见。
cnken 2002-07-06
  • 打赏
  • 举报
回复
任意凸多边形的情况:
判断该点P是否在多边形一条边为对角线的矩形R内(循环);
规律:点P最多只在一个R内;
如果点P在R内,那求出y=Px直线跟形成该R的边的交点Q;
比较Qy值跟Py值的大小就可以得出点P在不在多边形内。
该做法还是用到了乘除
cnken 2002-07-06
  • 打赏
  • 举报
回复
高手们,请试着只用加减和比较运算,而且把矩形扩展到任意多边形,包括凹多边形跟复杂多边形。
许野平 2002-07-05
  • 打赏
  • 举报
回复
其实只有 zzwu(未名) 的答案是正确的,其它答案不太专业。
dext 2002-07-05
  • 打赏
  • 举报
回复
TO: jack4liang(菜)
在边上也是正确的,你想想!其中两个的夹角就有180
另外:你也可以逆时针求夹角,夹角的大小要保证不超过180。
否则就出去了。

看来,楼主要给我满分了 嗬嗬! @_@
jack4liang 2002-07-05
  • 打赏
  • 举报
回复
我问一下,在矩形的边上算不算在矩形里面?那个360度方法就可能不完整了。
jack4liang 2002-07-05
  • 打赏
  • 举报
回复
我问一下,在矩形的边上算不算在矩形里面?那个360度方法就可能不完整了。
dext 2002-07-05
  • 打赏
  • 举报
回复
补充前面我说的,那天手头没有资料
首先创建一个区域,推广一点,一个多边形,用:
HRGN CreatePolygonRgn(
CONST POINT *lppt, // pointer to array of points
int cPoints, // number of points in array
int fnPolyFillMode // polygon-filling mode
);
然后判断,用:
BOOL PtInRegion(
HRGN hrgn, // handle of region
int X, // x-coordinate of point
int Y // y-coordinate of point
);
就可以了。另外还可以用:
BOOL RectInRegion(
HRGN hrgn, // handle of region
CONST RECT *lprc // address of structure with rectangle
);
来判断,一个矩形是否在这个区域内。
我认为这是最简单的方法。
但,要问我算法的话:
我认为zhoukun666() 有理!
加载更多回复(26)

33,028

社区成员

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

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