[游戏开发]Unity中随机位置_在圆/椭圆/三角形/多边形/内随机一个点

news2024/12/24 2:45:27

[ 目录 ]

  • 0. 前言
  • 1. 矩形内随机
  • 2. 圆形内随机
  • 3. 三角形内随机
  • 4. 多边形内随机
    • (1)多边形分割为三角形
    • (2)三角形面积计算
    • (3)数据缓存
    • (4)按权重随机
    • (5)实现随机
  • 5. 随机点测试
  • 6. 拒绝采样随机
  • 7. 拒绝采样样例
    • (1)椭圆内随机
    • (2)多边形内随机
    • (3)效果
    • (4)点是否三角形/圆形内
  • 8. 结束咯

0. 前言

在做游戏的时候经常需要随机某一个点,而且形状各种各样,每次要随机的时候就容易忘记怎么弄了。这里总结一下各种常见形状内基础随机方式。

1. 矩形内随机

略~

/// <summary>
/// 在矩形区域内随机一个点
/// </summary>
public static Vector2 InRect(Rect rect)
{
    Vector2 pos = new Vector2();
    pos.x = Random.Range(0, rect.width) + rect.x;
    pos.y = Random.Range(0, rect.height) + rect.y;
    return pos;
}

2. 圆形内随机

圆形随机一般有两种。一种是通过极坐标来随机,另一种是先正常随机矩形在判断点是否在圆形内。第二种其实使用的范围很广,我们后面在 “ 6.拒绝采样随机 ” 单独讲,这里我们先讲第一种。

圆形通过极坐标随机就比较简单,分别随机半径和角度。不过直接随机的情况下,概率是不均匀的。也比较容易理解,比如随机到半径为1和为2的圆大小是不一样大的,但是其享受的概率是一样的,所以呢,会出现圆中心概率更高的情况。这个时候只要在[0,r*r]的范围内进行随机再sqrt开方就可以了,就可以弥补这个概率,具体推导可以用换元法试试。这里放一下代码

public struct Circle
{
    public Vector2 center;
    public float radius;

    public Circle(Vector2 center, float radius)
    {
        this.center = center;
        this.radius = radius;
    }
}
/// <summary>
/// 在圆形区域内随机一个点
/// </summary>
public static Vector2 InCircle(Circle circle)
{
    //  通过极坐标来随机
    float r = Mathf.Sqrt(Random.Range(0, circle.radius));
    float angle = Random.Range(0, Mathf.PI * 2);
    Vector2 pos = new Vector2(Mathf.Cos(angle) * r, Mathf.Sin(angle) * r);
    pos += circle.center;
    return pos;
}

至于从直角坐标的角度,先随机x,然后获取y的范围进行随机也会有概率不均匀的问题,具体处理还得重新推导,这里就不再研究了。

3. 三角形内随机

三角形随机意外要麻烦得多。简单讲一种思路。我们可以先随机三角形的一条边上的高,随机这个高度并再这个高度的情况下,去随机平行边的长度。

比如下图,我们先随机h再随机r的情况来得到点p。
在这里插入图片描述
那么在这种情况下也是会有概论不均衡的问题的,不过这里我们可以发现,因为做的是平行线的缘故,h和得到的平行线是等比放大和缩小的,所以可以用类似于圆的方式来随机。不过实现起来好麻烦呀,太难了,对于已经毕业的人来说,数学太难了。

这里我找到的了一种类似的方法,非常简单,具体论证如果有想了解的话,大家看一下后面链接吧。
在这里插入图片描述
那么实现代码就是这样的。

public struct Triangle
{
    public Vector2 a;
    public Vector2 b;
    public Vector2 c;

    public Triangle(Vector2 a, Vector2 b, Vector2 c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}
/// <summary>
/// 在三角形区域内随机一个点
/// </summary>
public static Vector2 InTriangle(Triangle triangle)
{
    // Vector2 a, Vector2 b, Vector2 c
    Vector2 pos = new Vector2();
    float r1 = Random.Range(0f, 1f);
    float r2 = Random.Range(0f, 1f);
    pos = (1 - Mathf.Sqrt(r1)) * triangle.a +
        Mathf.Sqrt(r1) * (1 - r2) * triangle.b +
        Mathf.Sqrt(r1) * r2 * triangle.c;
    return pos;
}

4. 多边形内随机

多边形随机可以先把多边形分解为三角形,然后再根据三角形的面积分配不同的权重,随机一个三角形,然后在该三角形内进行随机。所以这个问题,又可以分解为以下几个点。

