欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript利用canvas繪制兩點(diǎn)間曲線和箭頭

 更新時(shí)間:2023年10月24日 11:08:31   作者:相信神話2021  
這篇文章主要為大家詳細(xì)介紹了Javascript如何利用canvas實(shí)現(xiàn)在兩點(diǎn)間繪制曲線和矩形,并且在矩形中繪制文字,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

Javascript利用canvas,在兩點(diǎn)間繪制曲線,矩形,并且在矩形中繪制文字,實(shí)現(xiàn)居中對(duì)齊,同時(shí)實(shí)現(xiàn)了箭頭繪制,效果如圖:

一、html代碼

代碼如下

<canvas id="canvas" width="1000" height="600"></canvas>

二、css代碼

canvas {
			    display: block;
			    width: 1000px;
			    height: 600px;
			    background: conic-gradient(#eee 25%, white 0deg 50%, #eee 0deg 75%, white 0deg) 0 / 20px 20px;
			    margin-inline: auto;
			}
			@media (max-width: 640px) {
			    canvas {
			        width: 100vw;
			        height: 60vw;
			    }    
			}

三、Javascript代碼

代碼如下

var context = document.getElementById("canvas").getContext("2d"); ;
			// 繪制尺寸
			var width = canvas.width;
			var height = canvas.height;
			
			// 兩個(gè)方塊的坐標(biāo)、尺寸,顏色等數(shù)據(jù)
			var data = [{
			    x: 800,
			    y: 180,
			    width: 200,
			    height: 50,
			    color: 'deepskyblue',
				text:"+u+ate"
			}, {
			    x: 600,
			    y: 680,
			    width: 200,
			    height: 50,
			    color: 'deeppink',
				text:"gress 邁步"
			}];
			// 繪制矩形方法
			var drawRect = function () {
			    data.forEach(function (obj) {
			        context.beginPath();
			        context.fillStyle = obj.color;
			        context.fillRect(obj.x, obj.y, obj.width, obj.height);
			        context.closePath();
					context.font="30px Verdana";
					context.fillStyle="#fff";
					console.log(context.measureText(obj.text))
					const textMetrics = context.measureText(obj.text);					 
					// 所有字在這個(gè)字體下的高度
					let fontHeight = textMetrics.fontBoundingBoxAscent + textMetrics.fontBoundingBoxDescent; 
					console.log(fontHeight)
					
					context.fillText(obj.text,0,0)
					context.fillText(obj.text,obj.x+(obj.width-context.measureText(obj.text).width)/2,obj.y+fontHeight);
			    });
				
			};
			
			// 繪制連接曲線方法
			var drawCurve = function () {
			    // 按照坐標(biāo)位置排序
			    var dataSort = data.sort(function (objA, objB) {
			        return (objA.y + objA.height) - (objB.y + objB.height);
			    });
			    // 知道上下數(shù)據(jù)
			    var from = dataSort[0];
			    var to = dataSort[1];
			    
			    // 曲線的起點(diǎn)終點(diǎn)
			    var fromX = from.x + from.width / 2;
			    var fromY = from.y + from.height;
			    var toX = to.x + to.width / 2;
			    var toY = to.y;
			    
			    // 曲線控制點(diǎn)坐標(biāo)
			    var cp1x = fromX;
			    var cp1y = fromY + (toY - fromY) / 2;
			    
			    var cp2x = toX;
			    var cp2y = toY - (toY - fromY) / 2;
			    
			    // 開始繪制曲線
			    context.beginPath();
			    context.lineWidth = 1
			    context.strokeStyle = '#000';
			    context.moveTo(fromX, fromY);
			    // 繪制曲線點(diǎn)
			    context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toX, toY);
			    context.stroke();
			};
			
			// 繪制方法
			var draw = function () {
			    context.clearRect(0, 0, width, height);			    
			     drawRect();
			     drawCurve();
			};
			
			draw();
			
			canvas_arrow(ctx, 10, 30, 200, 150); 
			canvas_arrow(ctx, 100, 200, 400, 50); 
			canvas_arrow(ctx, 200, 30, 10, 150); 
			canvas_arrow(ctx, 400, 200, 100, 50); 
			ctx.stroke(); 		 
			 
			function canvas_arrow(context, fromx, fromy, tox, toy) { 
			  var headlen = 10; // length of head in pixels 
			  var dx = tox - fromx; 
			  var dy = toy - fromy; 
			  var angle = Math.atan2(dy, dx); 
			  context.moveTo(fromx, fromy); 
			  context.lineTo(tox, toy); 
			  context.lineTo(tox - headlen * Math.cos(angle - Math.PI / 6), toy - headlen * Math.sin(angle - Math.PI / 6)); 
			  context.moveTo(tox, toy); 
			  context.lineTo(tox - headlen * Math.cos(angle + Math.PI / 6), toy - headlen * Math.sin(angle + Math.PI / 6)); 
			}

