4、Unity【基础】画线功能Linerenderer、物理系统Physics

news2025/2/26 19:10:29

在这里插入图片描述

文章目录

  • 画线功能Linerenderer
    • 1、LineRenderer是什么
    • 2、LineRender参数相关
    • 3、LineRender代码相关
      • 思考1 请写一个方法,传入一个中心点,传入一个半径,用LineRender画个圆出来
      • 思考2 在Game窗口长按鼠标用LineRender画出鼠标移动的轨迹
  • 核心系统
    • 1、物理系统之范围检测
      • 回顾:物理系统之碰撞检测
      • 什么是范围检测
      • 如何进行范围检测
        • 必备条件
        • 范围检测API
          • 1.盒状范围检测
          • 2.球形范围检测
          • 3.胶囊范围检测
        • 总结
        • 思考 范围检测
    • 2、物理系统之射线检测
      • 1、什么是射线检测
      • 2、射线对象
      • 3、碰撞检测函数
      • 4、使用时注意的问题
      • 思考1 子弹射击到物体效果
      • 思考2 控制场景物体

画线功能Linerenderer

1、LineRenderer是什么

LineRenderer是Unity提供的一个用于画线的组件
使用它我们可以在场景中绘制线段
一般可以用于
1、绘制攻击范围 2、武器红外线 3、辅助功能 4、其它画线功能

2、LineRender参数相关

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3、LineRender代码相关

private Material m;
void Start()
{
    //动态添加一个线段
    GameObject line = new GameObject();
    line.name = "line";
    LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
    //首尾相连
    lineRenderer.loop = true;
    //开始结束宽
    lineRenderer.startWidth = 0.02f;
    lineRenderer.endWidth = 0.02f;
    //开始结束颜色
    lineRenderer.startColor = Color.white;
    lineRenderer.endColor = Color.red;
    //设置材质
    m = Resources.Load<Material>("M");
    lineRenderer.material = m;
    //设置点的数量
    lineRenderer.positionCount = 4;
    lineRenderer.SetPositions(new Vector3[] { new Vector3(0, 0, 0),
    new Vector3(0, 0, 5),new Vector3(5, 0, 5)}); //批量设置
    lineRenderer.SetPosition(3, new Vector3(5, 0, 0)); //索引设置
    //是否使用世界坐标系
    //决定了是否随对象移动而移动
    lineRenderer.useWorldSpace = true;
    //让线段受光影响会接受光数据进行着色器计算
    lineRenderer.generateLightingData = true;
}

思考1 请写一个方法,传入一个中心点,传入一个半径,用LineRender画个圆出来

using UnityEngine;

public class CicleLine : MonoBehaviour
{
    void Start()
    {
        DrawCicleLine(Vector3.zero, 5, 360);
    }
    public void DrawCicleLine(Vector3 centerPos, float r, int pointNum)
    {
        //画线对象
        GameObject obj = new GameObject();
        obj.name = "R";
        LineRenderer cicleLine = obj.AddComponent<LineRenderer>();
        cicleLine.loop = true;
        //设置点
        cicleLine.positionCount = pointNum;
        //圆的单位弧度
        float angle = 360f / pointNum;
        //画圆
        for (int i = 0; i < pointNum; i++)
        {
            cicleLine.SetPosition(i, centerPos + Quaternion.AngleAxis(angle * i, Vector3.up) * Vector3.forward * r);
        }
    }
}

思考2 在Game窗口长按鼠标用LineRender画出鼠标移动的轨迹

using UnityEngine;

public class MouseLine : MonoBehaviour
{
    private LineRenderer DrawLine;
    //为了设置画线位置的横截面(距离)
    private Vector3 nowMousePos;
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            GameObject obj = new GameObject();
            DrawLine = obj.AddComponent<LineRenderer>();
            DrawLine.loop = false;
            DrawLine.startWidth = 0.5f;
            DrawLine.endWidth = 0.5f;
            DrawLine.positionCount = 0;
        }
        if (Input.GetMouseButton(0))
        {
            DrawLine.positionCount += 1;
            //得到鼠标的屏幕坐标转世界坐标的点位置
            //新加点为最后一个点
            //1、得到鼠标位置
            //Input.mousePosition
            //2、鼠标屏幕坐标转世界坐标
            //Camera.main.ScreenToWorldPoint(Input.mousePosition);
            nowMousePos = Input.mousePosition;
            nowMousePos.z = 10;
            DrawLine.SetPosition(DrawLine.positionCount-1, Camera.main.ScreenToWorldPoint(nowMousePos));
        }
    }
}