  • 多边形分隔为三角形
  • 三角形面积计算
  • 按权重随机
  • 三角形内随机一点

这样的方法其实流程颇为麻烦, 另一种方法是,像刚刚提及的一样,先矩形简单随机再判断是否在多边形内来达到随机目的,这个还是在 “6.拒绝采样随机” ,进行详细介绍。

那接下来就依次处理一下刚刚的问题。

(1)多边形分割为三角形

关于第一点其实还挺麻烦的,具体怎么分割为三角形有挺多不同的方法,耳切法是一种目前我能查到的一种常见方法,具体内容之前也有讲过,链接如下,实在太长这里就不展开解释了。

https://blog.csdn.net/Blue_carrot_/article/details/131192660

(2)三角形面积计算

这里用的是公式直接去计算就可以了,S=√[p(p-l1)(p-l2)(p-l3)](p为半周长),又解决咯。

/// <summary>
/// 获取三角形面积
/// </summary>
/// <returns></returns>
public float Area()
{
    //  S=√[p(p-l1)(p-l2)(p-l3)](p为半周长)
    float l1 = (b - a).magnitude;
    float l2 = (c - b).magnitude;
    float l3 = (a - c).magnitude;
    float p = (l1 + l2 + l3) * 0.5f;
    return Mathf.Sqrt(p * (p - l1) * (p - l2) * (p - l3));
}

(3)数据缓存

其实到这里我们可以发现,这种情况下要随机一个多边形的操作还是非常麻烦的。但是包括划分为三角形,计算三角形面积,这些其实都是可以把数据缓存下来的,这样下次还是可以接着用,就会快非常多。那么我们可以定义数据结构如下。

public struct PolygonRandomData
{
    public Polygon polygon;
    public Triangle[] triangles;
    public float polygonArea;
    public float[] trianglesArea;

    public PolygonRandomData(Polygon polygon)
    {
        // 三角化
        this.polygon = polygon;
        triangles = polygon.Triangulate();

        // 计算面积
        float area;
        trianglesArea = new float[triangles.Length];
        polygonArea = 0;
        for (int i = 0; i < triangles.Length; i++)
        {
            area = triangles[i].Area();
            polygonArea += area;
            trianglesArea[i] = area;
        }
    }
}

如果需要重复随机的话就可以先把这些数据缓存一下,降低开销。

(4)按权重随机

权重随机,目前做法就是先从0到权重和随机一个数,然后遍历叠加,去判断到达了没,以此达到目的。代码如下,权重和这里是由外部提供 ,因为我们刚刚其实也以及已经把面积和计算好了,就不用再计算一次。

/// <summary>
/// 按照数组内数的非负数权重,获取随机的索引。
/// 如果数组为空或者长度为0,将返回-1。
/// </summary>
/// <param name="weightArr">权重数组,应为非负数</param>
/// <param name="weightSum">给定的权重和,应为weightArr的权重之和</param>
/// <returns></returns>
public static int IndexInWeightArr(float[] weightArr, float weightSum)
{
    int index = -1;
    float cur = Random.Range(0, Mathf.Max(0, weightSum));
    float sum = 0;
    if (weightArr != null && weightArr.Length > 0)
    {
        index = 0;
        for (; index < weightArr.Length; index++)
        {
            sum += weightArr[index];
            if (sum > cur)
            {
                break;
            }
        }
        if (index >= weightArr.Length)
        {
            index = weightArr.Length - 1;
        }
    }
    return index;
}

下面是只提供权重数组的方法。

/// <summary>
/// 按照数组内数的非负数权重,获取随机的索引。
/// 如果数组为空或者长度为0,将返回-1。
/// </summary>
/// <param name="weightArr">权重数组,应为非负数</param>
/// <returns></returns>
public static int IndexInWeightArr(float[] weightArr)
{
    float weightSum = ArrayMathF.Sum(weightArr);
    return IndexInWeightArr(weightArr, weightSum);
}
public static float Sum<T>(T arr) where T : IEnumerable<float>
{
    float sum = 0;
    if (arr != null)
    {
        foreach (var value in arr)
        {
            sum += value;
        }
    }
    return sum;
}

(5)实现随机

至于三角形内随机,我们在前面已经解决了,此时就可以实现这个多边形随机了,如下!

