THREE.JS之文本对象

2023-11-16

      在很多应用中,不光是有图像图像对象,有时还要给场景添加必要的文字说明等等。比图说游戏中的积分,生命值等等,或者使用文本做装饰等等。在three.js中,使用TextGeometry这个类来创建文本。今天要实现的效果如下图:

这里写图片描述

首先创建文件index.html

<!DOCTYPE html>
<html>
	<head>
		<title>立体字</title>
		<meta charset="utf-8">
		<style type="text/css">
			*{
				padding:0px;margin: 0px
			}
			#container{
				width: 100vw;
				height: 100vh;
			}
		</style>
	</head>
	<body>
		<div id="container"></div>
		<script type="text/javascript" src="./build/three.js"></script>
		<script type="text/javascript" src="./js/controls/OrbitControls.js"></script>
		<script type="text/javascript">
		//TODO
		</script>
	</body>
</html>

在上面代码中首先引入three.js[官网]文件和OrbitControls.js文件,其中OrbitControls是一个摄像机控制器,用来进行场景漫游。使用控制器来控制视角,更能体现3D的立体效果。

完整的例子步骤如下:
1、创建并初始化渲染器(Renderer);
2、创建并初始化场景(Scene);
3、创建并初始化摄像机(PerspectiveCamera/透视相机),将相机添加到场景中;
4、创建并初始化光源(PointLight/点光源),并将光源添加到场景中;
5、导入字体库,使用字体创建文本形状(TextGeometry),并添加到场景中;
6、创建控制器并初始化控制器(OrbitControls);
7、渲染;

首先创建全局变量,以便共享:

var renderer,scene,camera,controls;

1、创建并初始化渲染器(Renderer);

function initRenderer(){
	renderer = new THREE.WebGLRenderer( { antialias: true } );
	var width = document.getElementById("container").clientWidth;
	var height = document.getElementById("container").clientHeight;
	renderer.setSize(width,height);
	renderer.setClearColor(0xffffff);

	document.getElementById("container").appendChild(renderer.domElement);

}

      创建一个WebGLRenderer渲染器,WebGLRenderer使用WebGL来绘制3D图形。three.js一共有两种渲染器,另外一个是CanvasRenderer,使用 Canvas 2D Context API来绘制3D图形。对于开发者来说不管使用哪个渲染器,他们的差别对于我们来说是透明的,也就是说无论使用哪个渲染器,写的代码都是一样的。但是经过我的测试,发现CanvasRenderer的渲染效果明显次于WebGLRenderer,在场景漫游的过程重出现了很严重的跳帧。而且CanvasRenderer已经被移除了标准库three.js,如果使用需要使用,必须引入文件“/examples/js/renderers/CanvasRenderer.js”。

.setClearColor() 设置清除色,也就是背景色;
renderer.domElement 就是渲染器中的canvas对象,将canvas对象添加到页面中才能看到渲染效果。

2、创建并初始化场景(Scene);

function initScene(){
	scene = new THREE.Scene();
	scene.fog = new THREE.Fog( 0x000000, 0, 3000 );
}

给场景添加烟雾效果;
new THREE.Fog( color,near,far),其中:
color:十六进制,烟雾的颜色值;
near:烟雾的范围,沿Z轴的近端;
far:烟雾的范围,沿Z轴的远端;

3、创建并初始化摄像机(PerspectiveCamera/透视相机),将相机添加到场景中;

function initCamera(){
	var width = document.getElementById("container").clientWidth;
	var height = document.getElementById("container").clientHeight;
	camera = new THREE.PerspectiveCamera(30, width/height,1, 10000);
	camera.position.y=800/Math.tan(Math.PI/2.5);
	camera.position.z=800;
}

PerspectiveCamera( fov, aspect, near, far ):
fov:视角,视角越大视野越大,但是看到的物体越小;
aspect:纵横比,一般设置为canvas的width/height,否则场景中的物体会比例失调;
near:与相机的距离近端,当物体与相机的距离小于该值时不渲染;
far:与相机的距离近远端,当物体与相机的距离大于该值时不渲染;
相机的默认位置是放在圆点,重置器position的x/y/z来调整相机的位置;
相机的焦点默认是原点,可以使用camera.lookAt(THREE.vector3())来改变焦点;

4、创建并初始化光源(PointLight/点光源),并将光源添加到场景中;

function initLight(){
	var pointLight = new THREE.PointLight( 0xffffff, 1);
		pointLight.position.set( 0, 100, 100 );
		scene.add( pointLight );
		
	var pointLight = new THREE.PointLight( 0xffffff, 1);
		pointLight.position.set( 0, 100, -100 );
		scene.add( pointLight );
}

three.js中的光源有5种:
DirectinalLight:直线光;
PointLignt:点光源;
SpotLight:聚光灯;
AmbientLight:环境光;
HemisphereLight:半球光(天光);

THREE.PointLight(color, intensity):
color:光的颜色;
intensity:光强;

5、导入字体库,使用字体创建文本形状(TextGeometry),并添加到场景中;

function initText(){
	var loader = new THREE.FontLoader();
	loader.load('../examples/fonts/optimer_bold.typeface.json',function(response){
		var font = response;
		var textGeometry = new THREE.TextGeometry("three.js",{
			"font" : font,
			"size" : 70,
			"height" : 20,
			"bevelEnabled" : true,
			"bevelSize": 2
		})

		text = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
			new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ),
			new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } ) 
		] ))

		textGeometry.computeBoundingBox();
		
		var centerOffset = -0.5 * (textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x);
		text.position.x = centerOffset;
		text.position.y = 30;

		var mirror = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
			new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ),
			new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } )
		] ))

		mirror.rotation.x = Math.PI;
		mirror.position.x = centerOffset;
		mirror.position.z = 20;
		mirror.position.y = -30;
		scene.add(text);
		scene.add(mirror);

		var plane = new THREE.Mesh(
		new THREE.PlaneBufferGeometry( 10000, 10000 ),
		new THREE.MeshBasicMaterial( { color: 0xfffffff, opacity: 0.5, transparent: true } )
		);
		plane.rotation.x = -Math.PI/2;	
		plane.position.y = 0;
		scene.add(plane);
	})
	
}

var loader = new THREE.FontLoader()
创建字体加载器;

loader.load(src, callback)
加载字体库,加载成功后将字体库传给回调函数;

var textGeometry = new THREE.TextGeometry("three.js",{
	"font" : font,
	"size" : 70,
	"height" : 20,
	"bevelEnabled" : true,
	"bevelSize": 2
})

创建字体几何图形,其中TextGeometry的第一个参数是需要绘制的文本,第二个参数是一个json对象,设置如何绘制文本,具体意义为:
font: 使用的字体库;
size:绘制字体的大小;
height:绘制文本的厚度;
bevelEnabled:是否允许棱角平滑过渡;
bevelSize:棱角平滑过渡的尺寸;

注意:bevelSize通常要比size和height小一个量级,过渡带就会很饱满甚至比文本主体本身还要大

在3D世界里所有的物体都是由网格构成的,在three.js中,绘制图形的步骤是:先使用geometry定义图形的几何形状,然后使用几何形状和材质构建网格;
这里写图片描述

text = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
	new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ),
	new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } ) 
] ))

这里使用材质数组来对网格进行修饰,材质数组的第一项修饰文字正面和背面,第二项修饰文字的侧面即顶部和底部。使用的两个材质都是MeshPhongMaterial,这种材质的特点是能够像塑料一样反光。

可以认为文本对象是放在一个刚好容纳其内容的立方体中,而默认情况下,这个立方体的(底,背,左)的点与原点重合,然后沿x轴向右延伸。这样的话,文本就不会显示在视野中央。这样的话,就要计算出包含文本外部的立方体,然后使用立方体的顶点位置,重新计算出其起始位置,重置位置。

textGeometry.computeBoundingBox();
	
var centerOffset = -0.5 * (textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x);
text.position.x = centerOffset;
text.position.y = 30;

使用同样的方法创建一个倒影,最后不要忘记把对象添加到场景中。

scene.add(text);
scene.add(mirror);

为了使倒影的效果更逼真,给场景添加一个半透明的平面,把文本真身和倒影分开。

var plane = new THREE.Mesh(
	new THREE.PlaneGeometry( 10000, 10000 ),
	new THREE.MeshBasicMaterial( { color: 0xffffff, opacity: 0.5, transparent: true } )
);
plane.rotation.x = -Math.PI/2;	
plane.position.y = 0;
scene.add(plane);

THREE.PlaneGeometry( 10000, 10000 )创建一个10000x10000的平面,transparent: true设置该平面透明, opacity: 0.5透明度是0.5。此时平面是与x0y平面重合,也就是和屏幕平面重合,然后旋转平面到xoz平面上。

6、创建控制器并初始化控制器(OrbitControls);

function initControls(){
	controls = new THREE.OrbitControls(camera);
	controls.enableZoom = true;
	controls.minPolarAngle = Math.PI/2.5;
	controls.maxPolarAngle = Math.PI/2.5;
}

controls.enableZoom = true; //支持缩放;

controls.minPolarAngle = Math.PI/2.5; //限制竖直方向上最小旋转角度 y轴正向为0度
controls.maxPolarAngle = Math.PI/2.5; //限制竖直方向上最大旋转角度 y轴正向为0度

7、渲染;

function render(){
	renderer.render(scene, camera);
	requestAnimationFrame(render);	
}

function start(){
	initRenderer();
	initScene();
	initCamera();
	initControls();
	initLight();
	initText();
	render();
}

start();

到这里,文章开头的效果已经出来了,然后补充一下requestAnimationFrame()这个方法,requestAnimationFrame是为了做动画渲染而诞生的,其作用就是每个一段时间调用一下传入的回调函数,那么他与setTimeout()有什么区别呢?
大部分浏览器的刷新周期是16.7ms,因为1000/60=16.7;但是也不尽然,如果我们使用setTimeout()来调用渲染函数,而我们设置的刷新时间间隔与浏览器的刷新周期不一致的话,就会导致画面延时刷新。比如说,浏览器的刷新周期是16.7ms,而我们设置的时间是10ms,那么程序就要求浏览器超负荷地去刷新,但是事实上浏览器并不会这么做,而是等待到16.7ms才刷新,导致卡帧。而requestAnimationFrame()则不需要我们设置时间,他的刷新周期是和浏览器的刷新周期同步。而且,当网页被挂起之后,requestAnimationFrame将不再刷新,比setTimeout节省资源。

完整代码

<!DOCTYPE html>
<html>
<head>
	<title>立体字</title>
	<meta charset="utf-8">
	<style type="text/css">
		*{
			padding:0px;margin: 0px
		}
		#container{
			width: 100%;
			height: 100vh;
		}
	</style>
</head>
<body>
	<div id="container"></div>
	<script type="text/javascript" src="../build/three.js"></script>

	<script type="text/javascript" src="../examples/js/renderers/CanvasRenderer.js"></script>
	<script type="text/javascript" src="../examples/js/renderers/Projector.js"></script>
	<script type="text/javascript" src="../examples/js/controls/OrbitControls.js"></script>
	<script type="text/javascript" src="./Stats.js"></script>
	<script type="text/javascript">
		
		var renderer,scene,camera,controls;

		function initRenderer(){
			renderer = new THREE.WebGLRenderer( { antialias: true } );
			var width = document.getElementById("container").clientWidth;
			var height = document.getElementById("container").clientHeight;
			renderer.setSize(width,height);
			renderer.setClearColor(0xffffff);

			document.getElementById("container").appendChild(renderer.domElement);

			stats = new Stats();
			stats.setMode(0); // 0: fps, 1: ms
			// 将stats的界面对应左上角
			stats.domElement.style.position = 'absolute';
			stats.domElement.style.left = '0px';
			stats.domElement.style.top = '0px';
			document.body.appendChild( stats.domElement);

		}

		function initScene(){
			scene = new THREE.Scene();
			scene.fog = new THREE.Fog( 0x000000, 0, 5000 );
		}

		function initCamera(){
			var width = document.getElementById("container").clientWidth;
			var height = document.getElementById("container").clientHeight;
			camera = new THREE.PerspectiveCamera(30, width/height,1, 10000);
			camera.position.y=800/Math.tan(Math.PI/2.5);
			camera.position.z=800;
		}

		function initControls(){
			controls = new THREE.OrbitControls(camera);
			controls.enableZoom = true;
			controls.minPolarAngle = Math.PI/2.5;
			controls.maxPolarAngle = Math.PI/2.5;
			controls.autoRotate = false;

		}
		function initLight(){
			
			var pointLight = new THREE.PointLight( 0xffffff, 1);
				pointLight.position.set( 0, 100, 100 );
				scene.add( pointLight );

			var pointLight = new THREE.PointLight( 0xffffff, 1);
				pointLight.position.set( 0, 100, -100 );
				scene.add( pointLight );
		}

		function initText(){
			var loader = new THREE.FontLoader();
			loader.load('../examples/fonts/optimer_bold.typeface.json',function(response){
				font = response;
				var textGeometry = new THREE.TextGeometry("three.js",{
					"font" : font,
					"size" : 70,
					"height" : 20,
					"bevelEnabled" : true,
					//"curveSegments" : 1,
					bevelSize: 2,
					// material: 0,
					// extrudeMaterial: 1
				})



				text = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
					new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ), // front
					new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } ) // side
				] ))

				textGeometry.computeBoundingBox();
				//textGeometry.computeVertexNormals();
				
				var centerOffset = -0.5 * (textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x);
				text.position.x = centerOffset;
				text.position.y = 30;

				var mirror = new THREE.Mesh(textGeometry,new THREE.MultiMaterial( [
					new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.FlatShading } ), // front
					new THREE.MeshPhongMaterial( { color: 0xffffff, shading: THREE.SmoothShading } ) // side
				] ))

				mirror.rotation.x = Math.PI;
				mirror.position.x = centerOffset;
				mirror.position.z = 20;
				mirror.position.y = -30;
				scene.add(text);
				scene.add(mirror);

				var plane = new THREE.Mesh(
					new THREE.PlaneGeometry( 10000, 10000 ),
					new THREE.MeshBasicMaterial( { color: 0xffffff, opacity: 0.5, transparent: true } )
				);
				plane.rotation.x = -Math.PI/2;	
				plane.position.y = 0;
				scene.add(plane);
			})
			
		}

		function render(){
			renderer.render(scene, camera);
			stats.update();
			requestAnimationFrame(render);
		}

		function start(){
			initRenderer();
			initScene();
			initCamera();
			initControls();
			initLight();
			initText();
			render();
		}

		start();



	</script>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

THREE.JS之文本对象 的相关文章

  • ThreeJS bufferGeometry 位置属性在应用翻译时不会更新

    我使用 STLLoader 将 stl 加载到返回 BufferGeometry 的 ThreeJS 场景中 然后我用了 myMesh position set x y z myMesh rotation setFromQuaternion
  • VS CODE 中的 WEBGL 自动完成

    我有一个学校项目 我需要使用 WEBGL 但是在没有自动补全的情况下编写所有代码是相当困难的 我没有找到合适的扩展名 你有想法吗 为了让 Visual Studio 代码能够自动完成 它需要知道变量的类型 例如 如果你有这个 const g
  • 三.JS Shadow 到对象

    我想添加castShadow and receiveShadow在一个物体上 但是下面的代码有什么问题吗 var mtlLoader new THREE MTLLoader mtlLoader setPath objects Tree mt
  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 如何创建热图来说明控制发散调色板中心颜色位置的网格差异?

    我有两个人脸 3D 网格 我希望使用热图来说明差异 我想使用红蓝发散色阶 我的数据可以查到here https github com Patricklv How to create heatmap illustraing 3D mesh d
  • 在 Three.js 中使用多种材质来合并几何体

    我想使用 2 个网格创建一棵松树 其中 1 个用于树干 另一个用于灌木 这就是我所做的 var pine geometry new THREE Geometry var pine texture 1 THREE ImageUtils loa
  • 简单的线框格式?

    我正在寻找一种用于线框模型的简单文件格式 我知道 VRML u3D 等 但这些对于我的需求来说似乎很重要 我的标准是 必须有明确的规格 要么是开放的 要么是非常完善 记录的 我只需要 想要 简单的模型 顶点和边 我不想处理面孔或物体 如果格
  • Three.js - 如何翻译几何图形

    我有一个脚本 可以定位各种宽度 高度和深度的立方体 并且正在努力根据 xAxis yAxis 和 zAxis 也有所不同 将它们准确地排列起来 var geometry new THREE BoxGeometry width height
  • 如何在 GTX 560 及更高版本上使用 OpenGL 进行立体 3D?

    我正在使用在 Windows 7 上运行的开源触觉和 3D 图形库 Chai3D 我重写了该库以使用 Nvidia nvision 执行立体 3D 我将 OpenGL 与 GLUT 一起使用 并使用 glutInitDisplayMode
  • 在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗?

    答复我之前的问题 https stackoverflow com questions 24592099 drawing many unique triangles with a single draw call for better per
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 在球体边缘绘制点

    因此 来自 Flash 背景的我对一些简单的 2D 三角函数有很好的理解 在带有 I 圆的二维中 我知道使用给定角度和半径将项目放置在边缘上的数学 x cos a r y sin a r 现在 如果我在 3d 空间中有一个点 我知道球体的半
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 优化重叠矩形的绘制

    我有很多矩形 有些与其他矩形重叠 每个矩形都有一个绝对 z 顺序和一个colour 每个 矩形 实际上是粒子效果 网格或纹理的轴对齐边界框 并且可能是半透明的 但只要您不尝试剔除其他矩形后面的矩形 就更容易抽象地思考彩色矩形 所以我将在问题
  • 如何将平面上的 3D 点转换为 UV 坐标?

    我有一个 3d 点 定义为 x0 y0 z0 该点属于一个平面 定义为 a b c d normal a b c and ax by cz d 0 如何将 3d 点转换或映射为一对 u v 坐标 这一定是非常简单的事情 但我无法弄清楚 首先
  • 如何优化 Three.js 中多个 sphereGeometry 的渲染?

    我想优化 Three js 中 sphereGeometry 的渲染 因为它成为我的程序的瓶颈 javascript程序如下所示 var sphereThree for var idSphere 0 idSphere lt numSpher
  • JavaScript TypedArray 混合类型

    我正在尝试使用 WebGL 并希望将一些不同类型混合到一个字节缓冲区中 我知道 TypedArrays 可以达到这个目的 但不清楚我是否可以与它们混合类型 OpenGL 顶点数据通常是与无符号字节或整数混合的浮点数 在我的测试中 我想将 2
  • DirectX::SpriteFont/SpriteBatch 阻止 3D 场景绘制

    我使用时遇到问题DirectX SpriteFont DirectX SpriteBatch 来自 DirectXTK 与此处讨论的问题完全相同 使用 SpriteFont 类绘制文本时出现问题 https stackoverflow co
  • 如何在 Three.js 中重新调整三角形面的方向

    用更好的例子进行编辑 我使用 Three js 来显示 MRI 胃图像的外壳 外壳是从 vtk 格式的外部文件加载的 这是一个演示 http www menne biomed de uni 3d alphahull html http ww
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人

