Qt中按照逆时针给一组坐标排序

来源:互联网 发布:飞思卡尔arm编程软件 编辑:程序博客网 时间:2024/05/19 17:56

具体描述下这个问题:

经过切片的到一组无序的交点,有一组无序的离散坐标点,想让它们连接起来成为轮廓线,显示在qwtplot控件中;

网上有很多这样的算法程序,几乎清一色都是讲的凸多边形坐标排序,有一个关键点就是这些点不允许存在三点一线,否则输出的结果就不是正确的逆时针排序

http://www.cnblogs.com/dwdxdy/p/3230156.html 就是凸多边形排序

我自己的坐标点中,肯定存在三点一线的情况,以上的排序方法肯定不能满足要求,想想还有斜率可以用啊,是吧!

关键一点是,不要自己傻啦吧唧去写排序函数,现成的排序函数qSort干嘛不用

以多边形重心为准,计算点到重心的角度,按照角度的大小,对坐标排序

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QDebug>#include <cmath> #include <QtAlgorithms> //数据排序namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    QVector<QPointF> PointF;    static bool cmp(QPointF a, QPointF b); //定义为静态,不然出错private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H
mainwindow.cpp

#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    PointF.append(QPointF(0,0));    PointF.append(QPointF(4,4));    PointF.append(QPointF(0,4));    PointF.append(QPointF(4,0));    PointF.append(QPointF(2,0));    PointF.append(QPointF(3,0));    PointF.append(QPointF(4,2)); //设定的测试点qDebug()<<atan2(PointF[0].y()-2,PointF[0].x()-2);qDebug()<<atan2(PointF[1].y()-2,PointF[1].x()-2);qDebug()<<atan2(PointF[2].y()-2,PointF[2].x()-2);qDebug()<<atan2(PointF[3].y()-2,PointF[3].x()-2);qDebug()<<atan2(PointF[4].y()-2,PointF[4].x()-2);    qSort(PointF.begin(),PointF.end(),cmp);    qDebug()<<PointF[0]<<PointF[1]<<PointF[2]<<PointF[3]<<PointF[4]<<PointF[5]<<PointF[6];}MainWindow::~MainWindow(){    delete ui;}bool MainWindow::cmp(QPointF a, QPointF b){    double d1 = atan2(a.y()-2,a.x()-2);    double d2 = atan2(b.y()-2,b.x()-2);    //atan2((y1-y0),(x1-x0)),反正切函数,计算两点形成斜率的角度    return d1 < d2;}

main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}

测试结果:满足设计要求


阅读全文
0 0
原创粉丝点击