核心系统

在这里插入图片描述

1、物理系统之范围检测

回顾:物理系统之碰撞检测

碰撞产生的必要条件
1.至少一个物体有刚体
2.两个物体都必须有碰撞器
    
碰撞和触发
碰撞会产生实际的物理效果
触发看起来不会产生碰撞但是可以通过函数监听触发
碰撞检测主要用于实体物体之间产生物理效果时使用

什么是范围检测

游戏中瞬时的攻击范围判断一般会使用范围检测
没有实体物体只想要检测在指定某一范围是否让敌方受到伤害时便可以使用范围判断
在指定位置进行范围判断,我们可以得到处于指定范围内的对象
目的是对对象进行处理,比如受伤减血等

如何进行范围检测

必备条件
必备条件:想要被范围检测到的对象必须【具备碰撞器】
注意点:
1.范围检测相关API:只有当执行该代码时,进行一次范围检测,它是瞬时的
2.范围检测相关API:并不会真正产生一个碰撞器,只是碰撞判断计算而已
范围检测API
1.盒状范围检测
范围检测API
1.盒状范围检测
参数一:立方体中心点
参数二:立方体三边大小
参数三:立方体角度
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
    
重要知识点:关于层级
通过名字得到层级编号LayerMask.NameToLayer 我们需要通过编号左移构建二进制数
这样每一个编号的层级都是对应位为12进制数
我们通过位运算可以选择想要检测层级
好处一个int就可以表示所有想要检测的层级信息
    
    Collider[] colliders = Physics.OverlapBox(Vector3.zero, Vector3.one,
        Quaternion.AngleAxis(45, Vector3.up),
        1 << LayerMask.NameToLayer("UI"),
        QueryTriggerInteraction.UseGlobal);
    for (int i = 0; i < colliders.Length; i++)
    {
        print(colliders[i].gameObject.name);
    }
    
参数四的层级编号是0~31刚好32位是一个int数
每一个编号代表的都是二进制的一位
例如:
    0000 0001 左移5: 1 << 5
    0010 0000
    
另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储
	if (Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders) != 0){}
2.球形范围检测
2.球形范围检测
参数一:中心点
参数二:球半径
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
    Physics.OverlapSphere(Vector3.zero,3,1<<LayerMask.NameToLayer("UI"));

另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储
    if (Physics.OverlapSphereNonAlloc(Vector3.zero, 3, colliders) != 0){}
3.胶囊范围检测
3.胶囊范围检测
参数一:半圆中心点
参数二:半圆二中心点
参数三:半圆半径
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:在该范围内的触发器(得到了对象触发器就可以得到对象的所有信息)
    Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << LayerMask.NameToLayer("UI"), 
                           QueryTriggerInteraction.UseGlobal);

另一个API
可以判断有无触发碰撞器
返回值:碰撞到的碰撞器数量
参数:传入一个数组进行存储
    if (Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, colliders) != 0){}
总结
范围检测主要用于瞬时的碰撞范围检测
主要掌握
Physics类中的静态方法
球形、盒装、胶囊三种API的使用即可
思考 范围检测
世界坐标原点有一个立方体,键盘WASD键可以控制其前后移动和旋转
请结合所学知识实现
1.按J键在立方体面朝向前方1米处进行立方体范围检测
2.按K键在立方体前面5米范围内进行胶囊范围检测
3.按L键以立方体脚下为原点,半径10米内进行球形范围检测

using UnityEngine;

