gpt4 book ai didi

c# - 我有一个充满照片网址的 n x n 网格。如何确保照片不会一起出现在 c# 中

转载 作者:太空狗 更新时间:2023-10-29 19:44:33 24 4
gpt4 key购买 nike

我基本上有一个网格,比如说 100 x 100,里面装满了照片集的 url。其中一些是重复的,因为我可能只有 50 张照片,但我想复制它们以确保填充 100 x 100 网格。
我用 URL 随机填充网格,然后显示它们,这很好。我遇到的问题是,显然有时具有相同 URL 的照片会在 x 轴或 y 轴上或有时在两者上随机放置在一起。

如何确保填充网格,使具有相同 URL 的这些图像尽可能远离,从而防止 2 张相同的照片彼此相邻出现。

任何帮助表示赞赏

麦克风

最佳答案

如果你真的想要“尽可能远”,那么(1)我打赌你运气不好,(2)如果可以实现,它可能会产生看起来不太随机的结果。但是,如果您想要的只是“相距甚远”,那还不错。以下是您可以做的一些事情。

(1)根据x,y坐标的奇偶性对网格位置进行分类:即奇偶偶。将照片分成大小大致相同的四批。现在根据坐标的奇偶性从不同的批次中选择。下面的代码(有点太“聪明”;抱歉)就是这样做的,模错误和拼写错误。

System.Random rng = new System.Random();
for (int x=0; x<nx; ++x) {
for (int y=0; y<ny; ++y) {
k = ((x&1)<<1) + (y&1); // 0..3
int n_photos_in_batch = (n_photos+3-k) >> 2;
int photo_number = (rng.Next(0,n_photos_in_batch-1) << 2) + k;
// use this photo
}
}

缺点:不会做任何事情来使照片副本彼此远离一步。由于任何给定照片的所有副本都将位于固定的位置子集中,因此在一定程度上降低了随机性;在某些情况下,这可能是可见的,看起来很傻。

变化:我们基本上用 2x2 的图块覆盖网格,并限制每个图块中允许出现的照片范围。您可以使用更大的瓷砖,或不同形状的瓷砖,或以不同的方式排列它们。例如,如果你说 k = ((x&1)<<1) ^ (y&3)你会得到 2x2 瓷砖排列成一种六边形图案,这实际上可能比上面的版本更好。

(2) 遍历网格中的位置(光栅顺序可以,但可能有更好的选择),并为每个位置选择一张 (a) 不会太靠近您正在查看的位置和 ( b) 否则是随机的。下面的代码(同样,模错误和拼写错误)做这样的事情,但对于大型网格,您可能希望使其更有效率。
System.Random rng = new System.Random();
radius = MAX_RADIUS; // preferably not too big, so that the search isn't too slow
while ((2*radius+1)*(2*radius+1) >= n_photos) --radius; // gratuitously inefficient!
for (int x=0; x<nx; ++x) {
for (int y=0; y<ny; ++y) {
// which photos already appear too near to here?
System.Collections.BitArray unseen = new System.Collections.BitArray(n_photos,True);
for (x1=x-radius; x1<=x+radius; ++x1) {
for (int y1=y-radius; y1<=y+radius; ++y1) {
if (0 <= x1 && x1 < nx && 0 <= y1 && y1 < nx && (y1<y || (y1==y && x1<x))) {
unseen[photos[x1,y1]] = False;
}
}
}
// now choose a random one of them
int n_unseen = 0;
for (int i=0; i<n_photos; ++i) if (unseen[i]) ++n_unseen;
System.Debug.Assert(n_unseen>0, "no photos available");
int j = rng.Next(0,n_unseen-1);
for (int i=0; i<n_photos; ++i) {
if (unseen[i]) {
if (j==0) { photos[x,y] = i; break; }
--j;
}
}
}
}

注意:这比选项 1 昂贵得多。当然,对 x1,y1 的有效性检查在这里毫无道理地低效。半径的选择也是如此。但是,如果您采用我即将列出的一些变体,这些明显更有效的版本可能会崩溃。就目前而言,如果少于 9 个,此代码将不会做任何事情来将照片分开。对于我使用的网格遍历顺序,半径的选择实际上是完全虚假的,因为永远不会超过 2r ^2+2r 个“排除”位置;同样,如果您以不同的顺序遍历网格,这可能会改变。等等。

变化:没有真正的理由为什么您搜索的区域应该是方形的。例如,Circular 可能会更好。您可以通过一些额外的工作,构建一个区域,该区域中的点数始终与您拥有的照片一样多(尽管如果这样做,您将获得大部分周期性的照片模式,因此最好不要过于激进)。在不同的位置处理网格条目可能会更好——例如,从中心向外盘旋。

(3) 上面的选项 2 将在一定范围内保持照片的唯一性(大约与您拥有多少张不同的照片一样大),但不关心将副本保持在更远的距离。相反,您可以决定在任何给定距离有两张相同的照片有多糟糕,然后选择照片以最大限度地减少总的糟糕程度。这将比选项 2 更昂贵。我不会费心提供示例代码;你可能会想出如何去做。

[编辑添加...]

(4) 这是 (1) 主题的一个可爱变体。当网格为正方形且其大小为 2 的幂时,它的效果最佳,但您可以对其进行调整以使其更通用。无论您拥有多少张照片,所需的时间仅与网格的大小成正比。对于每个位置 (x,y):对于某些 k,丢弃除底部 k 位之外的所有坐标。对它们进行位反转并交织位,给出一个从 0 到 2^(2k)-1 的数字 m。选择 k 使其在某处,例如 n_photos/4。现在,在位置 (x,y) 处,您将把照片编号设为 round(n_photos*m/2^(2k) + smallish_random_number)。有一些细节我会留给你填写:-)。

关于c# - 我有一个充满照片网址的 n x n 网格。如何确保照片不会一起出现在 c# 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262266/

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