three.js 用中文字作为贴图

2023-10-28

面的内容使用canvas2drenderer ,目前已经废弃,如果不想用这个可以直接 看2019年8月份补充的内容
闲来无事,把three.js其中有一个例子改了一下,变成从一个中心点喷射出中文字的例子,
效果图:
three.js中文字贴图
可以在codePen上查看效果
下面直接贴代码好了
html:

<html lang="en">
	<head>
		<title>three.js canvas - text - sprites</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				background-color: #000000;
				margin: 0px;
				overflow: hidden;
			}

			a {
				color: #0078ff;
			}
    @media screen and (max-width: 600px) {
				html{
					font-size:6px;
				}
			}
		</style>
	</head>
	<body>
		<div class="controls">
			<input type="text" name="danmu"  id="danmuInput"/>
			<button onclick="sendText()">发射弹幕(send)</button>
		</div>
    <div class="clear" onclick="clearAll()">
        清除(clear)
    </div>
	</body>
</html>

css只是表现层让他看起来稍微好看一点,所以不算是最重要的,除此之外写了一小部分便于在手机上浏览响应式css
css:

 @media screen and (max-width: 600px) {
				html{
					font-size:6px;
				}
			}
html{
				font-size:10px;
			}
			*{
				margin:0;
				padding:0;
				box-sizing:border-box;
			}
			.controls{
				width:40rem;
				height:20rem;
				border: 0.2rem solid #88f;
				border-radius:0.5rem;
				position:fixed;
				bottom:1rem;
				left:50%;
				margin-left:-20rem;
				background-color: rgba(155,155,255,0.1);
				
			}
			#danmuInput{
				width:30rem;
				font-size:2rem;
				text-align:center;
				background-color: rgba(155,155,255,0.6);
				color:white;
				height:3.8rem;
				line-height:3.8rem;
				margin:4rem 0 0 5rem;
				border:0.1rem solid rgba(200,200,255,0.3);
			}
			#danmuInput:focus{
				border:0.1rem solid rgba(200,200,255,0.9);
				box-shadow:none;
				outline:none;
				box-shadow:0 0 0.2rem 0.1rem rgba(200,200,255,0.9);
			}
			.controls button{
				position:absolute;
				width:20rem;
				height:4rem;
				bottom:2rem;
				left:50%;
				margin-left:-10rem;
				background-color: rgba(0,0,0,0);
				color:white;
				font-size:2rem;
				text-shadow:0 0 5px #fff;
			}
.controls button:hover{
  cursor:pointer;
  background-color: rgba(255,255,255,0.4);
  color:#00f;
}
.clear{
  width:12rem;
  height:4rem;
  background-color:rgba(255,177,255,0.1);
  position:fixed;
  top:2rem;
  right:4rem;
  font-size:2rem;
  color:white;
  font-weght:bold;
  line-height:4rem;
  text-align:center;
  text-shadow:0 0 1rem rgba(255,177,255,0.6);
  border-radius:0.4rem;
  transition: all .3s; 
}
.clear:hover{
  cursor:pointer;
  background-color:rgba(255,200,255,0.4);
  line-height:3.8rem;
  box-shadow:0 0 1rem 0.5rem rgba(255,200,255,0.2);
}
.clear:active{
  cursor:pointer;
  background-color:rgba(255,200,255,0.3);
  line-height:4.2rem;
  box-shadow:0 0 1rem 0.5rem rgba(255,200,255,0.2);
}