public class RangeSensing : MonoBehaviour
{
    public float moveSpeed = 8;
    public float rotateSpeed = 30;
    void Update()
    {
        transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed * Input.GetAxis("Vertical"));
        transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);

        if (Input.GetKeyDown(KeyCode.J))
        {
            Collider[] colliders = Physics.OverlapBox(transform.position + transform.forward,
                                                        Vector3.one * 0.5f, //此处为边长的一半
                                                        transform.rotation, //面朝向角度
                                                        1 << LayerMask.NameToLayer("Monster"));
            for (int i = 0; i < colliders.Length; i++)
            {
                print(colliders[i].gameObject.name + "受到伤害");
            }
        }

        if (Input.GetKeyDown(KeyCode.K))
        {
            Collider[] colliders = Physics.OverlapCapsule(transform.position,
                                            transform.position + transform.forward * 5,
                                            0.5f,
                                            1<<LayerMask.NameToLayer("Monster"));
            for (int i = 0; i < colliders.Length; i++)
            {
                print(colliders[i].gameObject.name + "受到伤害");
            }
        }

        if (Input.GetKeyDown(KeyCode.L))
        {
            Collider[] colliders = Physics.OverlapSphere(transform.position, 10, 1 << LayerMask.NameToLayer("Monster"));
            for (int i = 0; i < colliders.Length; i++)
            {
                print(colliders[i].gameObject.name + "受到伤害");
            }
        }
    }
}

2、物理系统之射线检测

在这里插入图片描述

在这里插入图片描述

1、什么是射线检测

物理系统中
目前我们学习的物体相交判断
1.碰撞检测的必备条件 
	1刚体 2碰撞器
2.范围检测的必备条件
	碰撞器
	
如果想要做这样的撞检测呢
1.鼠标选择场景上一物体
2.FPS射击游戏(无弹道-不产生实际的子弹对象进行移动)
等等需要判断一条线和物体的碰撞情况
射线检测就是来解决这些问题的
它可以在指定点发射一个指定方向的射线
判断该射线与哪些碰撞器相交,得到对应对象

2、射线对象

13D世界中的射线假设有一条
起点为坐标(1,0,0)
方向为世界坐标Z轴正方向的射线
注意:
理解参数含义
参数一:起点
参数二:方向向量(一定记住不是两点决定射线方向,第二个参数直接就代表方向向量)
	Ray ray = new Ray(Vector3.right,Vector3.forward);
Ray中的参数
    ray.origin; //起点
    ray.direction; //方向
    
2,摄像象机发射出的射线
得到一条从屏幕位置作为起点
摄像机视口方向为方向的射线
	Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);
	
注意
单独的射线对于我们来说没有实际的意义
我们需要用它结合物理系统进行射线碰撞判断

3、碰撞检测函数

Physics类中提供了很多进行射线检测的静态函数
它们有很多种重载类型,我们只需要掌握核心的几个函数
注意
射线检测也是瞬时的
执行代码时进行一次射线检测

1.最原始的射线检测(只会判断是否碰撞)
准备一条射线
	Ray ray = new Ray(Vector3.zero,Vector3.forward);
进行射线检测,如果碰撞到对象,则返回true
参数一:射线
参数二:检测的最大距离超出这个距离不检测
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
返回值:bool 当碰撞到对象时 返回true,没有返回false
    if (Physics.Raycast(ray, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal))
    {
        print("碰撞到了对象");
    }
    
还有一种重载不用传入射线直接传入起点和方向也可以用于判断
就是把第一个参数,变成了射线的两个点(一个起点,一个方向)
    if (Physics.Raycast(Vector3.zero,Vector3.forward, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal))
    {
    print("碰撞到了对象");
    }
2.获取相交的【单个物体信息】
物体信息类RaycastHit
	RaycastHit hitInfo;
