小编seb*_*007的帖子

用有限数量的线段和圆弧逼近曲线

是否有任何算法可以使用有限数量的线段和圆弧(恒定曲率)来逼近 xy 平面(即由 x 和 y 定义的有序点集)上的路径?结果曲线需要是 C1(斜率的连续性)。

最大数量或线段和弧线可以是一个参数。另一个有趣的约束是防止两个连续的圆弧没有中间线段连接它们。

我看不出有任何方法可以做到这一点,我认为不存在针对它的方法,但欢迎对此目标的任何暗示。

例子:

示例文件可在此处获得

由一组点定义的离散路径

考虑这条路。它看起来像一条线,但实际上是一组非常接近的点的有序套件。没有噪音,点序列的顺序是众所周知的。

我想用最少连续的线段和圆弧(假设 10 个线段和 10 个圆弧)和 C1 连续性来近似这条曲线。段/弧的数量本身不是一个目标,但我需要任何参数来减少/增加这个数量,以达到一定的参数化简单性,但代价是精度损失。

解决方案:

这是我的解决方案,基于 Spektre 的回答。红色曲线为原始数据。黑线是线段,蓝色曲线是圆弧。绿色十字是显示半径的圆弧中心,蓝色十字是线段可能连接的点。

配件

  1. 检测线段,以斜率最大偏差和线段最小长度为参数。将新段步长的斜率与现有段的平均步长进行比较。我更喜欢基于优化的方法,但我认为它不存在于数量、位置和长度未知的不相交段。
  2. 用切线连接线段。为了关闭系统,半径被选择为使得段末端被移动的可能性最小。为了我的目的,添加了最小半径约束。我相信会有一些特殊情况需要处理在拐点很远时(例如线几乎平行)并与相邻线段相互作用。

algorithm geometry computational-geometry

5
推荐指数
1
解决办法
5068
查看次数

如果其他线程只读取共享数据,OpenMP 是否需要原子写入?

我在 C++ 中有一个 openmp 并行循环,其中所有线程都访问一个共享的 double 数组。

  • 每个线程仅在其自己的数组分区中写入。两个线程不能写入同一个数组条目。
  • 每个线程读取其他线程写入的分区。只要双精度值是旧值或更新值(不是读取半写入的双精度值所导致的无效值),数据是否已被拥有该分区的线程更新并不重要。

我是否需要原子写入来确保读取的数据有效(旧的或更新的),或者仅当多个线程尝试在同一位置写入时才需要原子写入?

它似乎可以在有或没有原子写入的情况下工作,但如果没有原子写入,当然速度更快。

multithreading atomic openmp shared-memory

3
推荐指数
1
解决办法
1278
查看次数