最关键的js部分:
前置js:
three.js
https://threejs.org/build/three.js
three.js的项目管理插件 方便
https://threejs.org/examples/js/renderers/Projector.js
tween渐变插件 有许多渐变函数可以用 用于制作动画
https://threejs.org/examples/js/libs/tween.min.js
信息搜集展示插件 可以显示帧数/每帧渲染时间,性能占用等性能信息
https://threejs.org/examples/js/libs/stats.min.js
画布渲染插件 ,因为three默认用的是webgl渲染有了这个插件可以用canvas原生2d模式渲染,添加canvas渲染器必备 并非必须 只是这里用到了
https://threejs.org/examples/js/renderers/CanvasRenderer.js

   var container, stats;
		   //首先最开始要生声明变量
			var camera, scene, renderer, particle;
			var mouseX = 0, mouseY = 0;
			var text = "弹幕";	
			
			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;
			//初始化函数
			init();
			//动画函数 递归的方式调用
			animate();
			//初始化
			function init() {
				//	初始化canvas元素
				container = document.createElement( 'div' );
				document.body.appendChild( container );
				//创建相机
				camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 5000 );
				camera.position.z = 1000;
				//创建场景
				scene = new THREE.Scene();
				var color = "red";
				var material = new THREE.SpriteMaterial( {
					map: new THREE.CanvasTexture( generateSprite(text,color) ),
					blending: THREE.AdditiveBlending
				} );
				//生成100个并且每隔100ms出现一个
				for ( var i = 0; i < 100; i++ ) {

					particle = new THREE.Sprite( material );

					initParticle( particle, i * 100 );

					scene.add( particle );
				}
				//使用的渲染器是THREE的2Dcanvas渲染器而非webgl
				renderer = new THREE.CanvasRenderer();
				renderer.setClearColor( 0x000040 );//设置清屏的颜色一般来说是背景的颜色这里设置了深蓝色
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				container.appendChild( renderer.domElement );
				//用于展现帧数等数据信息
				stats = new Stats();
				container.appendChild( stats.dom );

				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
				document.addEventListener( 'touchstart', onDocumentTouchStart, false );
				document.addEventListener( 'touchmove', onDocumentTouchMove, false );

				//

				window.addEventListener( 'resize', onWindowResize, false );

			}
			//当网页窗口发生变化时改变canvas渲染部分的大小的函数
			function onWindowResize() {

				windowHalfX = window.innerWidth / 2;
				windowHalfY = window.innerHeight / 2;

				camera.aspect = window.innerWidth / window.innerHeight;
				camera.updateProjectionMatrix();

				renderer.setSize( window.innerWidth, window.innerHeight );

			}
			//这个才是创建单个字符片段的函数
			function generateSprite(text,style) {

				var canvas = document.createElement( 'canvas' );
				canvas.width = 300;
				canvas.height = 300;

				var context = canvas.getContext( '2d' );
					context.beginPath();
					context.font='50px Microsoft YaHei';
					context.fillStyle = style;
					context.fillText(text,0,50);
					context.fill();
					context.stroke();
				return canvas;

			}
			//将例子中创建一个类似于星星的圆点的画布的函数换了名字
			function generateTextSprite() {
				//创建canvas画布
				var canvas = document.createElement( 'canvas' );
				canvas.width = 16;
				canvas.height = 16;
				//绘制
				var context = canvas.getContext( '2d' );
				//生成渐变圆点
				var gradient = context.createRadialGradient( canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2 );
				gradient.addColorStop( 0, 'rgba(255,255,255,1)' );
				gradient.addColorStop( 0.2, 'rgba(0,255,255,1)' );
				gradient.addColorStop( 0.4, 'rgba(0,0,64,1)' );
				gradient.addColorStop( 1, 'rgba(0,0,0,1)' );
				
				context.fillStyle = gradient;
				context.fillRect( 0, 0, canvas.width, canvas.height );

				return canvas;

			}
			function initParticle( particle, delay ) {

				var particle = this instanceof THREE.Sprite ? this : particle;
				var delay = delay !== undefined ? delay : 0;

				particle.position.set( -500, 0, 0 );
				particle.scale.x = particle.scale.y = 300 /*Math.random() * 32 + 16*/;
				//用了线性函数插件
				new TWEEN.Tween( particle )
					.delay( delay )
					.to( {}, 10000 )
					.onComplete( initParticle )/*这是一个递归 用于持续产生 间隔10s钟*/
					.start();

				new TWEEN.Tween( particle.position )
					.delay( delay )
					.to( { x: Math.random() * 4000 - 2000, y: Math.random() * 1500 - 750, z: Math.random() * 4000 - 2000 }, 10000 )
					.start();

				new TWEEN.Tween( particle.scale )
					.delay( delay )
					.to( { x: 0.03, y: 0.03 }, 10000 )
					.start();

			}

			//

			function onDocumentMouseMove( event ) {
				mouseX = event.clientX - windowHalfX;
				mouseY = event.clientY - windowHalfY;
			}

			function onDocumentTouchStart( event ) {

				if ( event.touches.length == 1 ) {

					//event.preventDefault();

					mouseX = event.touches[ 0 ].pageX - windowHalfX;
					mouseY = event.touches[ 0 ].pageY - windowHalfY;

				}

			}

			function onDocumentTouchMove( event ) {

				if ( event.touches.length == 1 ) {

					//event.preventDefault();

					mouseX = event.touches[ 0 ].pageX - windowHalfX;
					mouseY = event.touches[ 0 ].pageY - windowHalfY;

				}

			}

			//

			function animate() {
				requestAnimationFrame( animate );
				render();
				stats.update();
			}

			function render() {
				TWEEN.update();
				camera.position.x += ( mouseX - camera.position.x ) * 0.05;
				camera.position.y += ( - mouseY - camera.position.y ) * 0.05;
				camera.lookAt( scene.position );
				renderer.render( scene, camera );

			}
			
			function changeText(t){
				if ( t != ''){
					text = t;
				}
				console.log("nyan");
				return text;
				
			}
			function changeTextAndShow(text,color){
				//确定材料
				//检测在场景中是否过多材料
				if(scene.children.length>2000){return;};
				var material = new THREE.SpriteMaterial( {
					map: new THREE.CanvasTexture( generateSprite(text,color) ),
					blending: THREE.AdditiveBlending
				} );
				
				//生成 并且加入到渲染环境中
				for ( var i = 0; i < 10; i++ ) {
					particle = new THREE.Sprite( material );
					initParticle( particle, i * 10 );
					scene.add( particle );
				}
				console.log("nyan");
			}
			function sendText(){
			
				var texts = document.getElementById("danmuInput").value;
				if(texts == '')return;
				var color = getRandomColor();
				changeTextAndShow(texts,color);
     console.log("nyannnnn");
			}
			function getRandomColor(){
				var color = "rgba(" + Math.floor(Math.random() * 155 + 100 ) + "," +
									Math.floor(Math.random() * 155 + 100) + "," +
									Math.floor(Math.random() * 155 +100) + "," +
									(Math.random() * 0.5 + 0.5) + ")";
				return color;
			}
			//个人恶趣味
			setTimeout('changeTextAndShow("惊吓","yellow")',2000);
    setTimeout('changeTextAndShow("nyancat","blue")',3000);
    setTimeout('changeTextAndShow("QwQ","rgba(233,155,233,0.6)")',4000);
    changeTextAndShow("惊吓","green");
    function clearAll(){
				scene.children.splice(0,scene.children.length);
    }
    //个人恶趣味 清空之后如果屏幕内没有弹幕则会过11秒加入10个弹幕,鉴于循环周期是10秒所以110秒之后有会有10秒的循环
  function showTextWhenNoTextHere(){
    if(scene.children.length>100){return;}
    else{
      console.log("show more");
      changeTextAndShow("寂寞弹幕","yellow");
    }
  }
