根据四个点坐标排列出左上右上右下左下位置关系
生活随笔
收集整理的這篇文章主要介紹了
根据四个点坐标排列出左上右上右下左下位置关系
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
根據(jù)四個(gè)點(diǎn)坐標(biāo)排列出左上右上右下左下位置關(guān)系
基本思路是:
先計(jì)算出這四個(gè)點(diǎn)的中心位置,然后根據(jù)中心位置來(lái)做判斷。
那么中心位置就是把他們四個(gè)點(diǎn)的坐標(biāo)全部加起來(lái)再除以4。
然后根據(jù)點(diǎn)的y坐標(biāo)值,與中心點(diǎn)y的值比較。大于中心點(diǎn)坐標(biāo)y的為底下。
小于中心點(diǎn)坐標(biāo)y的為頂上。(x是向右的,y坐標(biāo)是向下的)
區(qū)分好了上下之后,再在上下的點(diǎn)集分別分出左右來(lái)。
x坐標(biāo)小于中心點(diǎn)就是左,x坐標(biāo)大于中心點(diǎn)就是右
整個(gè)算法代碼如下:
#include <io.h> #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> #include <cstring> using namespace cv; using namespace std;void sortFourPoints(vector<Point2f>& FourPoints) { vector<Point2f> top,bottom; Point2f center={0,0}//to confirm it is the 4 pointer. else return if(FourPoints.size()!=4)return;//first to locate the center point.for (int i = 0;i < 4;i++) { center += FourPoints[i]; } center =center/4.; //to sort the two top points and two bottom pointsfor (int i =0;i< 4;i++) { if (FourPoints[i].y<center.y) { top.push_back(FourPoints[i]); } else { bottom.push_back(FourPoints[i]); } } //to sort the two left points and two right pointsPoint2f topleft = top[0].x > center.x ? top[1] : top[0]; Point2f topright = top[0].x > center.x ? top[0] : top[1]; Point2f bottomleft = bottom [0].x > center.x ? bottom [1] : bottom [0]; Point2f bottomright = bottom [0].x > center.x ? bottom [0] : bottom [1]; //clear the FourPoints vector.FourPoints.clear(); //update the FourPoints vector to correct order FourPoints.push_back(topleft); FourPoints.push_back(topright); FourPoints.push_back(bottomright); FourPoints.push_back(bottomleft); }另外需要注意:
這樣排列的坐標(biāo)關(guān)系,有時(shí)候需要再轉(zhuǎn)個(gè)90度才能滿足我們的需求。
總結(jié)
以上是生活随笔為你收集整理的根据四个点坐标排列出左上右上右下左下位置关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。