webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)

这篇具有很好参考价值的文章主要介绍了webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构

⭐前言

大家好,我是yma16,本文分享webgl canvas系列——animation基本旋转、平移、缩放。
该系列往期文章
web canvas系列——快速入门上手绘制二维空间点、线、面
webgl canvas系列——快速加背景、抠图、加水印并下载图片

⭐canvas绘制图片

💖状态保存和恢复

方法 作用
save() 保存画布 (canvas) 的所有状态。
restore() save 和 restore 方法是用来保存和恢复 canvas 状态的,都没有参数。Canvas 的状态就是当前画面应用的所有样式和变形的一个快照。

💖移动、旋转、缩放、变形

方法 作用
translate(x, y) webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构x *是左右偏移量,y 是上下偏移量
scale(x, y) scale方法可以缩放画布的水平和垂直的单位。两个参数都是实数,可以为负数,x 为水平缩放因子,y 为垂直缩放因子,如果比 1 小,会缩小图形,如果比 1 大会放大图形。默认值为 1,为实际大小
transform(a, b, c, d, e, f) 将当前的变形矩阵乘上一个基于自身参数的矩阵

a c e b d f 0 0 1 (transform) \begin{matrix} a & c & e \\ b & d & f \\ 0 & 0 & 1 \end{matrix} \tag{transform} ab0cd0ef1(transform)

💖移动绘制一个渐变的box

使用translate移动
js代码快如下

function draw() {
    var ctx = document.getElementById("canvas").getContext("2d");
    const width=150
    const height=150
    for (var i = 0; i < 3; i++) {
      for (var j = 0; j < 3; j++) {
        ctx.save();
        ctx.fillStyle = "rgb(" + 51 * i + ", " + (255 - 51 * i) + ", 255)";
        ctx.translate(10+ j * (width+1), 10 + i * (height+1));
        ctx.fillRect(0, 0, width, height);
        ctx.restore();
      }
    }
  }

效果
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构

💖旋转

先移动原点再旋转
旋转一个正方形

  function draw() {
    const ctx = document.getElementById("canvas").getContext("2d");

    const xRectX=100
    const yRextY=100

    const width=100
    const height=100

    ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
    ctx.beginPath();
    ctx.arc(xRectX, yRextY, 10, 0, Math.PI * 2, true); // 旋转中心
    ctx.fill();
    ctx.restore();
    // ctx.save();


    const translateX=xRectX+width/2
    const translateY=yRextY-height/4
  
    // left rectangles, rotate from canvas origin

    // blue rect
    ctx.fillStyle = "#0095DD";
    ctx.fillRect(xRectX, yRextY, width, height);



    ctx.fillStyle = "rgba(255, 0, 200, 0.5)";
    ctx.beginPath();
    ctx.arc(translateX, translateY, 10, 0, Math.PI * 2, true); // 旋转中心
    ctx.fill();
   
    ctx.translate(translateX, translateY); // translate back
    ctx.rotate((Math.PI / 180) * 45);
    // red rect
    ctx.fillStyle = "rgba(255,0,0,.2)";
    ctx.fillRect(0, 0, width, height);
    ctx.restore();

  }

旋转效果
蓝色的圆点移动到红色的点之后再旋转45°
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构
移动中心 再旋转

function draw() {
    const ctx = document.getElementById("canvas").getContext("2d");

    const xRectX = 100
    const yRextY = 100

    const width = 100
    const height = 100

    ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
    ctx.beginPath();
    ctx.arc(xRectX, yRextY, 10, 0, Math.PI * 2, true); // 旋转中心
    ctx.fill();
    ctx.restore();
    // ctx.save();

    // x = x + 0.5 * width
    // y = y + 0.5 * height
    const translateX = xRectX + width / 2
    const translateY = yRextY + height / 2

    // left rectangles, rotate from canvas origin

    // blue rect
    ctx.fillStyle = "#0095DD";
    ctx.fillRect(xRectX, yRextY, width, height);



    ctx.translate(translateX, translateY);
    ctx.rotate((Math.PI / 180) * 45);

    ctx.translate(-translateX, -translateY);


    // ctx.translate(translateX, translateY); // translate back

    // red rect
    ctx.fillStyle = "rgba(255,0,0,.2)";
    ctx.fillRect(xRectX, xRectX, width, height);


    ctx.fillStyle = "rgba(255, 0, 200, 0.5)";
    ctx.beginPath();
    ctx.arc(translateX, translateY, 10, 0, Math.PI * 2, true); // 旋转中心
    ctx.fill();

}

