你是一位C++高级程序员,精通stl,请定义三维点类,若两点距离小于1,则认为是相同点,如果将这个三维点类作为std::map的键值,请帮忙设计一下这个三维点类
时间: 2024-12-20 07:31:17 浏览: 13
作为一名C++高级程序员,并熟悉STL,我们可以定义一个名为`Point3D`的类,用于表示三维空间中的一个点。为了确定两个点是否视为"相同点",我们将基于它们的坐标差的平方和判断距离是否小于1。此外,我们还将提供必要的成员函数以便于映射到`std::map`中。以下是类的定义:
```cpp
#include <iostream>
#include <cmath> // 包含用于计算平方根和距离的头文件
class Point3D {
public:
// 构造函数,初始化x、y、z坐标
Point3D(double x = 0, double y = 0, double z = 0)
: x_(x), y_(y), z_(z) {}
// 获取坐标值
double getX() const { return x_; }
double getY() const { return y_; }
double getZ() const { return z_; }
// 判断两个点的距离是否小于1
bool isSame(Point3D other) const {
double dx = std::abs(x_ - other.x_);
double dy = std::abs(y_ - other.y_);
double dz = std::abs(z_ - other.z_);
return (dx * dx + dy * dy + dz * dz) < 1;
}
private:
double x_;
double y_;
double z_; // 三维坐标
};
// 使用Point3D作为std::map的键值对,需要重载比较运算符<
bool operator<(const Point3D& a, const Point3D& b) {
if (a.isSame(b)) {
// 如果是相同点,则按照某种顺序排列,比如先按x,然后y,最后z
return a.getX() < b.getX() || (a.getX() == b.getX() && a.getY() < b.getY()) ||
(a.getX() == b.getX() && a.getY() == b.getY() && a.getZ() < b.getZ());
}
return a.isSame(ZeroPoint3D()) && !b.isSame(ZeroPoint3D()); // 非相同点优先级
}
// 创建一个辅助静态常量,代表坐标为(0, 0, 0)的点
const Point3D ZeroPoint3D{0, 0, 0};
int main() {
std::map<Point3D, std::string> pointMap;
// 插入点并利用isSame()判断键值
pointMap.insert({Point3D(0.9, 0.9, 0.9), "Very Close"});
pointMap.insert({Point3D(1.1, 1.1, 1.1), "Not Same"});
for (const auto& pair : pointMap) {
std::cout << "Point (" << pair.first.getX() << ", " << pair.first.getY() << ", " << pair.first.getZ()
<< ") maps to \"" << pair.second << "\"\n";
}
return 0;
}
```
阅读全文