Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何判断4个点坐标是左上角\左下角\右上角\右下角 #13

Closed
titanseason opened this issue Nov 21, 2017 · 3 comments
Closed

Comments

@titanseason
Copy link

titanseason commented Nov 21, 2017

我看到了你的一个帖子: https://www.v2ex.com/t/381107
已知四个点的坐标A(x1, y1) B(x2, y2) C(x3, y3) D(x4, y4) ,如何确定这四个点分别为 左上,右上,右下,左下。
我想到了凸四边形的解决方案:

  1. 连接对角线(假设ABCD是依次的4个点,直接连接AC、BD就能得到交点了),就能获取到对角线交点坐标,假设是P(x0, y0)
  2. 分别判断四个点与P点的关系,如果xi<=x0&yi<y0 就是左上角; xi<x0&yi>y0就是左下角;xi>=x0&yi>y0就是右下角; xi>x0&yi<y0就是右上角;

备注:如果ABCD不确定是依次的4个点,那么交点要么是连接AC、BD,要么就是连接AB、CD。两条直线如果平行(例如AC、BD平行),那么就是另外一种情况必然是相交的两条线(就直接取AB、CD的交点);如果均不平行,就判断相交的点是否在四边形内,在四边形内的就是交点

@pqpo
Copy link
Owner

pqpo commented Nov 21, 2017

很不错的方案,但是给的四个点并不知道哪两个是对角线顶点,可能是AB,AC 或者 AD,需要遍历一下。由于哪个是左上并没有明确的定义,所以可以简单的以离原点最近的点作为 左上,之后再连线判断另外两个点是否在线的两侧来判断对角线,具体实现可以看:

vector<Point> Scanner::sortPointClockwise(vector<Point> points) {

@titanseason
Copy link
Author

OK, 明白了,谢谢

@honeyhhhh
Copy link

'''
    判断四个点 左上左下,右上右下
    左上的点为 最靠近左边的两个点中最靠近上面的点
    如果能判断哪个点是左上,那么可以连接对角线,通过交点与四个点的大小关系判断位置,距离原点最近的不一定是左上
'''
if len(points) != 4:
    print('wrong point num')
    exit(0)
point_sort_left = sorted(points , key=lambda k: [k[0], k[1]])  
lt, ld = sorted([point_sort_left[0], point_sort_left[1]], key=lambda k:[k[1], k[0]])
rt, rd = sorted([point_sort_left[2], point_sort_left[3]], key=lambda k:[k[1], k[0]])
display(lt, rt, rd, ld)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants