深入解析WPF中的3D图形编程:材质与光照
引言
在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染,本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。
1、GeometryModel3D类简介
GeometryModel3D类是WPF中用于定义3D对象的基本单元之一,它包含了三个关键属性:Geometry、Material以及BackMaterial。Geometry属性通过MeshGeometry3D对象定义了3D对象的形状,而Material和BackMaterial则负责定义这些形状表面的外观特性。
- Geometry:使用MeshGeometry3D对象来定义3D模型的具体几何形状。
- Material:决定了物体正面的颜色或纹理,支持多种类型的材质效果。
- BackMaterial:决定了物体背面的颜色或纹理,如果不指定,则从背面观察时该物体会变得不可见。
2、材质类详解
WPF提供了四种继承自抽象的Material类的材质类型,每种类型都有其独特的视觉表现:
- DiffuseMaterial:模拟现实世界中最常见的无光泽表面,光线在其表面上均匀散射。
- SpecularMaterial:创造有光泽且高亮度的外观,如同金属或玻璃般反射光线。
- EmissiveMaterial:赋予物体自身发光的能力,但这种光不能照亮其他物体。
- MaterialGroup:允许组合多种材质以实现更复杂的视觉效果。
其中,DiffuseMaterial是最常用的材质类型,因为它能够最真实地模拟大多数日常材料的外观。
注意: DiffuseMaterial类提供了Brush属性,该属性获取希望用于绘制3D对象表面的Brush对象(如果使用除了SolidColorBrush画刷外的其他画刷,就需要设置MeshGeometry3D.TextureCoordinates属性,定义将画刷映射到对象上的方式,否则就会照成图像无法正确渲染颜色)。
3、设置材质示例
以下是一个简单的XAML代码片段,展示了如何为一个三角形配置黄色的DiffuseMaterial材质:
<ModelVisual3D><ModelVisual3D.Content><Model3DGroup><GeometryModel3D><GeometryModel3D.Geometry><MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1" /></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Red" /></GeometryModel3D.Material></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D>
这段代码创建了一个简单的三角形,并将其正面颜色设置为红色。由于没有设置BackMaterial属性,从背面观察时这个三角形将消失不见。
4、WPF中的光照模型
在Windows Presentation Foundation (WPF) 中,为了创建一个视觉效果逼真的已着色的3D对象,理解并应用光照模型是至关重要的。本文将探讨如何使用WPF中的光照系统来增强你的3D场景,并解释一些关键概念和简化处理。
a、光照基础
基本的概念是在3D场景中添加一或多个光源,然后根据选择的灯光类型、位置、方向以及强度来照亮对象。尽管WPF的光照模型被设计为模拟现实世界的光照行为,但需要注意的是,它与真实世界中的光照行为并不完全相同。
b、 简化处理
由于计算真实的灯光反射是一项处理器密集型任务,WPF在其光照系统中进行了一些简化以保证效率:
- 每个对象独立计算:从一个对象反射的灯光不会影响另一个对象。同样地,一个对象不会在另一个对象上投射阴影。
- 顶点光照计算:对于每个三角形的每个顶点进行灯光计算,然后在三角形表面插值。这意味着WPF决定了每个拐角的灯光强度,然后混合这些灯光强度来填充整个三角形。这种设计方式意味着,如果形状由很少的三角形组成,可能无法正确地实现照明效果。为了达到更好的光照效果,需要将形状细分为数百个甚至数千个三角形。
c、 实现理想的光照效果
要获得精确的光照效果,可能需要结合使用多种光源、不同的材质,甚至是添加额外的形状。这是3D场景设计艺术的一部分,通过实验和调整来达到期望的效果。
注意事项 即使没有提供光源,3D对象依然是可见的。然而,在没有光源的情况下,所看到的只是纯黑色的轮廓。因此,添加至少一个光源是必要的,以便观察到对象的真实颜色和纹理。
5、WPF中的灯光类与DirectionalLight详解
📌 四种灯光类
灯光类名称 | 说明 |
---|---|
DirectionalLight | 使用沿着指定方向传播的平行光线填充整个场景,类似于太阳光 |
AmbientLight | 提供均匀散射的光源,照亮场景中所有对象,不产生阴影或方向性 |
PointLight | 从空间中某一点向各个方向辐射光线,类似灯泡发出的光 |
SpotLight | 从一个点出发,以锥形方式向外发射光线,类似聚光灯 |
✅ DirectionalLight:最常用的光源类型
在实际开发中,DirectionalLight
是最常用的一种光源类型,尤其适用于模拟来自遥远光源(如太阳)的光照效果。它发出的是平行光线,并且覆盖整个3D空间。
📷示例代码:
<DirectionalLight Color="White" Direction="-1,-1,-1" />
- Color:设置光源的颜色,此处为白色。
- Direction:定义光线的方向向量,表示光线从右上前方到左下后方传播。
⚠️ 注意:计算灯光方向时,向量的角度是关键,长度无关紧要。例如,方向向量
(-2, -2, -2)
和标准化后的(-1, -1, -1)
效果相同,因为它们代表相同的光照角度。
<!--相机--><Viewport3D.Camera><PerspectiveCamera Position="10,10,10" LookDirection="-10,-10,-10" UpDirection="0,0,1" FieldOfView="10"><PerspectiveCamera.Transform><RotateTransform3D CenterX="0" CenterY="0" CenterZ="0"><RotateTransform3D.Rotation><!--视野可以绕物体中心轴旋转--><AxisAngleRotation3D Axis="0 0 1" Angle="0"/></RotateTransform3D.Rotation></RotateTransform3D></PerspectiveCamera.Transform></PerspectiveCamera></Viewport3D.Camera><!--光源 离散的白色光源--><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><AmbientLight Color="#999" /><!--点光源-光影层次感--><PointLight Color="#DDD" Position="-10,10,-10"/></Model3DGroup></ModelVisual3D.Content></ModelVisual3D><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><GeometryModel3D><GeometryModel3D.Geometry><MeshGeometry3D Positions="-1,0,0 0,1,0 1,0,0" TriangleIndices="0,2,1" /></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Red" /></GeometryModel3D.Material></GeometryModel3D></Model3DGroup></ModelVisual3D.Content></ModelVisual3D>
🔍 光照角度与表面着色的关系
在这个示例中,光源的方向不是完全垂直于三角形表面(即未使用 (0, 0, -1)
),而是有一定倾斜角度(如 (-1, -1, -1)
)。这种设计是有意为之的,目的是为了让三角形表面呈现出更丰富的明暗变化,从而提升视觉效果。
💡 小贴士:定向光 vs 太阳光
- 定向光非常适合用来模拟太阳光。
- 因为其光线是平行的、无衰减的,因此特别适合用于大范围的室外场景渲染。
6、计算相机的位置
需要协调设置Position和LookDirection属性。如果使用 Position属性移动了摄像,但没有使用LookDirection属性在正确的方向上转回摄像机以进行补偿,就看不到在3D场景中创建的内容。为了确保正确地设置摄像机的方向,应选择一个希望从摄像机进行观察的点。然后可使用下面的公式计算观察方向:
CameraLookDirection = CenterPointofInterest - CameraPosition
在三角形示例中,使用位置(-2,2,2)将摄像机放到左上角。假定希望聚焦在原点(0,0,0),该点位于三角形底边的中点,应当使用下面这个观察方向:
CameraLookDirection = (0, 0, 0) - (-2, 2, 2)= (2, -2, -2)
这个方向相当于法线向量(1,-1,-1),因为它们描述的方向是相同的。DirectionalLight
类的Direction属性一样,重要的是向量的方向,而其长度并不重要。一旦设置 Position和LookDirection属性,可能还希望设置UpDirection属性。UpDirection属性决定了摄像机的倾斜角度。通常将UpDirection属性设置为(0,1,0),这意味着向量垂直向上。如下图所示:
7、总结
在WPF的3D图形编程中,合理选择和配置光源是创建真实感视觉效果的关键。通过掌握 DirectionalLight 的使用方法及其特性,开发者可以轻松构建出自然且富有层次感的光照场景。同时,理解其他三种光源(如环境光、点光源、聚光灯)的特性和应用场景,将有助于打造更加丰富和动态的3D界面。
相关文章:
深入解析WPF中的3D图形编程:材质与光照
引言 在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染,本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。 1、GeometryModel3D类简介 GeometryMode…...
python格式化小数加不加f的区别
一直好奇这个f是必须加的吗,但是不论是搜索还是ai都给不出准确的回复,就自己测试了一下 结论是不带f指定的是总的数字个数,包含小数点前的数字 带f的就是仅指小数点后数字个数 需要注意的是不带f的话数字是会用科学计数法表示的ÿ…...
【MySQL】存储引擎 - FEDERATED详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
window 显示驱动开发-线性内存空间段
线性内存空间段是显示硬件使用的经典段类型。 线性内存空间段符合以下模型: 它虚拟化位于图形适配器上的视频内存。GPU 直接访问它;也就是说,无需通过页面映射进行重定向。它在一维地址空间中以线性方式进行管理。 驱动程序将DXGK_SEGMENTDESCRIPTOR结…...
uniapp-商城-46-创建schema并新增到数据库
在后台页面中,数据管理是关键。最初,数据可能是通过代码硬编码在页面中,但这种方式缺乏灵活性和扩展性。为了适应实际需求,应使用数据库来存储数据,允许用户自行添加和更新信息。通过数据库,后台页面可以动…...
Go语言的宕机恢复,如何防止程序奔溃
Go语言中的panic机制用于处理程序中无法继续执行的严重错误。当程序触发panic时,当前函数的执行会立即停止,程序开始逐层向上回溯调用栈,执行每个函数的defer语句,直到到达recover函数或者程序崩溃退出。通过recover函数ÿ…...
阅文集团C++面试题及参考答案
能否不使用锁保证多线程安全? 在多线程编程中,锁(如互斥锁、信号量)是实现线程同步的传统方式,但并非唯一方式。不使用锁保证多线程安全的核心思路是避免共享状态、使用原子操作或采用线程本地存储。以下从几个方面详…...
三款实用电脑工具
今天为大家精心推荐三款实用软件,分别是人声伴奏分离软件、文件夹迁移软件和文字转拼音软件。 第一款:NovaMSS NovaMSS是一款功能强大的人声伴奏分离软件,它提供社区版和专业版,社区版永久免费。 该软件能够一键提取人声、伴奏、…...
【图片识别内容改名】图片指定区域OCR识别并自动重命名,批量提取图片指定内容并重命名,基于WPF和阿里云OCR识别的解决
基于WPF和阿里云OCR的图片区域识别与自动重命名解决方案 应用场景 电商商品管理:批量处理商品图片,从固定区域识别商品名称、型号、价格等信息,重命名为"商品名称_型号_价格.jpg"格式档案数字化:扫描后的合同、文件等图片,从固定位置识别合同编…...
可再生能源中的隔离栅极驱动器:光伏逆变器的游戏规则改变者
在迈向可持续未来的征程中,可再生能源已成为全球发展的基石。在可再生能源中,太阳能以其可及性和潜力脱颖而出。光伏(PV)逆变器是太阳能系统的核心,它严重依赖先进技术将太阳能电池板的直流电转换为可用的交流电。隔离栅极驱动器就是这样一种…...
解决:EnvironmentNameNotFound: Could not find conda environment?
明明创建了环境却找不到? conda env list 查看所有环境 使用绝对路径激活 conda activate /home/guokaiyin/miniconda3/envs/synthocc...
Java SE(10)——抽象类接口
1.抽象类 1.1 概念 在之前讲Java SE(6)——类和对象(一)的时候说过,所有的对象都可以通过类来抽象。但是反过来,并不是说所有的类都是用来抽象一个具体的对象。如果一个类本身没有足够的信息来描述一个具体的对象,而…...
数据结构与算法—顺序表和链表(1)
数据结构与算法—顺序表(1) 线性表顺序表概念与结构分类静态顺序表动态顺序表 动态顺序表的实现 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的…...
软件测试的概念
需求的概念 开发模型 测试模型 1. 什么是需求 在多数软件公司,会有两部分需求,⼀部分是⽤⼾需求,⼀部分是软件需求。 1.1 ⽤⼾需求 ⽤⼾需求:可以简单理解为甲⽅提出的需求,如果没有甲⽅,那么就是终端⽤⼾…...
基于Qwen-14b的基础RAG实现及反思
1、概览 本文主要介绍RAG的基础实现过程,给初学者提供一些帮助,RAG即检索增强生成,主要是两个步骤:检索、生成,下面将基于这两部分进行介绍。 2、检索 检索的主要目的是在自定义的知识库kb中查询到与问题query相关的候…...
TikTok广告投放优化指南
1. 广告账户时区设置 在创建广告账户时,建议优先选择美国太平洋时区(UTC-8洛杉矶时间),这有助于与国际投放节奏保持一致。 2. 达人视频授权问题解答 当在广告后台选择"Affiliate post"却找不到已授权的达人视频时,这种情况确实会…...
WorkManager与Kotlin后台任务调度指南
在Android开发中,使用WorkManager和Kotlin可以高效管理后台任务。以下是分步指南及关键概念: 1. 添加依赖项 在build.gradle文件中添加依赖: dependencies {implementation("androidx.work:work-runtime-ktx:2.7.1") }2. 创建Wor…...
生信服务器如何安装cellranger|生信服务器安装软件|单细胞测序软件安装
一.Why cellranger Cell Ranger 是由 10x Genomics 公司开发的一款用于处理其单细胞测序(single-cell RNA-seq, scRNA-seq)数据的软件套件。它主要用于将原始测序数据(fastq 文件)转换为可以用于下游分析的格式,比如基…...
Spring Web MVC基础理论和使用
目录 什么是MVC 什么是SpringMVC SpringMVC基础使用 建立连接 RequestMapping介绍 请求 传递参数 传递对象 参数重命名 传递数组 传递JSON数据 获取URL中参数 上传文件 获取Cookie/Session 获取Header 响应 返回静态页面 RestController和Controller的区别 返…...
Go Modules 的基本使用
在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…...
等保系列(三):等保测评的那些事
一、等保测评主要做什么 1、测评准备阶段 (1)确定测评对象与范围 明确被测系统的边界、功能模块、网络架构及承载的业务。 确认系统的安全保护等级(如二级、三级)。 (2)签订测评合同 选择具备资质的测…...
一种海杂波背景下前视海面目标角超分辨成像方法——论文阅读
一种海杂波背景下前视海面目标角超分辨成像方法 1. 专利的研究目标与实际问题1.1 研究目标1.2 实际意义2. 专利的创新方法、公式及优势2.1 总体思路2.2 关键公式及技术细节2.2.1 运动几何模型2.2.2 方位卷积模型2.2.3 贝叶斯反演与迭代方程2.2.4 参数估计2.3 与传统方法的对比优…...
在线caj转换word
CAJ格式是中国知网特有的一种文献格式,在学术研究等领域广泛使用,但有时我们需要将其转换为Word格式,方便编辑、引用文献。本文分享如何轻松将CAJ转换为word的转换工具,提高阅读和办公效率。 如何将CAJ转换WORD? 1、使用CAJ转换…...
考研英一学习笔记 2018年
2018 年全国硕士研究生招生考试 英语 (科目代码:201) Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Trust i…...
如何工作的更有职业性
职场中的人,如何让对方对你的评价是你很职业?如何让对方认为你更专业? 这里的职业是形容词 与人沟通的职业性,首当其冲的是你的表达,不管是直接的交流沟通还是文字沟通都清晰明了。 文字沟通 写出来的文字应该尽可…...
transformer 笔记 tokenizer moe
(超爽中英!) 2025吴恩达大模型【Transformer】原理解析教程!附书籍代码 DeepLearning.AI_哔哩哔哩_bilibili 自回归就是上文全部阅读 好像学过了,向量互乘好像 transformer不需要rnn 掩码自注意力 训练bert import torch import torch.nn as nn import …...
6.01 Python中打开usb相机并进行显示
本案例介绍如何打开USB相机并每隔100ms进行刷新的代码,效果如下: 一、主要思路: 1. 打开视频流、读取帧 self.cam_cap = cv2.VideoCapture(0) #打开 视频流 cam_ret, cam_frame = self.cam_cap.read() //读取帧。 2.使用定时器,每隔100ms读取帧 3.显示到Qt的QLabel…...
什么是AIOps
AIOps(Artificial Intelligence for IT Operations,智能运维)是以人工智能技术为核心的新型IT运维模式,通过整合机器学习、大数据分析等技术,实现运维流程的自动化与智能化,从而提升系统稳定性、降低运营成…...
javax.net.ssl.SSLHandshakeException: No appropriate protocol
大家好,我是 程序员码递夫。 我有个SpringBoot项目用到邮件发送功能, 在开发环境运行,一切正常,但是我 部署jar 包,在本机上运行时却报错了, 提示: javax.mail.MessagingException: Could not…...
【身份证识别表格】批量识别身份证扫描件或照片保存为Excel表格,怎么大批量将身份证图片转为excel表格?基于WPF和腾讯OCR的识别方案
以下是基于WPF和腾讯OCR的身份证批量识别与导出Excel的完整方案: 一、应用场景 企业人事管理 新员工入职时需批量录入数百份身份证信息,传统手动录入易出错且耗时。通过OCR自动提取姓名、身份证号等字段,生成结构化Excel表格…...
Java+Selenium+快代理实现高效爬虫
目录 一、前言二、Selenium简介三、环境准备四、代码实现4.1 创建WebDriver工厂类4.2 创建爬虫主类4.3 配置代理的注意事项 六、总结与展望 一、前言 在Web爬虫技术中,Selenium作为一款强大的浏览器自动化工具,能够模拟真实用户操作,有效应对…...
掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
一个普遍的现象是,大模型通常会根据给定的提示直接生成回复。对于一些简单的任务,大模型或许能够较好地应对。然而,当我们面对更加复杂的任务时,往往希望大模型能够表现得更加“智能”,具备适应多样场景和解决复杂问题的能力。为此,AgentScope 提供了内置的 ReAct 智能体…...
【愚公系列】《Manus极简入门》028-创业规划顾问:“创业导航仪”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
SpringBoot统一功能处理
一.拦截器(实现两个接口,并重写方法) 1. 定义拦截器 ⾃定义拦截器: 实现HandlerInterceptor接⼝, 并重写其所有⽅法 preHandle()⽅法:⽬标⽅法执⾏前执⾏. 返回true: 继续执⾏后续操作; 返回false: 中断后…...
并发设计模式实战系列(19):监视器(Monitor)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第十九章监视器(Monitor),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 监视器三要素模型 2. 线程调度…...
Oracle Fusion常用表
模块表名表描述字段说明sodoo_headers_all销售订单头表sodoo_lines_all销售订单行表sodoo_fulfill_lines_all销售订单明细行表popo_headers_all采购订单头表popo_lines_all采购订单行表popo_line_locations_all采购订单分配表popo_distributions_all采购订单发运表invEGP_SYSTE…...
虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
网络安全公司Morphisec的研究人员发现,攻击者正利用虚假人工智能(AI)平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件,窃取浏览器凭证、加密货币钱包,并可…...
华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验
前言 本文章主要讲述在华为云ModelArts Studio上 开通DeepSeek-V3/R1商用服务的流程,以及开通过程中的经验分享和使用感受帮我更多开发者,在华为云平台快速完成 DeepSeek-V3/R1商用服务的开通以及使用入门注意:避免测试过程中出现部署失败等问…...
在Cline上调用MCP服务之MCP实践篇
目录 引言一、准备工作1、安装 Visual Studio Code2、安装Cline插件配置支持模型 二、安装MCP Server并调用MCP Server三、本地手动安装MCP Server结尾 引言 上一篇《模型上下文协议(Model Context Protocol,MCP)初见概念篇》我们说到什么是…...
大模型应用开发之模型架构
一、Transformer 架构 1. 编码器Encoder(“阅读理解大师”) 1)核心任务:编码器的唯一目标就是彻底理解输入的句子。它要把输入的每个词(或者说词元 Token)都转化成一个充满上下文信息的“向量表示”&#…...
敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
汽车紧固件低能耗涂装 在汽车工业体系中,紧固件承担着连接关键部件的重任。螺栓的抗拉强度、螺母的锁紧力矩,直接决定着整车的可靠性。当前,传统涂层技术始终面临一道难题:如何在保障防锈性能的同时,实现真正的环保无有…...
基环树(模板) 2876. 有向图访问计数
对于基环树,我们可以通过拓扑排序去掉所有的树枝,只剩下环,题目中可能会有多个基环树 思路:我们先利用拓扑排序将树枝去掉,然后求出每个基环树,之后反向dfs求得所有树枝的长度即可 class Solution { publi…...
26考研——中央处理器_指令执行过程(5)
408答疑 文章目录 二、指令执行过程指令周期定义指令周期的多样性指令执行的过程注意事项 指令周期的数据流取指周期间址周期执行周期中断周期 指令执行方案单周期处理器多周期处理器流水线处理器 八、参考资料鲍鱼科技课件26王道考研书 九、总结 二、指令执行过程 指令周期 …...
Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制
目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 (1) 基础参数 (2)按键绑定参数 (3)输入响应参数 (4)输入类型与设备参数 (5)不同类型轴的参…...
如何清除windows 远程桌面连接的IP记录
问题 在远程桌面连接后,会在输入列表留下历史IP记录,无用的IP多了会影响我们查找效率,也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R,输入 regedit,回车定位到远程桌面记录的注册表…...
C#参数数组全解析
在C#编程中,参数数组是一个重要的概念,它为方法调用提供了更大的灵活性。下面我们将详细介绍参数数组的相关内容。 参数数组的基本规则 在本书所述的参数类型里,通常一个形参需严格对应一个实参,但参数数组不同,它允…...
设计模式-策略模式(Strategy Pattern)
设计模式-策略模式(Strategy Pattern) 一、概要 在软件设计中,策略模式(Strategy Pattern)是一种非常重要的行为型设计模式。它的核心思想是将算法或行为封装在不同的策略类中,使得它们可以互换ÿ…...
LeetCode面试题 17.21 直方图的水量
题目 解答 package leetcode.editor.cn;//leetcode submit region begin(Prohibit modification and deletion) class Solution {public int trap(int[] height) {int length height.length;if (length 0) {return 0;}int[] leftMax new int[length];leftMax[0] 0;for (i…...
数据库系统概论(七)初识SQL与SQL基本概念
数据库系统概论(七)初识SQL与SQL基本概念 前言一、什么是SQL语言?1.1 SQL的产生和发展1.2 SQL的特点1.3 SQL的基本概念1.3.1 数据库相关“术语”(类比Excel表格)1.3.2 四大类核心语句(后面会详细讲…...
Jenkins Maven 带权限 搭建方案2025
1、使用docker搭建jenkins version: 3.8services:jenkins:image: jenkins_lzh:1.0container_name: jenkinsports:- "8080:8080" # Jenkins Web UI- "50000:50000" # Jenkins Agent通信端口volumes:- ./jenkins_home:/var/jenkins_home # 持久化Jenkins…...