参数一:射线
参数二:RaycastHit是结构体,是值类型Unity会通过out关键在在函数内部处理后,得到碰撞数据后返回到该参数中
参数三:检测距离
参数四:检测指定层级(不填检测所有层)
参数五:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
    if(Physics.Raycast(ray,out hitInfo,1000,1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal))
    {
        print("得到了碰撞到物体的信息");
        //碰撞器信息
        print("碰撞到物体的名字" + hitInfo.collider.name);
        print("碰撞到物体的名字" + hitInfo.collider.gameObject.name);
        //碰撞到的点(相交位置)
        print("相交位置" + hitInfo.point);
        //平面的法线信息
        print("法线" + hitInfo.normal);
        //碰撞到对象的位置
        print("对象的位置" + hitInfo.transform.position);
        //碰撞到对象离自己的距离
        print("距离" + hitInfo.distance);
    }
    
另一种重载,不用传入射线(直接传入起点和方向也可以用于判断)
    if (Physics.Raycast(Vector3.zero, Vector3.forward, out hitInfo, 1000, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal)){ }
3.获取相交的【多个物体信息】
可以得到碰撞到的多个对象
如果没有就是容量为0的数组
参数一:射线
参数二:检测距离
参数三:检测指定层级(不填检测所有层)
参数四:是否忽略触发器(UseGlobal(默认)-使用全局设置 Collide-检测触发器 Ignore-忽略触发器)
    RaycastHit[] hits = Physics.RaycastAll(ray,1000,1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal);
    for (int i = 0; i < hits.Length; i++)
    {
        print(hits[i].collider.name);
    }
另一种重载,不用传入射线(直接传入起点和方向也可以用于判断)

	RaycastHit[] hits = Physics.RaycastAll(Vector3.zero, Vector3.forward, 1000,
			1<<LayerMask.NameToLayer("UI"),QueryTriggerInteraction.UseGlobal);
			
还有一种函数返回的碰撞的数量,通过out得到数据
	if(Physics.RaycastNonAlloc(ray, hits, 100, 1 << LayerMask.NameToLayer("UI"), QueryTriggerInteraction.UseGlobal) > 0)
    {
		//遍历hits
    }

4、使用时注意的问题

注意(使用参数)
距离、层级两个参数都是int类型
当我们传入参数时一定要明确传入的参数代表的是距离还是层级
举例
	if(Physics.Raycast(ray,1<<LayerMask.NameToLayer("UI")){}
这样写是错误的,第二个参数虽然是float但编辑器不会提示错误,因为第二个参数代表的是距离,不是层级

思考1 子弹射击到物体效果

1.请用资料区给的资源,实现鼠标点击场景上一面墙,在点击的位置创建子弹特效和弹孔
using UnityEngine;

public class ShootBullet : MonoBehaviour
{
    RaycastHit info;
    void Update()
    {
        //从屏幕发射一条射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Debug.DrawRay(ray.origin, ray.direction);
        
        if (Input.GetMouseButtonDown(0))
        {
            //按下鼠标进行射线检测,从屏幕发射一条射线
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 100, 1 << LayerMask.NameToLayer("Wall")))
            {
                //碰撞到的点和法向量
                //创建打击特效
                GameObject hitObj = Instantiate(Resources.Load<GameObject>("Effect/BoomEff"));
                //设置点位置
                hitObj.transform.position = info.point + info.normal * 0.1f;
                //设置角度,特效面向我们
                hitObj.transform.rotation = Quaternion.LookRotation(info.normal);
                //销毁特效
                Destroy(hitObj, 0.8f);

                hitObj = Instantiate(Resources.Load<GameObject>("Effect/BulletHole"));
                hitObj.transform.position = info.point + info.normal * 0.1f;
                hitObj.transform.rotation = Quaternion.LookRotation(info.normal);
            }
        }
    }
}

思考2 控制场景物体

2.场景上有一个平面,有一个立方体,当鼠标点击选中立方体时,
长按鼠标左键可以拖动立方体在平面上移动,松开鼠标左键取消选中
using UnityEngine;