 /// <summary>
/// 在多边形区域内内随机一个点
/// </summary>
public static Vector2 InPolygon(Polygon polygon, Vector2 defaultValue)
{
    return InPolygon(new PolygonRandomData(polygon), defaultValue);
}

/// <summary>
/// 在多边形区域内内随机一个点,polygonData为多边形三角化相关数据
/// </summary>
public static Vector2 InPolygon(PolygonRandomData polygonData, Vector2 defaultValue)
{
    Vector2 pos = defaultValue;
    int index = IndexInWeightArr(polygonData.trianglesArea, polygonData.polygonArea);
    if (index != -1)
    {
        pos = InTriangle(polygonData.triangles[index]);
    }
    return pos;
}

这里用了defaultValue主要是考虑到,多边形可能为非简单多边形,比如边有交叉或者点少于3个这种情况,会有分割三角形失败的问题,所以使用了这个值来可以提供后续识别或者保护处理。

5. 随机点测试

前面也列举的了挺多情况,这里先简单测试一下随机效果。每个图形绘制为红色,其中每个图形随机500点,画为绿色,测试结果如下。
在这里插入图片描述
可以看出也是随机点的分布还是比较均匀的,效果还可以。

6. 拒绝采样随机

终于到了这个环节。通常我们会有很多奇奇怪怪的形状,没办法具体来形容或者很难去推断去随机方法,甚至还有新的还有额外的条件。那么这个时候我们就可以用到拒绝采样的这样一种方式了。这种方式就是为了从一个简单的概率分布得到一个复杂的概率分布。

比如,我们想要随机一个圆内的点,我们先在矩形内随机,然后判断是否在圆形内,如果不在就拒绝,然后重新随机一下。这样我们就可以得到一个分布均匀的圆啦。这个过程就是拒绝采样了,那么程序上实现的话可以如下:

/// <summary>
/// 拒绝采样,在矩形区域内随机一个符合条件的点
/// </summary>
/// <param name="rect"></param>
/// <param name="judgeFunc"></param>
/// <returns></returns>
public static Vector2 RejectSampling(Rect rect, System.Func<Vector2, bool> judgeFunc)
{
    return RejectSampling(rect, judgeFunc, Vector2.zero, -1);
}

/// <summary>
/// 拒绝采样,在矩形区域内随机一个点,并判断是否符合条件,不符合再次随机
/// </summary>
/// <param name="rect">范围</param>
/// <param name="judgeFunc">判断条件</param>
/// <param name="defaultValue">失败返回坐标</param>
/// <param name="maxRandomTime">最大尝试次数,当 maxRandomTime <= 0 时,将无限尝试直到要求被满足</param>
/// <returns></returns>        
public static Vector2 RejectSampling(Rect rect, System.Func<Vector2, bool> judgeFunc, Vector2 defaultValue, int maxRandomTime)
{
    Vector2 pos;
    for (; maxRandomTime != 0; maxRandomTime--)
    {
        pos = InRect(rect);
        if (judgeFunc(pos))
        {
            return pos;
        }
    }
    return defaultValue;
}

这里会发现我其实给了额外的停止条件,因为在程序中不断循环是有风险的,如果万一这个条件是不可能在范围内达到的,到时候就直接死循环了,所以给定一个范围来提供保护还是挺有用的。

至于判断条件用的是委托的方式,注意了委托在创建的时候会有额外的开销,但正常传值调用的开销是和正常函数差不多的。所以不用过于担心,如果要多次随机,可以把委托先保存一下。

7. 拒绝采样样例

这里测试一下拒绝采样的效果,其实做拒绝采样随机的步骤就可以变化为两步

  • 确定随机范围,获取外包裹矩形
  • 确定随机条件,判断点是否在形状内

下面我们用两个比较麻烦的图形,椭圆和多边形来做这个拒绝采样处理试试。

(1)椭圆内随机

椭圆内随机一点,变成椭圆外包裹矩形判断是否在椭圆内,这个都比较简单,就直接代码咯

public struct Ellipse
{
    public Vector2 center;
    public float a;
    public float b;