效果(红点为旋转中心)
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构

💖缩放

缩放文字

function draw() {
    var ctx = document.getElementById("canvas").getContext("2d");
    // mirror horizontally
    ctx.scale(2, 2);
    ctx.font = "48px serif";
    ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
    ctx.fillText("csdn yma16", 0, 120);
  }

webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构

⭐模拟冒泡排序过程

冒泡排序(Bubble Sort)
是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

vue3页面简单使用canvas模拟冒泡排序的效果

<script lang="js" setup>
import { reactive, onMounted } from 'vue';
const state = reactive({
    value: '[100,20,69,16,55,33]',
    title: '冒泡排序可视化',
    visualSortArray: [

    ]
})


function bubbleSort(arr) {
    // 冒泡排序算法,对数组进行排序,同时记录每一步操作,保存在一个数组中
    function sort() {
        // virtualArr 用来存放 每一个步内容的数组
        const virtualArr = [arr.slice()];
        console.log('virtualArr', virtualArr)
        const max = arr.length;
        for (let i = 0; i < max; i++) {
            let done = true;
            for (let j = 0; j < max - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    let temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    done = false;
                    virtualArr.push(arr.slice());
                }
            };
            if (done) {
                break;
            };
        }
        return virtualArr;
    }

    // 绘画,调用一次就画出一步的图像 
    function darw(arr, count) {
        const canvas = document.getElementById('myCanvas');
        const ctx = canvas.getContext('2d');
        
        // 最大高度 400
        let maxHeight = canvas.height;
        // 每个长方形的宽度
        let width = 20;
        // 每个长方形之间的间隔
        let space = 100;

        const total = arr.reduce((p, c) => p + c, 0)

        // 清空画布
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        // 设置字体
        ctx.font = "18px serif";
        // 在页面上,画出一步的内容
        for (let i = 0; i < arr.length; i++) {
            ctx.fillStyle = '#61C5FE';

            const x= i * (width + space)
            const y= maxHeight - arr[i]
            const height=Math.round((arr[i] / total)*100  + 100)
            ctx.fillRect(x, y, width, height);
            console.log('x',x)
            console.log('y',y)
            console.log('width',width)
            console.log('height',height)
            ctx.fillStyle = '#240be4';
            // 标题文字
            ctx.fillText(arr[i], x, y);
            ctx.restore();
        }

        ctx.fillText(`${count}趟排序`, 200, 100);


        ctx.fillStyle = "rgba(0, 66, 200, 0.5)";
        ctx.beginPath();
        ctx.lineTo(0, 400);
        ctx.lineTo(800, 400);
        ctx.stroke()
    }

    // 动画 
    function animation() {
        // 调用sort 方法,返回包括每一步内容的数组
        var virtualArr = sort();
        var interval = 500;
        // 遍历得到的数组,每隔500ms,调用darw 方法,画出一步内容
        virtualArr.forEach((item, index) => {
            setTimeout(() => darw(item, index + 1), index * interval);
        });

        state.visualSortArray = virtualArr
    }

    animation();
}




const sortBtn = () => {

    const arr = state.value.replace('[', '').replace(']', '').split(',').map(n => +n)
    console.log('arr', arr)
    bubbleSort(arr);
}

onMounted(()=>{
    sortBtn()
})



</script>
<template>
    <div>

        <div style="display:flex;">
            <a-card :title="state.title" style="min-width: 800px">
                <div class="input-box">

                    <div>
                        <a-input v-model:value="state.value" placeholder="请输入数组" clearable></a-input>
                    </div>
                    <div style="margin-left:50px"><a-button type="primary" @click="sortBtn">开始排序</a-button></div>
                </div>
                <div class="container-sort">
                    <div style="text-align: right;margin-right: 20px;">
                        <div v-for="(item, index) in state.visualSortArray" :key="index">
                            <div>
                                第 {{ index + 1 }} 躺排序:  {{ item.toString() }}
                            </div>
                        </div>
                    </div>

                    <canvas id="myCanvas" width="800" height="400"> </canvas>
                </div>

            </a-card>
        </div>

    </div>