public class SceneObject : MonoBehaviour
{
    private Transform nowSelObj;
    RaycastHit info;
    void Update()
    {
        //选中,鼠标左键按下选中
        if (Input.GetMouseButtonDown(0))
        {
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 1000, 1 << LayerMask.NameToLayer("Monster")))
            {
                //记录选中的对象位置信息
                nowSelObj = info.transform;
            }
        }
        //长按拖动
        if (Input.GetMouseButton(0) && nowSelObj != null)
        {
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out info, 1000, 1 << LayerMask.NameToLayer("Wall")))
            {
                nowSelObj.position = info.point + Vector3.up * nowSelObj.transform.position.y;
            }
        }
        //取消选中,鼠标左键抬起取消选中
        if (Input.GetMouseButtonUp(0))
        {
            nowSelObj = null;
        }
    }
}

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

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

相关文章

Android studio设置国内镜像代理(HTTP Proxy)教程详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 1、Android Studio是在谷歌的服务器上&#xff0c;初次安装Android Studio时下载SDK可能…

6Valley 14.2 免授权php – 跨境电商在线商城 – 完整的电子商务APP端和web端程序

6Valley 14.2 Nulled – 多供应商电子商务 – 完整的电子商务移动应用程序、Web、卖家和管理面板 后台可自定义收款&#xff0c;和翻译多国语言&#xff0c;中文需要自己对比翻译&#xff01;一般用不到中文。毕竟是跨境电商平台 带商家即时通讯&#xff0c;全套带文档和APP双…

Spring(2)

目录 一、使用注解开发 1.1 主要注解 1.2 衍生注解 1.3 xml与注解 二、使用Java的方式配置Spring 三、代理模式 3.1 静态代理 3.1.1 角色分析 3.1.2 代码步骤 3.1.3 优点 3.1.4 缺点 3.2 动态代理 3.2.1 代码步骤 四、AOP 4.1 使用Spring的API接口 4.2 使用自定义…

云计算实训36——mysql镜像管理、同步容器和宿主机时间、在容器外执行容器内命令、容器的ip地址不稳定问题、基础镜像的制作、镜像应用

一、线上考试系统的数据虚拟化技术部署 1.部署前段服务器 步骤一&#xff1a;将资源上传到服务器 将dist.zip上传给服务器 下载unzip的包 yum -y install unzip 解压 unzip dist.zip 步骤二&#xff1a;创建基础容器在服务器上 启动服务 systemctl start docker.servic…

LVS部署——DR集群

目录 一、LVS—DR工作原理 二、LVS-DR数据流向 三、LVS-DR模式特点和优缺点 3.1、特点 3.2、优缺点 四、LVS-DR中的ARP问题 4.1、IP地址冲突 4.2、第二次访问请求失败 五、部署LVS-DR集群 5.1、实验准备 5.2、配置负载调度器&#xff08;192.168.20.15&#xff09; …

SeaweedFS 分布式存储安装weed

下载Single Binary weed Start 官方推荐 https://github.com/seaweedfs/seaweedfs 下载 https://github.com/seaweedfs/seaweedfs/releases解压 single binary file weed or weed.exe. wget https://github.com/seaweedfs/seaweedfs/releases/download/3.72/darwin_amd64.…

【前端面试基础】计算机网络、浏览器、操作系统

计算机网络 一、网络协议与模型 什么是协议&#xff1f; 协议是指计算机系统中完成特定任务所必需的规则和约定&#xff0c;特别是数据传输和交换的规则和约定。OSI和TCP/IP是什么&#xff1f; OSI&#xff08;开放式系统互连参考模型&#xff09;是一种网络架构模型&#xf…

C#复习之索引器

知识点一&#xff1a;索引器基本概念 基本概念&#xff1a; 让对象可以像数组一样通过索引访问其中元素&#xff0c;使程序看起来更直观&#xff0c;更容易编写 知识点二&#xff1a;索引器语法 //value代表传入的值 知识点三&#xff1a;索引器的使用 知识点四&#xff1a…

大容量永磁同步电机转速电流双环PID控制MATLAB仿真模型

电气仔推送 模型简介 同步电机采用转速环PI控制&#xff0c;电流环PI控制&#xff0c;在电机转速300r/min&#xff0c;输出转矩为40000N.m时&#xff0c;电机的输出功率为1.25MW。模型各部分完整&#xff0c;电流输出正弦度好&#xff0c;谐波含量低。赠送建模说明文件&#…