随机推荐

  • 微信小程序0基础到精通

    写在开头 此篇文章只是简单描述了一下一条学习路线 具体学习资源获取方式请看文末 第一步 想快速入门小程序开发就需要从必备的API和核心开发等基础知识入手 建立整个小程序的知识体系 学习目标 新手入门与项目实战 课程重点 1 小程序核心技术
  • 计算机原理提问,计算机原理的计算机原理人话版

    Windows关机步骤涉及到Windows多个组件和多个过程 简单的说 Windows的关机步骤不是大多数人认为的那么简单 基本的过程是这样的 1 用户发起关机指令以后 发起关机指令的程序会通知Windows子系统CSRSS EXE CSR
  • 提高ChatGPT稳定性:告别GPT网页登录使用PC软件进入GPT

    一 GPT时不时断线 在日常生活中 我们经常需要使用智能语言模型来辅助我们完成各种任务 而ChatGPT作为一款非常优秀的智能语言模型 被广泛应用于各个领域 然而 使用ChatGPT的过程中 我们不可避免地会遇到一个非常让人头疼的问题 Ch
  • javaee之黑马乐优商城4

    商品规格与数据结构 下面来说一下数据库的设计与分析 其实对于spu这张表来说 大体设计还是比较好设计的 看一下下面这张图是一个产品的规格参数 上面主体就是一个规格参数 基本信息又是一个规格参数 这里就是涉及到了一个商品的具体信息 sku就是
  • Android 中的CreatePackageContext()

    Return a new Context object for the given application name This Context is the same as what the named application gets w
  • 分享一个OJ平台——浙江工商大学的OJ平台

    1 引言 最近是有总喜欢讨论算法题 因为他们在准备考研复试 为什么我不准备呢 这是一个悲伤的故事 刚好自己也有面试遇到只能使用C和C 的代码题 他们说这OJ平台相对简单一些 那些刷不来LeetCode可以试试这个 作为入门算法的跳板 体验体
  • Opencv中copyTo()函数的使用方法

    在Mat矩阵类的成员函数中copyTo roi mask 函数是非常有用的一个函数 尤其是后面的mask可以实现蒙版的功能 我们用几个实例来说明它的作用 我们要注意mask的数据类型 必须是CV 8U 且通道数或者是1 或者与roi一致 首
  • CloudCompare 二次开发(14)——高斯滤波

    目录 一 概述 二 代码集成 三 结果展示 一 概述 使用CloudCompare与PCL的混合编程实现点云高斯滤波 高斯滤波的算法原理见 PCL 高斯滤波 二 代码集成 1 mainwindow h文件public中添加 void doA
  • 深入理解HashMap(及hash函数的真正巧妙之处)

    Hashmap是一种非常常用的 应用广泛的数据类型 最近研究到相关的内容 就正好复习一下 网上关于hashmap的文章很多 但到底是自己学习的总结 就发出来跟大家一起分享 一起讨论 1 hashmap的数据结构 要知道hashmap是什么
  • c++重载函数调用运算符

    函数调用运算符 如果类重载了函数调用运算符则我们可以像使用函数一样使用该类的对象 函数调用运算符必须是成员函数 一个类可以定义多个不同版本的调用运算符 struct absint int operator int val return va
  • 路由选路算法

    RIP OSPF Open Shortest Path First 开放最短路径优先 OSPF路由协议 ISIS BGP 参考博客 最佳路由路径选择算法详解
  • Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等

    1 协议 Python 中创建自定义序列通常的方式是继承内置的数据类型 使用collections模块中的UserDict UserList等数据 如果要创建完全自定义的序列 需要实现 Python 中自定义容器类型其中一些协议 首先 有用
  • 剑指offer-问题40

    package offer offer interview 40 public class Test40 public static int findNumbersAppearanceOnce int data int result 0 0
  • 6.10 docker (一) 启动

    启动 下面的命令输出一个 Hello World 之后终止容器 root node docker run ubuntu 18 04 bin echo Hello world Hello world 这在本地直接执行 bin echo hel
  • 使用docker搭建speedtest测速服务器

    文章目录 拉取镜像 启动镜像 开放防火墙12345端口 浏览器打开ip 12345测试 其他说明 拉取镜像 sudo docker pull adolfintel speedtest 检查是否拉取成功 sudo docker images
  • 什么是配置文件,以及如何编辑它们?

    我们使用的绝大多数计算机程序 无论是办公套件 网络浏览器 甚至视频游戏 都是通过菜单界面系统配置的 它几乎成了我们使用机器的默认方式 但是有些程序要求你不止是上述方式 你实际上必须编辑一个文本文件 以便让它们按你的意愿运行 这些文本文件 毫
  • 8层灯塔 共765盏灯

    有一个8层灯塔 每层的灯数都是上一层的2倍 共有765盏灯 编程求最上层的灯数 1 include
  • uniapp中使用pinia (针对于uniapp创建vue3项目,uniapp创建vue2项目此方法不可用)

    1安装pinia 如果新建项目 先初始化一下 npm init y npm install pinia save 2 新建pinia store目录 并创建相关文件 名字自己定我的是pinia store 在目录下新建index js和lo
  • 如何在JavaScript中删除字符串的第一个字符

    Let s say you have a string and you want to remove the first character in it 假设您有一个字符串 并且想要删除其中的第一个字符 How can you do so
  • THREE.JS之文本对象

    在很多应用中 不光是有图像图像对象 有时还要给场景添加必要的文字说明等等 比图说游戏中的积分 生命值等等 或者使用文本做装饰等等 在three js中 使用TextGeometry这个类来创建文本 今天要实现的效果如下图 首先创建文件ind