gpt4 book ai didi

c++ - 用于在容器中迭代一系列角度的成语?

转载 作者:行者123 更新时间:2023-11-28 05:15:41 25 4
gpt4 key购买 nike

假设我有表格中的二维线数据

struct Point { int x, y; };
struct Line {
Point p1, p2;
double angle() const { return atan2(p2.y-p1.y, p2.x-p1.x); }
};

我想存储这些按角度排序的,它必须在区间(-PI, PI]

我的问题:我想在此容器中迭代一个范围,但允许它环绕区间的末端。例如“角度 PI*3/4-PI*3/4 之间的所有线”。

澄清一下,如果我使用像multimap这样的标准容器,我不能简单地做通常的事情:

std::multimap<double, Line> lm;

//insert elements...

auto begin = lm.lower_bound(PI*3/4);
auto end = lm.upper_bound(-PI*3/4);
for(auto & i = begin; i != end; ++i) { //infinite loop: end is before begin!
//do stuff with i
}

我想我可以破解一个“循环迭代 i”函数来代替循环中的 ++i。但这似乎应该是一个普遍的问题,所以我想知道是否已经有一个现成的习语来解决它?

最佳答案

有三角方法可以解决圆形范围的问题。对于范围 - 标准化它的末端(例如 here ),并得到中角和半角

if range_end < range_start then
range_end = range_end + 2 * Pi

half = (range_end - range_start) / 2
mid = (range_end + range_start) / 2
coshalf = Cos(half)

现在比较角度和距离中间的差异小于半角。余弦解决了周期性、负值等潜在问题。

if Cos(angle - mid) >= coshalf then
angle lies in range

关于c++ - 用于在容器中迭代一系列角度的成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42728491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com