小编Ole*_*leg的帖子

减去/添加值而不会出现溢出或下溢

想象一下,我有两个无符号字节bx.我需要计算bsubas b - xbaddas b + x.但是,我不希望在这些操作期间发生下溢/溢出.例如(伪代码):

b = 3; x = 5;
bsub = b - x; // bsub must be 0, not 254
Run Code Online (Sandbox Code Playgroud)

b = 250; x = 10;
badd = b + x; // badd must be 255, not 4
Run Code Online (Sandbox Code Playgroud)

显而易见的方法包括分支:

bsub = b - min(b, x);
badd = b + min(255 - b, x);
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有更好的方法来做到这一点,即通过一些hacky位操作?

c c++ optimization bit-manipulation saturation-arithmetic

82
推荐指数
4
解决办法
1万
查看次数

是否可以在可变参数模板函数中扩展非可变参数?

通过一个例子来解释我的意思可能更容易.想象一下以下模板:

template <class... Args>
std::tuple<Args...> foo();
Run Code Online (Sandbox Code Playgroud)

例如,可以调用它,如下所示:

auto ret = foo<int, bool>();
Run Code Online (Sandbox Code Playgroud)

但是如果我想根据可变参数模板参数的数量将其他参数传递给函数呢?例如,假设我想为每个Args传递一个字符串文字:

auto ret = foo<int, bool>("a", "b");
Run Code Online (Sandbox Code Playgroud)

这个问题是,似乎不可能扩展非可变参数,所以下面显然不能编译:

template <class... Args>
std::tuple<Args...> foo(const char*... names);
Run Code Online (Sandbox Code Playgroud)

有没有明智的方法来实现这个?

c++ templates c++11

27
推荐指数
1
解决办法
1180
查看次数

通过每两点之间的距离对集群中的点进行分组的高效算法

我正在为以下问题寻找一种有效的算法:

给定 2D 空间中的一组点,其中每个点由其 X 和 Y 坐标定义。需要将这组点拆分为一组簇,以便如果两个任意点之间的距离小于某个阈值,则这些点必须属于同一簇:

样本集群

换句话说,这样的集群是一组彼此“足够接近”的点。

朴素算法可能如下所示:

  1. R是一个结果簇列表,最初为空
  2. P是一个点列表,最初包含所有点
  3. P 中随机选取一个点并创建一个仅包含该点的集群C。P 中删除该点
  4. 对于来自P 4a 的每个点Pi。对于来自C 4aa 的每个点Pc。如果distance(Pi, Pc) < 阈值,则将Pi添加到C并将其从P 中删除
  5. 如果在步骤 4中至少有一个点被添加到集群C,则转到步骤 4
  6. 将集群C添加到列表R。如果P不为空,则转到步骤 3

然而,天真的方法是非常低效的。我想知道这个问题是否有更好的算法?

PS我不知道先验的簇数

algorithm cluster-analysis machine-learning data-mining

7
推荐指数
2
解决办法
2967
查看次数

如何将QImage格式转换为OpenGL支持的格式

我正在使用QImage加载图像,然后在OpenGL中用作纹理.问题是颜色组件在QImageOpenGL中有不同的顺序.目前我GL_RGBA在OpenGL和QImage::Format_ARGB32Qt中使用格式.因此,在OpenGL中创建纹理之前,我必须为加载图像的每个像素手动交换字节.此外,要正确交换字节,我需要知道机器的字节顺序.

有谁知道更好的解决方案吗?至少,有没有办法使这种转换与字节顺序无关?

谢谢.

c++ opengl qt qt4

4
推荐指数
1
解决办法
2041
查看次数

平铺地图编辑器:等距平铺边的大小

在Tiled编辑器中有一个等距映射示例:"isometric_grass_and_water.tmx".此示例显示了具有64x32像素大小的图块的简单等距映射.

我需要知道瓷砖边的大小,所以我只是用了毕达哥拉斯定理: 在此输入图像描述

在直角三角形ABC侧AC =宽度/ 2 = 32并且侧AB =高度/ 2 = 16.因此,区块(BC)的侧面可以被计算为:

在此输入图像描述

所以整块瓷砖是菱形,每边= 35.777.

然而,当我向Tiled添加尺寸为35.77 x 35.77的方形物体时,它不适合网格(它实际上比在瓷砖上更大).但是,如果我添加尺寸为32 x 32的物体 - 它非常适合.

请看一下这张图片(对象A是32x32,B是35.77x35x77):

在此输入图像描述

这怎么可能?Tiled是否使用了某种缩放,或者我的计算出了什么问题?

tile isometric tiled

2
推荐指数
1
解决办法
3792
查看次数