首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SFML如何生成随机形状并使其不与另一个形状重叠

SFML(Simple and Fast Multimedia Library)是一个跨平台的多媒体库,用于开发2D游戏和图形应用程序。要生成随机形状并使其不与另一个形状重叠,可以按照以下步骤进行:

  1. 首先,确定你想要生成的形状的类型,例如矩形、圆形、多边形等。
  2. 然后,确定生成形状的范围,即形状可以出现的位置的限制。这可以是屏幕的特定区域或游戏场景中的特定区域。
  3. 接下来,使用随机数生成器生成形状的位置和大小。你可以使用C++的随机数生成器库(如 <random>)来生成随机数。
  4. 确保生成的形状不与其他形状重叠。可以通过检查生成的形状与已有形状的位置和大小进行比较,以确保它们不重叠。如果发现重叠,可以重新生成形状或调整其位置和大小。
  5. 最后,将生成的形状绘制到SFML的窗口中,以显示在屏幕上。

在SFML中,你可以使用以下函数和类来实现上述步骤:

  • sf::RectangleShape:用于创建矩形形状。
  • sf::CircleShape:用于创建圆形形状。
  • sf::ConvexShape:用于创建多边形形状。
  • sf::Vector2f:用于表示形状的位置和大小。
  • sf::RenderWindow:用于创建窗口并显示形状。

以下是一个示例代码,演示如何使用SFML生成随机形状并确保它们不重叠:

代码语言:txt
复制
#include <SFML/Graphics.hpp>
#include <random>

int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "Random Shapes");

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<float> posDist(0.f, 800.f); // 生成位置的随机分布
    std::uniform_real_distribution<float> sizeDist(10.f, 100.f); // 生成大小的随机分布

    std::vector<sf::Shape*> shapes; // 存储生成的形状

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        // 生成随机形状
        sf::Shape* shape = nullptr;
        int shapeType = std::rand() % 3; // 随机选择形状类型
        if (shapeType == 0)
        {
            shape = new sf::RectangleShape(sf::Vector2f(sizeDist(gen), sizeDist(gen)));
        }
        else if (shapeType == 1)
        {
            shape = new sf::CircleShape(sizeDist(gen));
        }
        else if (shapeType == 2)
        {
            sf::ConvexShape* convexShape = new sf::ConvexShape();
            convexShape->setPointCount(5); // 设置多边形的点数
            for (int i = 0; i < 5; ++i)
            {
                convexShape->setPoint(i, sf::Vector2f(posDist(gen), posDist(gen)));
            }
            shape = convexShape;
        }

        // 确保形状不重叠
        bool overlap = false;
        for (sf::Shape* existingShape : shapes)
        {
            if (shape->getGlobalBounds().intersects(existingShape->getGlobalBounds()))
            {
                overlap = true;
                break;
            }
        }

        if (!overlap)
        {
            shape->setPosition(sf::Vector2f(posDist(gen), posDist(gen)));
            shapes.push_back(shape);
        }
        else
        {
            delete shape;
        }

        window.clear();

        // 绘制形状
        for (sf::Shape* existingShape : shapes)
        {
            window.draw(*existingShape);
        }

        window.display();
    }

    // 释放内存
    for (sf::Shape* shape : shapes)
    {
        delete shape;
    }

    return 0;
}

这个示例代码使用了SFML的窗口和形状类来生成随机形状,并使用随机数生成器来生成位置和大小。它还使用了碰撞检测来确保生成的形状不重叠。请注意,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《译 SFML Essentials 英文版》—— 《第一章》 SFML 入门

这将从用户输入中生成可打印的字符,对于文本字段非常有用。...让我们看看键盘键是如何按下和释放的: #include // 如果我们用Window类,我们必须使用头文件#include ...它并没有没有多大用处,因为它没有提供绘制SFML形状的接口 。我们必须使用一个名为RenderWindow的类来做到这一点。 此类派生自Window类添加绘图功能。...● 下一个示例显示了我们如何使用平移和旋转的组合来创建简单的动画: #include // 如果我们用Window类,我们必须使用头文件#include <SFML...我们将在第3章中探讨如何在执行动画和游戏逻辑时管理时间。​​​​​​​ 现在,让我们看看如何实时控制形状。​​​​​​​