ok,代碼就是如此

完整代碼

<!DOCTYPE HTML>
<html>
	<head>
		<style>
			canvas {
			    display: block;
			    width: 1000px;
			    height: 600px;
			    background: conic-gradient(#eee 25%, white 0deg 50%, #eee 0deg 75%, white 0deg) 0 / 20px 20px;
			    margin-inline: auto;
			}
			@media (max-width: 640px) {
			    canvas {
			        width: 100vw;
			        height: 60vw;
			    }    
			}
		</style>
	</head>
	<body>
		<canvas id="canvas" width="2000" height="1200"></canvas>
		<script>
			var context = document.getElementById("canvas").getContext("2d"); ;
			// 繪制尺寸
			var width = canvas.width;
			var height = canvas.height;
			
			// 兩個(gè)方塊的坐標(biāo)、尺寸,顏色等數(shù)據(jù)
			var data = [{
			    x: 800,
			    y: 180,
			    width: 200,
			    height: 50,
			    color: 'deepskyblue',
				text:"+u+ate"
			}, {
			    x: 600,
			    y: 680,
			    width: 200,
			    height: 50,
			    color: 'deeppink',
				text:"gress 邁步"
			}];
			// 繪制矩形方法
			var drawRect = function () {
			    data.forEach(function (obj) {
			        context.beginPath();
			        context.fillStyle = obj.color;
			        context.fillRect(obj.x, obj.y, obj.width, obj.height);
			        context.closePath();
					context.font="30px Verdana";
					context.fillStyle="#fff";
					console.log(context.measureText(obj.text))
					const textMetrics = context.measureText(obj.text);					 
					// 所有字在這個(gè)字體下的高度
					let fontHeight = textMetrics.fontBoundingBoxAscent + textMetrics.fontBoundingBoxDescent; 
					console.log(fontHeight)
					
					context.fillText(obj.text,0,0)
					context.fillText(obj.text,obj.x+(obj.width-context.measureText(obj.text).width)/2,obj.y+fontHeight);
			    });
				
			};
			
			// 繪制連接曲線方法
			var drawCurve = function () {
			    // 按照坐標(biāo)位置排序
			    var dataSort = data.sort(function (objA, objB) {
			        return (objA.y + objA.height) - (objB.y + objB.height);
			    });
			    // 知道上下數(shù)據(jù)
			    var from = dataSort[0];
			    var to = dataSort[1];
			    
			    // 曲線的起點(diǎn)終點(diǎn)
			    var fromX = from.x + from.width / 2;
			    var fromY = from.y + from.height;
			    var toX = to.x + to.width / 2;
			    var toY = to.y;
			    
			    // 曲線控制點(diǎn)坐標(biāo)
			    var cp1x = fromX;
			    var cp1y = fromY + (toY - fromY) / 2;
			    
			    var cp2x = toX;
			    var cp2y = toY - (toY - fromY) / 2;
			    
			    // 開始繪制曲線
			    context.beginPath();
			    context.lineWidth = 1
			    context.strokeStyle = '#000';
			    context.moveTo(fromX, fromY);
			    // 繪制曲線點(diǎn)
			    context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, toX, toY);
			    context.stroke();
			};
			
			// 繪制方法
			var draw = function () {
			    context.clearRect(0, 0, width, height);			    
			     drawRect();
			     drawCurve();
			};
			
			draw();
			
			canvas_arrow(ctx, 10, 30, 200, 150); 
			canvas_arrow(ctx, 100, 200, 400, 50); 
			canvas_arrow(ctx, 200, 30, 10, 150); 
			canvas_arrow(ctx, 400, 200, 100, 50); 
			ctx.stroke(); 		 
			 
			function canvas_arrow(context, fromx, fromy, tox, toy) { 
			  var headlen = 10; // length of head in pixels 
			  var dx = tox - fromx; 
			  var dy = toy - fromy; 
			  var angle = Math.atan2(dy, dx); 
			  context.moveTo(fromx, fromy); 
			  context.lineTo(tox, toy); 
			  context.lineTo(tox - headlen * Math.cos(angle - Math.PI / 6), toy - headlen * Math.sin(angle - Math.PI / 6)); 
			  context.moveTo(tox, toy); 
			  context.lineTo(tox - headlen * Math.cos(angle + Math.PI / 6), toy - headlen * Math.sin(angle + Math.PI / 6)); 
			}
		</script>
	</body>