setInterval("showTextWhenNoTextHere()",11000);

最后的效果:
https://codepen.io/towrabbit/full/JpqwZy/

2019年8月份补充

如果需要单纯的用于展示字的透明图片 使用精灵(sprite)的方式是最好的 因为其面向相机的特性。在哪个角度都能够看清楚。非常适合做辅助用的标记。当然还有另外一种方法,将three中的世界坐标转为屏幕坐标,根据此坐标更改dom的位置也是可以作为标记的,各有优缺点, 此处为大佬世界坐标转为屏幕坐标的例子:101 Three.js 场景世界坐标和平面二维坐标互转

下面为我使用的方法,
结果是这样子的:
three.js图表标记

(function(undefined) {
    "use strict"
    var _global;
    var TextTool = {
        initTextCanvas:function(options){
            var settings
            if(typeof options === 'undefined'){
                console.log('没有传入任何从参数 字是白色的');
                settings = {
                    canvasW : 1000,
                    canvasH : 1000,
                    text:'测试文字',
                    fontColor: 'black',
                    font:'40px 微软雅黑'
                }
            }else{
                settings = {
                    canvasW : options.canvasWidth || 256,
                    canvasH : options.canvasHeight || 256,
                    text: options.text || '测试文字',
                    fontColor: options.color || 'white',
                    font:options.font || '40px 微软雅黑'
                }
            }
            var canvas = document.createElement('canvas')
            canvas.width = settings.canvasW
            canvas.height = settings.canvasH
            var ctx = canvas.getContext('2d')

            ctx.font = settings.font
            ctx.fillStyle = settings.fontColor
            ctx.textAlign = 'center'
            ctx.fillText(settings.text,settings.canvasW/2,settings.canvasH/2);

            return canvas;

        },
        initTextSprite:function(canvas){
            var spriteMaterial = new THREE.SpriteMaterial({map:new THREE.CanvasTexture(canvas)})
            var TextSprite = new  THREE.Sprite(spriteMaterial)
            return TextSprite
        }
    }
    // 最后将插件对象暴露给全局对象
    _global = (function(){ return this || (0, eval)('this'); }());
    if (typeof module !== "undefined" && module.exports) {
        module.exports = TextTool;
    } else if (typeof define === "function" && define.amd) {
        define(function() { return TextTool;});
    } else {
        !('TextTool' in _global) && (_global.TextTool = TextTool);
    }
}());