3K30

Unity基础教程系列(五)——生成区域(Level Variety)

(通过小的生成区域生成巨大的形状) 1 生成点 我们这个简单游戏玩法就是生成随机形状。每种形状的材质和颜色都是随机选择的,其位置,旋转和比例也是如此。...通过使用Transform组件的position属性而不是localPosition,可以使生成区域成为另一个对象的子级。这样,可以将生成区域附加到其他可能正在移动的区域。 ?...(只在区域的表面生成) 仅在表面上生成才可以使球体的形状更加明显。 ? ? (表面和内部对比) 1.5 可视化区域 现在可以调整生成区域了,但如果可以不生成很多点就能看到其形状就会更好了。...我们还可以朝另一个方向发展,通过静态属性使GameLevel可用,Game将使用该属性来到达生成区域。...这样就可以创建更复杂的区域,该区域由多个单独的区域(可能是重叠的区域)组成。 添加一个CompositeSpawnZone类,使其扩展SpawnZone,并为其提供一个spawnZones数组字段。

1.9K20
  • Unity基础教程系列(八)——更多工厂(Where Shapes Come From)

    1.2 复合胶囊体 通过组合三个旋转的胶囊可以制成更复杂的形状。从默认胶囊开始,然后给它两个子胶囊。将子节点旋转90°,一个围绕其X轴旋转,另一个围绕其Z轴旋转。...当我们配置一个新生成形状时,我们不需要统一的颜色,而是为每个颜色索引选择一个随机的颜色。 ? ? ? (不一致颜色的形状) 每个形状是否可以使用相同的色调?...当然,你可以为整个形状随机选择一次色相,而饱和度和值则保持随机,也可以使用另一个配置选项来控制它。实际上,你可以使用三个单独的开关来代替色调,饱和度和值,而不是单个统一的颜色切换。...2.1 复合形状工厂 通过复制现有工厂来创建另一个形状工厂资产。保持相同的材质,但确保仅引用三个复合形状的预制件。将其命名为Composite Shape Factory。...为每个生成区域指定在生成形状时要使用的工厂的引用。每个区域至少需要一个工厂,但是你可以提供多个。生成时,我们将随机选择其中一个工厂。 ? (生成区的工厂配置) 你还可以不止一次包含一个工厂。

    1.4K10

    SwiftUI:使用 CGAffineTransform 和奇偶填充来变换形状

    当您不再满足于简单的形状和路径时,SwiftUI的两个有用功能会合在一起,以极少的工作量创建出漂亮的效果。第一个是CGAffineTransform,它描述了如何旋转,缩放或剪切路径或视图。...第二个是奇偶填充(even-odd fills),它使我们可以控制应如何渲染重叠形状。 为了演示这两种方法,我们将用几个旋转的椭圆形花瓣创建一个花朵形状,每个椭圆形都围绕一个圆放置。...如果您查看绘制椭圆的方式,它们经常重叠——有时一个椭圆绘制在另一个椭圆上,有时绘制在其他多个椭圆上。 如果我们使用纯色填充路径,则会得到相当不令人印象深刻的结果。...它是这样的: 如果路径没有重叠,它将被填充。 如果另一条路径重叠,则重叠的部分将不会被填充。 如果第三个路径与前两个路径重叠,则会被填充。 …等等。...更好的是,Swift UI使其使用起来很简单,因为每当我们在形状上调用fill()时,我们都可以传递一个FillStyle结构体,该结构要求启用奇偶规则。

    1.5K30

    Unity基础教程系列(十)——卫星(Shape Relationships)

    本文重点: 1、一次生成多个形状 2、让形状围绕另一个形状 3、保持对特殊形状的实例引用 4、强制执行形状填充限制 这是有关对象管理系列的第十篇教程。它添加了一个附属行为,用于确定形状之间的关系。...(大形状都有他们自己的小兄弟) 1 生成多种形状 在本教程中,我们将创建一个行为,使一个形状绕着另一个形状运行,例如卫星。我们会在生成形状时决定是否具有卫星。如果是的话,那么我们还将生成它的卫星。...我们可以对卫星使用不同的工厂,但是对于常规形状,我们将简单地使用相同的工厂来生成随机的工厂对其进行任意旋转。 ? 我们现在还不会创建真正的卫星。...使其相对于焦点形状从0.1到1。 ? ? (卫星配置,相对缩放比) 在这个范围内使用一个随机值,而不是我们目前使用的固定的0.5。 ?...可以通过取轨道轴与另一个随机向量的叉积来实现。这给了我们一个投影到轨道平面上的随机向量,该向量很可能不是单位长度,因此我们应该对其进行归一化。 ? 什么是叉乘? 有关说明,请参见渲染6,凹凸。

    1.6K21

    Unity基础教程系列(七)——可配置形状(Variety of Randomness)

    1.2 随机旋转 下一步是给每个形状一个随机的角速度。添加一个公共AngularVelocity属性,使其可以进行配置,然后使用该属性来确定每次Update的旋转程度。 ?...(随机速度) 2.4 逐个生成区域的速度 给每个形状一个随机的运动方向会产生一个相当混乱的场景。相反,我们可以让所有形状都朝着同一个方向移动。...3.3 随机运动 让我们也支持随机方向,这就是我们开始的方式。将随机添加到枚举。 ? 使用Random.onUnitSphere生成随机方向向量。 ? ?...调整ConfigureSpawn中的引用以使其匹配。此时,由于移动方向名称变得很长,因此可以方便地用开关块替换if-else序列。 ? ? (配置字段) Switch如何工作?...这告诉Unity将其与所有其他与编辑器有关的代码进行编译和组合,使其脱离构建。 ?

    2.7K30

    现代OpenGL(一):我的第一个OpenGL程序

    片元着色阶段会处理OpenGL光栅化之后生成的独立片元,并且这个阶段也必需绑定一个着色器。 总结一下: 一个用来渲染图像的OpenGL程序需要执行的主要操作如下: 1....从OpenGL的几何图元中设置数据,用于构建形状。 2. 使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。 3....---- 第三方库的配置 由于我们这里需要用到好些第三方库,这里顺便说一下在Visual Studio中如何使用第三方的C++库。...首先,下载官方提供的库文件解压,有的只提供了源文件,需要我们自己编译。一般的至少都会包含三个目录:include文件夹、lib文件夹和bin文件夹。...接收颜色信息的输入,输出用于Fragment渲染。

    2.2K30

    你不知道的SVG

    顺便说一下,不久前,我们还研究了SVG生成器--从形状和背景到SVG路径可视化工具、裁剪工具以及SVG → JSX生成器等所有东西。如果你正在处理SVG,这些也可能会派上用场。...生成性SVG网格自动生成艺术画作对于每一个喜欢创造艺术画作但又觉得在代码中更自在的人来说是一个绝好的机会。比方说,你想创造几何图案,生成艺术画作将解决你的选择困难症。我使用什么形状?我把它们放在哪里?...如果你想尝试一下,Alex Trost写了一篇关于用SVG网格创建生成艺术画作的教程,它一定会激发你的创造力--让你对SVG有更多了解。Alex创建的生成艺术是一个由行和列数量随机的块组成的网格。...乔治-弗朗西斯探讨了如何创造纹理和深度。乔治探讨的技术相当简单,但很有效。在画布的随机点上添加微小的随机形状,用线条填充固体形状,用算法均匀但随机地分布非重叠的圆。这是一个很有启发性的想法。...SVG元素是一个进入另一个世界的望远镜"。把svg元素想象成进入另一个世界的望远镜,那么缩放就会变得容易得多。

    3.8K21

    谷歌等研究团队利用AI,使插入的对象更逼真地融入场景

    它不仅需要确定所述对象的适当位置,还需要尝试预测对象在目标位置的外观,包括比例,遮挡,姿势,形状等。 幸运的是,AI能够在这一情境下提供帮助。...这项任务与许多实际应用密切相关,包括图像合成、AR和VR内容编辑以及领域随机化。这样的对象插入模型有助于促进许多图像编辑和场景解析应用程序。...它们的端部到端框架包括利用GAN的两个模块,第一个用于确定插入的对象位置,另一个确定插入的对象是怎样的。因为系统同时对插入的图像建模分布,所以它使两个模块能够相互通信优化。...正如研究者所解释的那样,在这种情况下,生成器可以预测“合理”的位置,以生成具有“语义连贯”的比例,姿势和形状的对象蒙版,特别是对象在场景中的分布方式,以及如何自然地插入对象,使其看起来像是场景的一部分。...在测试中,研究人员的模型通过插入逼真形状的物体,使模型优于基线。当图像识别器 YOLOv3应用于AI生成的图像时,它能够通过0.79召回率来检测合成对象。

    83740

    开源公告|BlockFusion发布

    这个潜在空间在保持相似几何形状表示能力的同时,显著减少了参数数量。这一步至关重要,我们发现在原始Tri-plane空间跑Diffusion无法生成有意义的形状。 3....二者有部分重叠。目标是生成可以表示新块Q的潜在Tri-plane。我们使用P的潜在Tri-plane作为condtion,来推断与P部分重叠的Q的潜在Tri-plane。...对于顶部三行,重叠比例为25%,对于底部三行,重叠比例为50% 大场景生成结果 利用三平面外推,我们可以构建任意规模的大型、无边界的场景。...Text2Room 生成了扭曲的形状,无法准确响应场景中的物体数量。例如,当给出提示“一张床”时,它会生成多张床。...相比之下,BlockFusion生成了更高质量的形状正确响应了数量Prompt 图9.大房间生成结果 附参考文献: 1.

    25510

    Unity基础教程系列(六)——更多的游戏状态(Saving All That Matters)

    (可重复生成随机形状) 1 保存随机性 当生成形状时使用随机性的重点是会得到不可预知的结果,但这不一定是我们想要的。假设你先保存了游戏,又再生成了一些形状。...当玩家开始一个新游戏时,第一步就是恢复主随机状态。然后获取一个随机使用它作为种子,在InitState方法里,通过random初始化一个新的伪随机序列。 ?...为了使其循环,当我们经过数组的末尾时,跳回到第一个索引。 ? 顺序生成区的行为与随机生成区明显不同。尽管它们在每个区域中的位置仍然是随机的,但其生成模式清晰,形状在区域之间均匀分布。 ?...另一个重要的点是,我们所有场景中的GameLevel实例都没有自动获得新的数组。你必须打开保存所有关卡场景,否则在加载关卡时可能会出现空引用异常。...要使其旋转,请给它提供一个Update方法,该方法调用其转换的Rotate方法,使用由时间增量缩放的速度作为参数。 ? 为了演示旋转的对象,我创建了第四个场景。

    1.2K20

    随机三维图像中可以找到多少动物和阿尔普物形?

    和二维情况一样,我们从一个随机图像开始:这时,三维图像的体素值是0和1. 为了可重复性,我们对伪随机生成器播种。阿尔普物形相当普遍,任何种子都可以生成它们。我们从一个相对较小的图像开始。...下面有数百个可供打印的形状。我们使用 ShellRegion 制作中空区域从而节省材料降低造价。 以下是上面另一个区域的平滑过程。 这是另外三个。 现在许多三维形状可以从随机和非随机三维图像中提取。...下面是三维形状随机方向的16个投影到 x-z 平面的阵列: 初始三维图像不一定是完全随机的。 在下一个例子中,如果圆圈与体素相交,我们随机将圆圈放在三维空间,使体素为白色。...我现在将使用具有双侧对称性的随机图像。 结果,所得到的许多形状也将具有双侧对称性。 之所以不是所有的形状,是因为一些区域不与对称平面相交。...函数 makeSymmetricShapes3D 将生成具有双侧对称性的区域。 下面是一些例子: 下面是对这些区域进行平滑着色的版本。这里选择的视点是为了让双侧对称更明显。

    1K60

    Unity基础教程系列(十一)——生命周期(Growth and Death)

    使其生效,需要给CreateSatelliteFor添加一个持续时间的参数,让它在最后为卫星形状调用SetupLifecycle。 ?...2.2 配置死亡 死亡持续时间的长短也是我们将在每个生成区域中配置的内容,因此请将其字段添加到LifecycleConfiguration中,使用与生长持续时间相同的范围。 ?...调整CreateSatelliteFor,使其使用向量。 ? 更新SpawnShapes。 ? ? ? 2.3 杀掉形状 当仅使用濒临死亡的行为时,我们将看到形状突然出现,并立即开始缩小消失。...2.5 阻止多余的Kill 延迟杀死方法可以确保所有形状都按需更新,但这带来了另一个潜在问题。现在,相同的形状有可能被杀死多次。例如,濒死的行为有可能杀死形状,然后由于形状限制而立即被破坏。...(杀掉濒死的形状需要移动2次) ? 这个条件命题是如何运作的呢? 如果我们要处理的是濒死的形状,则第一个条件的评估结果为true。

    79721

    t-SNE:如何理解与高效使用

    该算法是非线性的,适应底层数据,对不同区域执行不同的转换。这些差异可能是造成混乱的主要来源。...另一个问题是使用相同超参数的不同运行是否会产生相同的结果。在这个简单的两个簇示例以及我们讨论的大多数其他示例中,多次运行给出了相同的全局形状。...t-SNE 算法使其“距离”适应数据集中的区域密度变化。结果,它自然地扩展了密集的 cluster ,收缩了稀疏的 cluster ,从而平衡了 cluster 的大小。...随机噪声 随机噪声并不总是看起来随机。 当你看到噪音时,识别它是一项关键技能,但需要时间来建立正确的直觉。t-SNE 的一个棘手之处在于它抛弃了很多现有的直觉。...当然,因为我们知道点云是随机生成的,所以它没有统计上有趣的cluster:那些“cluster”没有意义。如果您回顾前面的示例,低perplexity 通常会导致这种分布。

    67720

    t-SNE:如何理解与高效使用

    该算法是非线性的,适应底层数据,对不同区域执行不同的转换。这些差异可能是造成混乱的主要来源。...另一个问题是使用相同超参数的不同运行是否会产生相同的结果。在这个简单的两个簇示例以及我们讨论的大多数其他示例中,多次运行给出了相同的全局形状。...t-SNE 算法使其“距离”适应数据集中的区域密度变化。结果,它自然地扩展了密集的 cluster ,收缩了稀疏的 cluster ,从而平衡了 cluster 的大小。...随机噪声随机噪声并不总是看起来随机。当你看到噪音时,识别它是一项关键技能,但需要时间来建立正确的直觉。t-SNE 的一个棘手之处在于它抛弃了很多现有的直觉。...当然,因为我们知道点云是随机生成的,所以它没有统计上有趣的cluster:那些“cluster”没有意义。如果您回顾前面的示例,低perplexity 通常会导致这种分布。

    83720

    【愚公系列】2024年01月 GDI+绘图专题 GraphicsPath

    例如,应用一个旋转变换可以在GraphicsPath中旋转图形,而将一个路径添加到另一个路径可以将两个形状组合成更复杂的形状。...一、GraphicsPath1.属性1.1 FillMode属性FillMode属性指定如何填充GraphicsPath对象的内部区域。...这意味着如果两个区域重叠,则只绘制其中一个区域。Winding表示按照顺时针或逆时针方向绘制GraphicsPath对象内部区域。如果两个区域重叠,则会绘制交叉区域的顶点。...下面是一个示例,展示了如何使用CloseFigure来创建一个简单的封闭路径:GraphicsPath path = new GraphicsPath();path.AddLine(10, 10, 50...CloseAllFigures是其中的一个方法,它的作用是关闭所有的子路径,使其成为一个完整的图形路径。

    31921

    Unity基础教程系列——对象管理(二)对象多样化(Fabricating Shapes)

    就像位置、旋转和缩放一样,我们将在玩家每次生成一个新形状随机创建形状。 1.1 形状类 我们需要具体说明游戏会生成什么样的东西。游戏本身只会产生形状,而不是通常的可持久化对象。...此类就像工厂一样,按需创建形状,而其用户不必知道如何制作这些形状,甚至不必知道有多少种不同的选择。我们将此类命名为ShapeFactory。 ? 工厂的唯一责任是交付形状实例。...(Game现在用factory代替预制件) 在给游戏提供我们工厂的引用之后,它现在将在每次玩家生成新的形状时创建随机形状,而不是总是获得立方体。 ?...4.1 形状颜色 为Shape添加SetColor方法,使其能够调整其颜色。当然,调整的它所使用的材质的颜色属性。 ? 为了保存和加载形状的颜色,它必须能够追踪到它。...4.3 选择形状颜色 要创建任意颜色的形状,只需在Game.CreateShape中的新实例上调用SetColor。我们可以用随机。ColorHVS方法生成随机颜色。

    1.8K10

    每日学术速递6.23

    Infinigen 完全是程序化的:从形状到纹理的每项资产都是通过随机数学规则从头开始生成的,不使用外部源允许无限变化和组合。...给定一系列相机图像、本体感受机器人状态和过去的动作,我们将交错序列编码为标记,屏蔽掉随机子集,训练模型来预测屏蔽掉的内容。...我们假设,如果机器人能够预测缺失的内容,它就已经获得了一个能够使其行动的物理世界的良好模型。...具体来说,我们鼓励实体的注意力图与其修饰词之间有较大的重叠,而与其他实体和修饰词的注意力图则有较小的重叠。损失在推理过程中得到优化,无需重新训练或微调模型。...这项工作强调了在推理过程中如何利用句子结构可以有效且显着地提高文本到图像生成的可信度。

    20110

    一种用于三维物体建模的精确、鲁棒的距离图像配准算法

    所有的输入范围图像在形状增长过程中迭代登记录,并进行广泛的实验来测试算法的性能。本文提出的两两配准算法对小的重叠区域、噪音和变化的网格分辨率具有较高的准确性和鲁棒性,提出的多视图配准算法也非常准确。...第一个任务是恢复输入范围图像之间的重叠信息,第二个任务是在任意两个重叠的范围图像之间计算刚性变换,首先将基于自旋图像的两两粗配准算法应用于所有对范围图像,构造了一种基于自旋图像的粗糙配准算法模型图,然后在这个图中搜索生成树...,它是姿态一致的全局表面一致的,最后利用该生成树对多视点范围图像进行配准。...然后检测一组特征点,使用之前提出的RoPS特征描述符来表示这些点为了检测独特的、可重复的特征点,网格首先被简化为低分辨率网格中最接近的顶点作为候选点。这些候选点然后被分辨率控制技术过滤去冗余点。...由于基于随机子抽样和均匀子抽样的ICP算法有一个非常相似的配准性能。 ? 图2 形状成长过程的图解。(a)种子的形状。(b)输入网格,其中红色点表示将要被更新到种子形状的点。(c)更新后的形状

    85120

    边框检测在 Python 中的应用

    以下是一个简单的示例代码,演示如何在Python中使用OpenCV进行边框检测:1、问题背景:用户试图编写一个程序,该程序要求用户输入一个数字,然后在屏幕上绘制相应数量的矩形。然而,这些矩形不能重叠。...2、解决方案:为了解决这个问题,有几种方法可以尝试:方法 1:随机放置矩形并进行测试这种方法会随机放置矩形,然后测试新矩形的任何点是否在任何现有矩形内。如果有重叠,则继续生成矩形,直到不再有重叠。...方法 2:限制随机范围这种方法可以对随机值进行编号,以便只在可用的位置生成矩形。这可以以多种方式实现,可能需要一些时间和精力来实现。...,并在它们不重叠的情况下随机放置它们。...最后,所有生成的矩形都会被绘制到游戏窗口中。边框检测在图像处理、目标检测和计算机视觉领域有着广泛的应用,能够帮助识别物体的形状、边界和结构。通过使用OpenCV库,可以方便地实现边框检测功能。

    19510
    领券