小王小王好好学习 2022-10-18 09:47 采纳率: 33.3%
浏览 52
已结题

【C++】二维点排序

在一个使三维点按X、Y、Z的优先顺序排序的程序基础上,要怎么实现找到最小点(忽略X值,认为三维点是处于x平面的二位坐标),求其他点与该点的斜率,并按斜率从大到小排序,最后输出排列好的点坐标。
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<iomanip>
using namespace std;

class Point {
public:
    double x_axis;  //X轴坐标
    double y_axis;  //Y轴坐标
    double z_axis;  //Z轴坐标

};

//从文件中读出数据
void read_file(vector<Point>& vstu) {
    string line, first_line;
    Point poi;
    int i = 0;

    ifstream in("C:\\Users\\a1837\\Desktop\\rotate-test.txt", ios::in);

    while (getline(in, line))
    {
        istringstream stream(line);
        stream >> poi.x_axis >> poi.y_axis >> poi.z_axis;
        vstu.push_back(poi);
        i++;
    }
    in.close();
}

bool stucmp_desc(const Point& a, const Point& b) {
    if (a.y_axis < b.y_axis) return true;
    else if (a.y_axis > b.y_axis) return false;
    else if (a.z_axis < b.z_axis) return true;
    else return false;

}

void output_info(const vector<Point>& vstu)
{

    for (int i = 0; i != vstu.size(); ++i) {
        cout << std::left << setw(12) << vstu[i].x_axis << std::left << setw(12) << vstu[i].y_axis << std::left << setw(12) << vstu[i].z_axis << endl;
    }
}
int main() {
    vector<Point> vstu;
    read_file(vstu);
    sort(vstu.begin(), vstu.end(), stucmp_desc);
    output_info(vstu);
    system("pause");
    return 0;
}


  • 写回答

1条回答 默认 最新

  • 快乐鹦鹉 2022-10-18 10:20
    关注

    最小点要满足什么条件呢?
    你要问什么呢?

    Point getMinPt(vector<Point>& vstu)
    {
        Point pt;
        for (int i = 0; i != vstu.size(); ++i) 
        {
            if(i==0)
                pt = vstu[i];
            else if(pt.y_axis < vstu[i].y_axis)
                pt = vstu[i];
        }
        return pt;
    }
    
    float getk(Point minPt,Point p)
    {
        return (p.z_axis-minPt.z_axis)/(p.y_axis-minPt.y_axis);  //这里要考虑,如果y值相等,斜率怎么算???
    }
    
    void sorts(vector<Point>& vstu,Point minPt)
    {
        vector<float> k;
        for (int i = 0; i != vstu.size(); ++i) 
        {
             k.push_back(getk(minPt.vstu[i]);
        }
        for(int i=0;i<k.size()-1;i++)
        {
            for(int j=0;j<k.size()-i-1;j++)
            {
                  if(k[j] < k[j+1])
                  {
                      float f = k[j];
                      k[j] = k[j+1];
                      k[j+1] = f;
                      Point p = vstu[j];
                      vstu[j] = vstu[j+1];
                      vstu[j+1] = p;
                  }
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月22日
  • 已采纳回答 10月18日
  • 创建了问题 10月18日

悬赏问题

  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式