就是绘制在一个2d的canvas平面上,再作为材质放到Sprite(精灵)上
使用方式为:

var canvas = TextTool.initTextCanvas({
	text: '文字'
})
var textSprite = TextTool.initTextSprite( canvas );
textSprite.position.set(0,1,0);//设置位置

该方法的优点:

  • 通过canvas先渲染的贴图,然后再放到3d场景中 基于原生canvas2d的文字渲染
  • 有相对来说比较方便的排版方式,基本够用
  • 更文字的方式是更新贴图

该方法的缺点:

  • 在进行缩放或者旋转的时候可能会糊(可以通过增加文字的大小解决,但是增加文字大小相当于增加贴图的精度)
  • 如果文字更新频率过高,canvas2d在光栅化的时候会卡。

适合大段的不更新的字,或者小段的更新没有那么频繁的字。

2020年8月份补充

  • 可以使用字体文件生成geometry的相当于模型的文字,其优点是其展现是矢量的。在英文中可以使用map表对各个英文字符进行文字mesh的实例化,并通过维护一个位置表来展示渲染内容。英文主要是26*2 个大小写字符还有一些标点符号,如果使用特殊字体,字体文件也比较少。可以通过这样的方式生成
  • 模型文字不是非常适合大量的中文字符,因为每个中文字符就种类的单个字符来说非常丰富,这就导致不适用使用索引表的方式使用实例化的模型进行拼接。这会有非常大量的三角面。并且如果字符是会经常的动态更改的话,在创建的时候也会遇到性能问题。
  • 如果需要更多的相关的在webgl中渲染文字的技巧请看这篇博客,目前是生的英语:
  • 使用webgl的文字渲染技术
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js 用中文字作为贴图 的相关文章

  • 如何从 cdn THREE.js 加载 GLTFLoader

    我在弄清楚如何让 GLTFLoader 在 THREE js 中工作时遇到一些问题 我不明白如何使用 CDN 站点来托管文件 我尝试过使用网络上示例的链接 但这并没有完成我的工作 我在另一篇文章中读到 GLTFLoader 文件必须与我正在
  • 如何让Three.js全屏显示?

    我想用 Three js 制作游戏 但如何使其全屏显示 我看见本文 http learningthreejs com blog 2011 11 17 lets make a 3d game make it fullscreen 并且我在代码
  • THREE.js 使用 DOMElements 的 SphereGeometry 全景热点

    我使用以下命令创建了一个简单的 WebGL 3D 全景应用程序SphereGeometry PerspectiveCamera and a CanvasTexture 现在 我希望通过在场景的某些部分添加 热点 来使场景栩栩如生Sphere
  • 在 Three.js 中针对“子场景”进行光线投射

    因此 我正在使用 Three js 示例中的 webgl interactive cubes html 并且我有一个相对简单的问题 是否可以测试光线与对象的子对象的相交 例如 如果我做类似的事情 for var i 0 i lt 2000
  • 如何将 3D 模型从 Cinema4D 导出到 Three.js?

    如果我有一个网格建模4D影院 我怎样才能将其导出three js http github com mrdoob three js3D JS 引擎 另外 导出材料也很方便colors for 多边形选择 为此 我刚刚为 Cinema4D 编写
  • 具有材质颜色的三个 js 动画搅拌机模型

    我有一个导出的 三个 js json 格式 搅拌机模型 该模型有一些带有颜色的材料 如果我使用 THREE MorphAnimMesh 和 THREE MeshPhongMaterial 动画工作正常 但没有材质颜色 如果我使用 THREE
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • THREE.JS 加载 STL 网格数组

    因此 我有一个数据库 其中包含文件引用列以及对其所需的子 STL 文件的任何引用 我可以将一两个模型加载到 THREE js 查看器中 因此所有这些都可以正常工作 但是当我加载四个左右的数组时 事情开始变得毛茸茸的 分配的网格 ID 开始变
  • 三个js如何手动添加三角形到BufferGeometry

    我一直在尝试找到使用 Three js 更改网格顶点的最快方法 我发现 如果我更改 mesh geometry attributes position array 的部分内容 然后设置 mesh geometry attributes po
  • Three.js - 如何更新 arrowHelper?

    我正在尝试更新 arrowHelper 我尝试过操作箭头对象线中的顶点 设置所有内容dynamic true等等 但我似乎能做到的唯一方法就是删除旧线并绘制新线 有没有办法更新 arrowHelper 因此 您无法通过更改用于创建对象的值来
  • Three.js 支持波斯语/阿拉伯语文本

    我需要以波斯语 阿拉伯语显示一些文本 我加载了包含字符的字体 并使用 TextGeometry 在场景上创建文本 var loader new THREE FontLoader loader load B Zar Regular js fu
  • 将 A 框架与 Three.js 相结合

    我想知道 是否可以将 Three js 元素添加到 A 框架场景中 假设 A frame 是基于 Three js 构建的 并且 three Version 0 74 0 登录到你的控制台这不应该是一件奇怪的事情 对吧 我在我的 A 框架场
  • 星系模拟:更改点的颜色并在鼠标悬停时显示文本

    我正在尝试创建模拟 https riteshsingh github io galaxies 4673 个最近星系的位置 星系是点 我想为鼠标悬停时的点着色并加载星系的名称 我花了很多天试图实现它 我可以更改颜色以及进行基本的光线投射 但是
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 将颜色渐变应用于网格上的材质 - Three.js

    我有一个 STL 文件加载到我的场景中 并将单一颜色应用于 phong 材质 我想要一种方法 将两种颜色应用于该网格物体的材质 并在 Z 轴上应用渐变效果 如下例所示 渐变花瓶 https i stack imgur com Ty9gq j
  • Three.js 对象的“中心”是什么?

    当我使用 Blender 对对象进行建模时 我能够明确定义其发生平移和旋转的中心位置 当使用 Three js 对象时 我似乎没有找到等效的对象 Three js 对象是否具有定义其 中心 位置的属性 如果不是 物体的中心是如何确定的 在
  • Three.js canvas.toDataURL 有时为空

    我正在尝试使用 html2canvas js 渲染 THREE js 场景 一些覆盖的 HTML 元素 有用大多数时候 但并非一直如此 在失败的情况下 将渲染 HTML 元素 背景 覆盖层等 但不会渲染其他元素 THREE js 场景表现得
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2

