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

【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日

悬赏问题

  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app