PAT (Basic Level) Practice (中文)

1003 我要通过 通过观察不难发现在一个规律&#xff1a;P之前A的个数*P和T之间A的个数等于T之后A的个数答案才正确 总结一下如何才能答案正确&#xff1f; 1.必须只能有P&#xff0c;A&#xff0c;T这三种字符 2.P和T之间必须要有A 3.P之前A的个数*P和T之间A的个数等于T之…

【HTML】模拟消息折叠效果【附源代码】

文件结构 收起效果 展开效果 HTML部分 HTML部分定义了网页的结构和内容。 <!DOCTYPE html> 声明了文档类型和HTML版本。<html> 元素是所有其他HTML元素的父元素。<head> 元素包含了文档的元数据&#xff0c;如字符集、视口设置、标题和链接的样式表。<b…

高效又经济,乔拓云助力,快速上线功能全面的小程序解决方案

乔拓云模板化小程序开发费用 在当今数字化时代&#xff0c;小程序成为企业拓展市场的新利器。乔拓云平台提供模板化开发方案&#xff0c;让您的小程序能同时覆盖微信与百度&#xff0c;迅速触达更多用户。 选择乔拓云模板&#xff0c;无需从零开始设计&#xff0c;直接复用精美…

ssrf+redis未授权访问漏洞复现

目录 靶场搭建 报错问题解决 组合利用 使用goherus生成payload 靶场搭建 首先我们进入ubutuo拉取靶场 docker run -d -p 8765:80 8023/pikachu-expect:latest 报错问题解决 如果出现docker报错&#xff0c;靶场一直拉取不下来 解决办法&#xff1a;配置镜像加速器 vim /et…

二叉树中查找值为x的节点(递归查找)

一&#xff1a;前提 本文紧接此篇博客&#xff1a; 递归实现 前/中/后序 遍历二叉树 的详细讲解-CSDN博客 模型依旧为&#xff1a; 二&#xff1a;代码 三&#xff1a;递归展开 假设找3&#xff1a; 假设找 7,7不存在&#xff0c;最后返回NULL 左&#xff1a; 右&#xff1…

机器学习 第5章 神经网络

这里写目录标题 5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 其他常见神经网络5.4.1 RBF网络5.4.2 ART网络5.4.3 SOM网络5.4.4 级联相关网络 5.5 深度学习 5.1 神经元模型 神经网络是一种由神经元构成的计算模型&#xff0c;模拟了生物神经系统的工作原理。神经…

【MySQL】优化 - 深分页

深分页 问题优化方法子查询延迟关联游标 问题 就是查询偏移量过大的场景&#xff0c;会导致查询性能较低&#xff0c;例如 # MySQL 在无法利用索引的情况下跳过1000000条记录后&#xff0c;再获取10条记录 SELECT * FROM t_order ORDER BY id LIMIT 1000000, 10首先&#xff…

嵌入式:用J-Link Commander和J-Flash进行Flash编程的区别

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 J-Link Commander和J-Flash都是用于Flash编程的工具&#xff0c;但它们的功能和应用场景有所不同。以下是两者的区别&#xff1a; J-Link Commander: 类型: 命令行工…

.NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在DevEx…

为什么说中医的本质是医“中”

日前&#xff0c;与一位懂中医的朋友朋友聊天&#xff0c;他言简意赅地指出“中医的本质就是医‘中’”。反思后总结如下&#xff0c;以飨读者&#xff0c;同时欢迎批评指正&#xff01; “中医的本质是医‘中’”强调了中医的核心在于其整体观和辩证方法。中医“中”的本质在于…

【OAuth2】为什么授权码模式更安全?为什么使用授权码比直接返回token更安全?

OAuth2 什么是OAuth2OAuth2的主要角色OAuth2的工作原理OAuth2的授权模式为什么授权码模式更安全&#xff1f; 什么是OAuth2 简而言之&#xff1a;安全的用你的其他账号登陆一个新网站&#xff08;甚至访问你在其他网站上存储的私密资源&#xff08;如头像、照片等&#xff09;…