</html>

到此這篇關(guān)于Javascript利用canvas繪制兩點(diǎn)間曲線和箭頭的文章就介紹到這了,更多相關(guān)Javascript canvas內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript實(shí)現(xiàn)分頁效果

    JavaScript實(shí)現(xiàn)分頁效果

    本文主要介紹了JavaScript實(shí)現(xiàn)分頁效果的示例代碼。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • JS調(diào)用打印方法設(shè)置頁眉頁腳的實(shí)例

    JS調(diào)用打印方法設(shè)置頁眉頁腳的實(shí)例

    一個(gè)網(wǎng)頁打印相關(guān)功能的擴(kuò)展演示特效,在實(shí)現(xiàn)了打印功能外,還實(shí)現(xiàn)了打印預(yù)覽、打印前的頁眉頁腳設(shè)置,直接打印等功能,以前對(duì)JS打印前設(shè)置頁腳見的不多,所以這一個(gè)也算是挺有價(jià)值的,希望閑暇時(shí)參閱
    2013-05-05
  • JS原型和原型鏈原理與用法實(shí)例詳解

    JS原型和原型鏈原理與用法實(shí)例詳解

    這篇文章主要介紹了JS原型和原型鏈原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了js原型和原型鏈概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 詳解ES6中class的實(shí)現(xiàn)原理

    詳解ES6中class的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解ES6中class的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)JavaScript es6,感興趣的朋友可以了解下
    2020-10-10
  • JavaScript中通過提示框跳轉(zhuǎn)頁面的方法

    JavaScript中通過提示框跳轉(zhuǎn)頁面的方法

    這篇文章主要介紹了JavaScript中通過提示框跳轉(zhuǎn)頁面的方法的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能

    JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • js獲取指定日期前后的日期代碼

    js獲取指定日期前后的日期代碼

    js獲取指定日期前后的日期,在實(shí)際應(yīng)用中還是比較實(shí)用的,下面為大家簡(jiǎn)單介紹下具體的實(shí)現(xiàn)過程,有需要的朋友可以參考下
    2013-08-08
  • JavaScript獲取地址欄參數(shù)的方法實(shí)現(xiàn)

    JavaScript獲取地址欄參數(shù)的方法實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于JavaScript獲取地址欄參數(shù)的方法實(shí)現(xiàn),項(xiàng)目中經(jīng)常遇到獲取上個(gè)頁面跳轉(zhuǎn)過來獲取當(dāng)前的參數(shù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 小程序webview內(nèi)網(wǎng)頁實(shí)現(xiàn)微信支付的代碼示例

    小程序webview內(nèi)網(wǎng)頁實(shí)現(xiàn)微信支付的代碼示例

    這篇文章主要介紹了在小程序中使用webview實(shí)現(xiàn)微信支付功能,需要在小程序和webview之間進(jìn)行交互,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • 詳解babel升級(jí)到7.X采坑總結(jié)

    詳解babel升級(jí)到7.X采坑總結(jié)

    這篇文章主要介紹了詳解babel升級(jí)到7.X采坑總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05

最新評(píng)論