随机推荐

  • gcc头文件库文件搜索路径问题

    参考资料 http hi baidu com relayon blog item 95aaf7fcf8e3edf5fc037f89 html 我们编写程序的时候会用到三个东西 头文件 链接时候库文件 运行时动态库文件 对于上面3中 我认为头
  • Linux运维之pacemaker+corosync实现集群管理(负载均衡、配置fence服务)

    前言 高可用集群 是指以减少服务中断 如因服务器宕机等引起的服务中断 时间为目的的服务器集群技术 简单的说 集群就是一组计算机 它们作为一个整体向用户提供一组网络资源 这些单个的计算机系统就是集群的节点 高可用集群的出现是为了减少由计算机硬
  • google jib容器打包工具试用

    简介 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库 以 Maven 和 Gradle 插件形式提供 通过 Jib Java 开发者可以使用他们熟悉的 Java 工具来构建容器 Jib
  • 20171009离线赛总结

    考试时的思路 第一题 直接枚举 正着循环 倒着循环 求出每个点对应的L和R 第二题 20 32 2017 10 9 看了半天 把所有可能的区间预处理出来 dfs 第三题 30分的话 用二进制枚举 看一条边取还是不取 可以先把链的写了 输入的
  • Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法

    缓存是一个计算机思维 对于重复的计算 缓存其结果 下次再算这个任务的时候 不去真正的计算 而是直接返回结果 能加快处理速度 当然有些会随时间改变的东西 缓存会失效 得重新计算 在计算中 缓存算法 通常也称为缓存替换算法或缓存替换策略 是优化
  • mPython入门指南--第2课:esptool刷写esp8266固件

    一 材料 1 win10 非ghost版 我的是 2 esp8266带ch340g串口模块 安装好串口驱动 并记下串口号 我的是COM4 二 刷固件过程 1 安装python2 此处敲黑板 只能是python2 因为esptool只支持py
  • Qt中的进度指示器实现——使用QProgressBar生成进度条

    Qt中的进度指示器实现 使用QProgressBar生成进度条 在Qt中 要实现一个进度指示器 Progress Indicator 我们可以使用QProgressBar类来生成一个进度条 QProgressBar是Qt提供的用于显示进度的
  • markdown文字编辑

    markdown字体类html代码简介 1 颜色 2 大小 3 字体 4 背景色 4 居中 颜色 在markdown中采用如下方式能够控制文字的颜色 浅红色文字 font color dd0000 浅红色文字 font br 深红色文字 f
  • 轻松编辑,惊艳构图 —《Pixelmator Pro》小技巧

    Pixelmator Pro的ML Machine Learning 裁剪是一项智能功能 可自动识别和裁剪图像中不需要的部分 使图片更美观 使用这个功能 用户只需要手动选择要保留的重要区域 然后Pixelmator Pro会使用机器学习算术
  • 算法复杂度分析,算法复杂度o(1), o(n), o(logn), o(nlogn) 时间复杂度On和空间复杂度O1是什么意思?

    https www cnblogs com TangBiao p 5856695 html https blog csdn net dazhaoDai article details 81631195 https www cnblogs c
  • BFS 迷宫问题+打印路径

    问题 定义一个二维数组N M 其中2 lt N lt 10 2 lt M lt 10 如5 5数组下所示 int maze 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表示一
  • pycharm无限制更新码

    http www lookdiv com 密码7788
  • SPI通讯的数据交互及图片显示

    这个项目耗时三个月 前两个月攻克技术难关 后一个月进行功能联调 也是我很长时间没有更新的原因 一个项目从初期的evt到最终的pvt 离不开大家的合作 从前期的prd核对到最终的项目交付 耗费了我大量心血 期间遇到的问题不计其数 所以说一个好
  • C语言数据结构篇——栈的顺序存储

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 对于计算机的学习者来说 初期的学习无疑是最迷茫和难以坚持的 中后期主要是经验和能力的提高 我也刚接触计算机1年 也在不断的探索 在CSDN写博客主要是为了分享自己的学习历程 学习方
  • STL源码阅读-functor与adapter

    为什么要用仿函数 函数指针不灵活 难以与STL其他组件配合使用 Adapter 将一个class的接口转换为另一个class的接口 使原本因接口不兼容而不能合作的classes 可以一起运作 STL中的adapter function ad
  • LocalDateTime、LocalDate、LocalTime与Date对比

    Java8以前 我们一直长期使用Date和Calendar来处理时间 而在使用Date处理日期时间问题上会存在一定的隐患 产生线程不安全的问题 最典型的就是在一定负载并发量的情况下使用SimpleDateFormat引发的线程安全性问题 如
  • strcpy_s不接受两个参数的问题

    char p new char 25 strcpy s p 20 wenmingjie 才能成功运行 而strcpy s p wenmingjie 不能 同理 strname char new char strlen str 1 strcp
  • win32 x64 x86 区别

  • JAVA引用传递导致的方法中重新赋值失败

    在工作中遇到需要对某些参数进行业务逻辑过滤处理 在原方法中过滤成功 将业务过滤代码抽成公共方法后 过滤失败 当时情况如下 原代码 public static void main String args Boolean filter true
  • three.js 用中文字作为贴图

    面的内容使用canvas2drenderer 目前已经废弃 如果不想用这个可以直接 看2019年8月份补充的内容 闲来无事 把three js其中有一个例子改了一下 变成从一个中心点喷射出中文字的例子 效果图 可以在codePen上查看效果