    public Ellipse(Vector2 center, float a, float b)
    {
        this.center = center;
        this.a = a;
        this.b = b;
    }

    public Rect OutsideRect()
    {
        Vector2 size = new Vector2(a, b);
        return new Rect(center - size, size * 2);
    }

    public bool Inside(Vector2 pos)
    {
        pos -= center;
        return pos.x * pos.x / (a * a) + pos.y * pos.y / (b * b) < 1;
    }
}

那么获得者两个条件后,就可以开始随机了,如下就可以得到椭圆的点了

System.Func<Vector2, bool> judgeFunc = ellipse.Inside;
Rect ellipseOutsideRect = ellipse.OutsideRect();
Vector2 pos = RandomU.RejectSampling(ellipseOutsideRect, judgeFunc, Vector2.zero, 100);

(2)多边形内随机

判断多边形的外包裹矩形,就可以直接遍历所有点,找出xmin,xmax,ymin,ymax就可以得到这个矩形了,代码如下

public Rect OutsideRect()
{
    if (points.Length <= 0)
    {
        return new Rect(0, 0, 0, 0);
    }
    Vector2 min = points[0];
    Vector2 max = points[0];
    for (int i = 0; i < points.Length; i++)
    {
        max.x = Mathf.Max(points[i].x, max.x);
        max.y = Mathf.Max(points[i].y, max.y);
        min.x = Mathf.Min(points[i].x, min.x);
        min.y = Mathf.Min(points[i].y, min.y);
    }
    return new Rect(min, max - min);
}

判断点是否在多边形内部(点如果在多边形边上,也不属于内部),方法就有很多了,这里用的是做射线判断交点的方法,可以看下图。
在这里插入图片描述
A点在多边形外做射线的交点都会是偶数个,而B点在多边形内做射线交点为奇数个,就可以作为我们判断的依据。而且一般会用水平右方向的射线,比较容易理解和计算。需要考虑特殊情况就是如果多边形的点在射线上的情况,可不可以判断为相交?如下图。
在这里插入图片描述
这里的CDF点都会有不同情况的交点表现,这里就可以做其他限制。

