c++ - 同一直线上的点

标签 c++ geometry maps runtime-error

我在做一个练习题,它是这样的,我们给了 N 对坐标 (x,y),我们也给了一个中心点,它是 (x0,y0)。我们被要求找到最大值从 (x0,y0) 穿过的直线上的点数。

我的方法:- 我试图维护一个以斜率为键的散列图,我想获得最大的第二个值以获得同一条线上的最大点数。像这样

      mp[(yi-y0)/(xi-x0))]++; //i from 0 to n

      And iterating map and doing something line this
      if(it->second >max) //it is the iterator
      max=it->second;
      and printing max at last; 

我的方法有问题- 每当我得到 (xi-x0) 为 0 时,我都会收到运行时错误。我还尝试了 atan(slope) 这样我就会得到度数而不是一些未定义的值但是仍然无法正常工作。

我的期望->如何消除这个运行时错误,我的方法是否正确,可以找到从点 (x0,y0) 穿过的直线上的最大点。

P.S -我的母语不是英语,所以如果有问题请忽略。我尽力把一切都说清楚如果我不够清楚请告诉我

最佳答案

我假设没有其他点的坐标与您的“原点”相同。

如果您所有的坐标恰好都是整数,您可以保留一个有理数数(即一对整数,即一个分子和一个分母) 作为斜率,而不是单个实数。

斜率是 DeltaY/DeltaX,因此您所要做的就是将这对数字分开。您只需要注意用它们的最大公约数 来除以该对,并处理DeltaX 为零的情况。例如:

pair<int, int> CalcSlope (int x0, int y0, int x1, int y1)
{
    int dx = abs(x1 - x0), dy = abs(y1 - y0);
    int g = GCD(dx, dy);
    return {dy / g, dx / g};
}

现在只需使用 CalcSlope() 的返回值作为您的 map 键。

如果您需要,这里有一种计算 GCD 的方法:

int GCD (int a, int b)
{
    if (0 == b) return a;
    else return gcd(b, a % b);
}

关于c++ - 同一直线上的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30044628/

相关文章:

c++ - Google Mock 和 Catch.hpp 集成

包含枚举的结构的 C++ 复制构造函数

tsql - 将圆插入几何数据类型

android - Google Maps Android v1 API 已弃用 - 获取用于开发的 API key

html - 获取 HERE map 嵌入代码以供重用

c++ - 通过防火墙代理将 Arduino 连接到 Internet

c++ - 将 OpenCV 与 std::Array 结合使用

c - 在 C 中实现椭圆方程的正确方法是什么?

math - 在圆柱体中生成随机点

python - 在卫星 map 上绘制数据