在容器中迭代一系列角度的成语
idiom for iterating a range of angles in a container?
假设我有2D行的数据
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
。但这似乎应该是一个普遍的问题,所以我想知道是否已经有一个现有的习语来解决它?
有三角方法可以解决圆形范围的问题。对于范围 - 将其末端标准化(此处的示例),并获得中间角度和半角度
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++的一系列数字中查找重复模式
- 将一系列整数放入类的最佳方法是什么?
- 如何在C++中最好地实施"newtype"成语?
- 输入验证以筛选出字符、字符串和一系列整数
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 从容器创建一系列索引的最惯用方法是什么?
- 什么是钻石问题?是一系列问题还是特定问题?
- 将一系列数字映射到 CPP 中的值的简单方法
- 将一系列已排序的元素划分为相邻组
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- 痘痘成语和交换
- 如何将由一系列十六进制值表示的枚举附加到 QByteArray?
- 使用指针遍历一系列基元类型声明?
- C++从"NameBase"类到模板"Name"类的相互关系的成语(或模式)
- 范围TS成语和神秘的汽车&&
- 跟踪多个文件中一系列字符的频率
- 如何非常快速地将数字添加到 Vector 中的一系列元素中
- 在容器中迭代一系列角度的成语