  • 对于边的线段有端点在射线上的情况(如F,D),只考虑下端点(记为N),忽视上端点(记为M)。就是N在射线上,交点数量+1,M在不在射线上都不考虑为交点。(这里上下端点相反过来也是一样效果)。
  • 对于边的射线都在端点上的情况,视为无交点。

在加上这个两个处理后,再去数交点的数量,是不是就可以满足之前提出的交点数奇偶判断在不在多边形内?大家可以试一下。那么代码就如下了。

/// <summary>
/// 点是否在多边形(在边上视为在多边外)
/// </summary>
/// <param name="pos"></param>
/// <returns></returns>
public bool Inside(Vector2 pos)
{
    int j = points.Length - 1;
    bool inside = false;
    Vector2 pi, pj;
    for (int i = 0; i < points.Length; i++)
    {
        pi = points[i];
        pj = points[j];
        j = i;
        // 水平右方向射线,看交点个数
        if ((
            // 点的y值是否在两点之间,区间只选一边,
            // 这样每个就只会算一次,避免当有点在射线上的干扰
            (pi.y <= pos.y && pos.y < pj.y) || (pj.y <= pos.y && pos.y < pi.y)) &&
            // x轴截距
            pos.x < (pj.x - pi.x) * (pos.y - pi.y) / (pj.y - pi.y) + pi.x)
        {
            inside = !inside;
        }
    }
    return inside;
}

(3)效果

对于上述的两个形状来试试效果,还挺均匀的。效率问题其实也还好,因为其实随机到图形内的这个情况还是概率比较高的,重复几次基本就随机到了。
在这里插入图片描述

(4)点是否三角形/圆形内

其他图形用这个方法也是大同小异,这里就再简单列举一下其他图形如何判断点是否在形状内。
三角形:

/// <summary>
/// 是否在三角形内
/// </summary>
/// <returns></returns>
public bool Inside(Vector2 pos)
{
    Vector3 pa = a - pos;
    Vector3 pb = b - pos;
    Vector3 pc = c - pos;
    Vector3 pab = Vector3.Cross(pa, pb);
    Vector3 pbc = Vector3.Cross(pb, pc);
    Vector3 pca = Vector3.Cross(pc, pa);
    float d1 = Vector3.Dot(pab, pbc);
    float d2 = Vector3.Dot(pab, pca);
    float d3 = Vector3.Dot(pbc, pca);
    return d1 > 0 && d2 > 0 && d3 > 0;
}

圆形:

/// <summary>
/// 是否在圆形内
/// </summary>
/// <returns></returns>
public bool Inside(Vector2 pos)
{
    pos -= center;
    return pos.x * pos.x + pos.y * pos.y < radius * radius;
}

8. 结束咯

到这里就结束咯,希望能够对游戏中进行随机处理,起到参考作用~

相关参考文章
三角形内随机处理
http://www.cs.princeton.edu/~funk/tog02.pdf
https://www.jianshu.com/p/36fa431311ac
不规则、三角形面积计算
https://blog.csdn.net/n_moling/article/details/115381804
Unity3d判断一个点是否在多边形内
https://blog.csdn.net/zouxin_88/article/details/109678109

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

理论【8】TCPUDP彻底搞懂了吗?

1 概述 对于TCP协议和UDP协议&#xff0c;大家应该都有所耳闻。TCP协议和UDP协议都工作在传输层&#xff0c;他们的目标都是在应用之间传输数据。我们常用的网络通信&#xff0c;比如浏览网页、查看邮件、电话通信等&#xff0c;都是通过这两种协议来进行数据传输的。 2 TCP…

面试---如何发现Redis热点Key,有哪些解决方案?

目录 热点问题概述热点问题的危害常见解决方案阿里云数据库解热点之道热点key的处理两种方案对比总结 热点问题概述 产生原因 热点问题产生的原因大致有以下两种&#xff1a; 用户消费的数据远大于生产的数据&#xff08;热卖商品、热点新闻、热点评论、明星直播&#xff09;…

【AI绘画】本地部署Stable Diffusion Web UI

近几年AI发展迅猛&#xff0c;今年更是大爆发&#xff0c;除了爆火的大模型ChatGPT以外&#xff0c;AI绘画也有很大的进步&#xff0c;目前&#xff0c;Stable Diffusion图像生成效果相当惊人&#xff0c;可以生成逼真的人像、风景、物品图片&#xff0c;还可以将图片转换为不同…

提示学习soft prompt浅尝,启发了p-tuing

一、前言 在高质量标注数据稀缺的工业界来说&#xff0c;少样本学习或者零样本学习的方法特别受欢迎&#xff0c;后面出现过一些少样本和零样本的方法&#xff0c;例如对比学习和prompt等&#xff0c;主流prompt的工作分为离散型和连续型模板。离散型主要还是插入bert特殊的tok…

分享AI绘画的方法

曾经&#xff0c;在一个神奇的编程国度里&#xff0c;住着一个名叫小花的程序员。小花喜欢创造和探索新奇的技术&#xff0c;她有一个惊人的能力&#xff1a;她能够根据文字生成相应的图片。这项技术让她成为了这个国度里的传奇人物。人们纷纷向她寻求帮助&#xff0c;希望能够…

flutter:网络请求、json数据转为Model

参考 老孟 flutter&#xff1a; 网络请求-dio http http 是一个可组合&#xff0c;基于Future的库&#xff0c;用于HTTP请求。该软件包包含高级功能和类&#xff0c;可轻松使用HTTP资源。它是多平台的&#xff0c;并且支持移动设备&#xff0c;台式机和浏览器。此软件包为官…

STM32F1x固件库函数学习笔记(一)

文章目录 一、基础知识1、什么是STM322、STM32诞生背景3、STM32分类4、STM32F1X系列命名规则5、STM32F103C8T6最小系统 二、STM32固件库1、初始固件库&#xff08;1&#xff09;51单片机的寄存器&#xff08;2&#xff09;STC8A通过库函数方式实现LED闪烁&#xff08;3&#xf…

Spark入门(二)

2.3 Standalone模式 Standalone模式是Spark自带的资源调度引擎&#xff0c;构建一个由Master Worker构成的Spark集群&#xff0c;Spark运行在集群中。 这个Standalone区别于Hadoop的。这里的Standalone是指只用Spark来搭建一个集群&#xff0c;不需要借助其他框架。 2.3.1集…

充能书单|618,买什么都不如买知识!

前言 “IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台&#xff0c;致力于帮助读者在广义的IT领域里&#xff0c;掌握更专业、更实用的知识与技能&#xff0c;快速提升职场竞争力。 点击蓝色微信名可快速关注我们。 一年一度的618又到啦&#xff01;今年的618就不要乱买…

【Linux】MySQL数据库 (二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MySQL数据库 数据表高级操作克隆表&#xff0c;将数据表的数据记录生成到新的表中清空表&#xff0c;删除表内的所有数据创建临时表创建外键约束&#xff0c;保证数据的完整性…

【计算机网络】第一章 概述(下)

文章目录 第一章 概述1.5 计算机网络的性能指标1.5.1 速率1.5.2 带宽1.5.3 吞吐量1.5.4 时延 1.6 计算机网络体系结构1.6.1 常见的体系结构1.6.2 分层的必要性1.6.4 体系结构中的专用术语 1.8 习题 第一章 概述 1.5 计算机网络的性能指标 常用的 计算机网络 的性能指标有以下 …

ECC算法学习(一)算法公式

ECC 一、ECC简介优缺点运用 二、算法理论基础1. 椭圆曲线的加法2. 椭圆曲线的二倍运算3. 同余运算4. 有限域5. 乘法逆元 三、算法公式1、有限域的负元2、有限域的加法&#xff0c; P Q P Q PQ3. 斜率计算&#xff08;PQ即要计算P点切线&#xff0c;需要求导&#xff09;4. 椭…

chatgpt赋能python:PYTHON如何进行累乘操作?

PYTHON如何进行累乘操作&#xff1f; 在PYTHON编程中&#xff0c;累乘操作是指不断地将一个给定数字序列中的数字相乘的过程。这个操作在数学中也被称为阶乘&#xff0c;通常用符号“!”来表示。 在PYTHON中&#xff0c;进行累乘操作的方法主要有两种&#xff1a;使用循环实现…

Java实现TestNg+ExtentReport实现接口测试,并生成测试报告

一 在pom.xml文件中引入TestNg以及ExtentReport包 <dependencies> <!--testNg引入--> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.9.10</version> </de…

学习css样式的第二章

1.CSS 布局 - display 属性 display 属性是用于控制布局的最重要的 CSS 属性。 display 属性 display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline 块级元素…

chatgpt赋能python:Python编程:如何粘贴代码

Python编程&#xff1a;如何粘贴代码 在Python编程过程中&#xff0c;粘贴代码是一个非常普遍的操作。不幸的是&#xff0c;许多初学者并不知道如何正确地粘贴代码&#xff0c;这可能会导致一些常见的错误和问题。本文将介绍如何正确地粘贴代码以及一些常见的问题和解决方案。…

Wise 的平台工程 KPI 探索之旅

作者&#xff5c;Lambros Charissis 翻译&#xff5c;Seal软件 链接&#xff5c;https://medium.com/wise-engineering/platform-engineering-kpis-6a3215f0ee14 平台即产品&#xff08;PaaP&#xff09;已经成为软件企业构建内部平台的一种流行方式。在众多软件公司争夺市场份…

地球物理专业毕业生毕业后能干高性能计算工程师吗?

很多高校都开设有地球物理专业&#xff0c;但是很多身为地球物理专业的毕业生&#xff0c;很多同学却不清楚以后能做什么工作&#xff0c;做什么工作有前景&#xff0c;十分迷茫。在这里&#xff0c;我们有很多从事高性能计算领域的前地球物理专业学长现身说法——地球物理专业…

Qt弱加密漏洞分析

0x00 漏洞背景 Qt是一个跨平台的C应用程序开发框架&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;应用程序、命令行工具、嵌入式系统和网络应用等各种类型的应用。 Qt框架包含的Qt Network&#xff08;网络模块&#xff09;&#xff0c;提供了QNetworkAccessM…

Vue中如何进行游戏开发与游戏引擎集成?

Vue中如何进行游戏开发与游戏引擎集成&#xff1f; Vue.js是一款流行的JavaScript框架&#xff0c;它的MVVM模式和组件化开发思想非常适合构建Web应用程序。但是&#xff0c;如果我们想要开发Web游戏&#xff0c;Vue.js并不是最合适的选择。在本文中&#xff0c;我们将介绍如何…