</template>

<style lang="less">
.input-box {
    display: flex;
    margin-bottom: 10px;
}

.container-sort {
    height: 800px;
    border: 1px solid #dcdcdc;
}

.box {
    margin: 10px;

    .bar {
        width: 10px;
        background: #1677ff;
        border-radius: 2px;
    }

    .num {
        font-size: 18px;
    }
}
</style>

效果
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构
inscode代码块

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程),web站点,webgl,canvas,数据结构

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 最后,感谢你的阅读!文章来源地址https://www.toymoban.com/news/detail-856861.html

到了这里,关于webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D】3D 视图操作 ( 视图基本元素 | 导航器 | 栅格 | 天空盒 | 3D 视图操作 | 视图旋转 | 视图缩放 | 视图平移 | 导航器操作 | 恢复方向 | 顶、右、前视图 )

    在 Scene 场景窗口 中 , 右上角的 是 \\\" 导航器 Gizmo \\\" , 导航器 相当于 指南针 , 表明了当前的 场景世界坐标的方向 ; 在 Scene 场景窗口 中的 格子 , 称为 \\\" 栅格 Grid \\\" , 表示的是当前 X 轴 和 Z 轴 所在的坐标平面 , 相当于大地地面 , 水平面 ; Y 轴是向上的 , 垂直与地面 , 指向天空 ;

    2024年02月05日
    浏览(44)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(61)
  • Matlab图像的平移,旋转,缩放,裁剪

    %%------------------------Matlab图像的平移,旋转,缩放,裁剪------------------------------- %-------------------头文件----------------------------- clc ; %清屏幕 clear ; %删除所有的变量 close all ; %将所有打开的图片关掉 %--------------------图像平移 imtranslate-------------------------- A = imread(\\\'1.jpg\\\') ; subplot(

    2024年02月04日
    浏览(45)
  • cesium 3DTileset的平移、旋转、缩放

    加载模型 平移和修改高度 方法一:

    2024年02月12日
    浏览(41)
  • Unity 3d角色展示脚本(旋转 平移 缩放)展示界面

    不考虑性能 很简陋的一个功能,主要是用于角色渲染的观察用,比simplecontroller要好用一点

    2024年02月11日
    浏览(56)
  • 【Unity3D】缩放、平移、旋转场景

    1 前言         场景缩放、平移、旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换。         对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那么只需要对根对象施加变换就可以实现场景变

    2023年04月22日
    浏览(57)
  • Halcon用矩阵实现图像变换(平移,旋转,缩放,镜像等)

    目录 图像变换介绍  用Halcon自带的算子实现图像变换 使用矩阵来实现相关算子的功能 一、平移 二、旋转 三、缩放 四、镜像 完整代码         在halcon中经常会用到图像变换的操作,然后这次作业是用矩阵来实现相关算子的功能,学到了挺多的所以就记录下来方便复习。

    2024年04月17日
    浏览(42)
  • opencv006图像处理之仿射变换(旋转,缩放,平移)

    空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。关键就是这个矩阵M:  平移,旋转   透视 M: 变换矩阵 desi

    2024年01月21日
    浏览(52)
  • Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要: 本篇文章主要讲解Python调用OpenCV实现图像位移操作、旋转和翻转效果,包括四部分知识:图像缩放、图像旋转、图像翻转、图像平移。 本文分享自华为云社区《[Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移》,作者:eastmount 。 本篇文章主要讲解Pyth

    2024年02月06日
    浏览(57)
  • python实现两函数通过缩放,平移和旋转进行完美拟合

    前几天在工作的时候接到了一个需求,希望将不同坐标系,不同角度的两条不规则曲线,并且组成该曲线的点集数量不一致,需求是希望那个可以通过算法的平移和旋转搞到一个概念里最贴合,拟合态进行比较。 这是初步将两组数据画到图里的情况,和背景需求是一致的。其

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包