#include<iostream>
#include<cmath>
namespace {
constexpr double kEps = 1e-6;
} // namespace
class Vec2d {
public:
Vec2d() = default;
Vec2d(double x, double y) : x_(x), y_(y) {}
double x() const {
return x_;
}
double y() const {
return y_;
}
Vec2d operator - (const Vec2d& others) const {
return {x_ - others.x(), y_ - others.y()};
}
double Length() const {
return std::sqrt(x_ * x_ + y_ * y_);
}
double CrossProd(const Vec2d &other) const {
return x_ * other.y() - y_ * other.x();
}
private:
double x_{0.0};
double y_{0.0};
};
bool CalPointToSegDis(const Vec2d& p, const Vec2d& a,
const Vec2d& b, double* dis) {
if((a - b).Length() < kEps) {
return false;
}
*dis = std::abs((p - a).CrossProd(p - b))/ (a - b).Length();
return true;
}
int main() {
Vec2d point{0.0, 3.0};
Vec2d segment_start{0.0, 0.0};
Vec2d segment_end{10.0, 0.0};
double distance = 0.0;
if(!CalPointToSegDis(point, segment_start, segment_end, &distance)) {
std::cout << "Error : The Segment is a point" << std::endl;
return -1;
}
std::cout << "The distance from a point to a straight line is : "
<< distance << std::endl;
return 0;
}
点到直线距离(根据最近写的代码重写了一下)
于 2024-04-29 00:17:56 首次发布