Canvas绘制

news2024/12/28 17:38:14

Canvas绘制

  • 一、介绍
    • 效果图
  • 二、画圆
    • 1 写一个页面
    • 2 画一个圆(点)
    • 3 效果
  • 三 画直线
    • 1 写一个页面
    • 2 画直线
    • 3 效果
  • 四 用直线连接两个点
    • 1 写一个页面
    • 2 连线
    • 3 效果
  • 五 画随机点
    • 1 写一个页面
    • 2 随机点
    • 3 效果
  • 六 画随机点并连线
    • 1 写一个页面
    • 2 画点连线
    • 3 效果
  • 七 动起来(动画)
    • 1 写一个页面
    • 2 动起来
    • 3 效果
  • 八 添加鼠标
    • 1 写一个页面
    • 2 添加鼠标
    • 3 效果
  • 九 鼠标吸附
    • 1 写一个页面
    • 2 鼠标吸附
    • 3 效果

Canvas是HTML5新增的一个元素,它提供了JS绘制图形的API。

一、介绍

Canvas常用的4种API:

  • 画直线 lineTo
  • 画弧线 arc
  • 画文字 fillText 或 strokeText
  • 画图片 drawImage

今日任务:手撸下面的动图(使用了弧线,直线,鼠标监听,动画)

  • 编写步骤:
画点 --> 画线 -> 随机N个点 -> 所有点连线 -> 动画 -> 鼠标进入/移出 -> 鼠标吸附 -> 完成

效果图

在这里插入图片描述

二、画圆

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 画一个圆(点)

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');

// 初始化画布
function init() {
    cvs.width = window.innerWidth;
    cvs.height = window.innerHeight;
}

init()

// 画一个空心圆
ctx.beginPath();
// xy 圆心坐标, 半径, 起始角度,结束角度
ctx.arc(100,50,6,0,2 * Math.PI)
// 描边颜色
ctx.strokeStyle = '#fff';
// 画 描边
ctx.stroke();


// 画一个实心圆
ctx.beginPath();
// xy 圆心坐标, 半径, 起始角度,结束角度
ctx.arc(200,100,6,0,2 * Math.PI)
// 填充颜色
ctx.fillStyle = '#fff';
// 画 填充
ctx.fill();

3 效果

在这里插入图片描述

三 画直线

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 画直线

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');

// 初始化画布
function init() {
    cvs.width = window.innerWidth;
    cvs.height = window.innerHeight;
}

init()

// 开启画路径
ctx.beginPath();
// 将画笔移动到此处 开始画
ctx.moveTo(100,50);
// 画笔经过的点
ctx.lineTo(200,100);
ctx.lineTo(300,300);
ctx.lineTo(300,500);
// 关闭路径(首位自动相连)
ctx.closePath();
// // 描边颜色
// ctx.strokeStyle = '#fff';
// // 画 描边
// ctx.stroke(); 

// 填充颜色
ctx.fillStyle = '#fff';
// 画 填充
ctx.fill();

3 效果

在这里插入图片描述在这里插入图片描述

四 用直线连接两个点

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 连线

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');

// 初始化画布
function init() {
    cvs.width = window.innerWidth;
    cvs.height = window.innerHeight;
}

init()

// 开启画路径
ctx.beginPath();
ctx.moveTo(100,100);
ctx.lineTo(300,200);
ctx.strokeStyle = '#fff'
ctx.stroke();

// 画点 ()
ctx.beginPath();
ctx.arc(100,100,6,0,2 * Math.PI);
ctx.fillStyle='#fff';
ctx.fill();

ctx.beginPath();
ctx.arc(300,200,6,0,2 * Math.PI);
ctx.fillStyle='#fff';
ctx.fill();

3 效果

在这里插入图片描述

五 画随机点

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 随机点

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');
// 点数量
const pointNumber = 88;
// 初始化画布
function init() {
    cvs.width = window.innerWidth * devicePixelRatio;
    cvs.height = window.innerHeight * devicePixelRatio;
}
init()

/**
 * 获取[min, max]范围内的随机整数
 */
function getRandom(min, max) {
    return Math.floor(Math.random() * (max + 1 - min) + min)
}

/**
 * 画点
 * 随机生成点坐标
 */
class Point {
    //构造
    constructor() {
        this.r = 6;
        this.x = getRandom(0,cvs.width - this.r / 2)
        this.y = getRandom(0,cvs.height - this.r / 2)
    }
    // 开始画
    draw(){
        //画点
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2 * Math.PI);
        ctx.fillStyle='rgb(200,200,200)';
        ctx.fill();
        this.lastDrawTime = Date.now();
    }
}

class Graph{
    constructor() {
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
    }

    draw(){
        for (let i = 0; i < this.points.length; i++) {
            const p1 = this.points[i];
            p1.draw();
        }
    }
}

const g = new Graph();
g.draw();

3 效果

在这里插入图片描述

六 画随机点并连线

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 画点连线

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');
// 点数量
const pointNumber = 88;
// 两点连线最大距离
const maxDis = 150;

// 初始化画布
function init() {
    cvs.width = window.innerWidth * devicePixelRatio;
    cvs.height = window.innerHeight * devicePixelRatio;
}

init()

/**
 * 获取[min, max]范围内的随机整数
 */
function getRandom(min, max) {
    return Math.floor(Math.random() * (max + 1 - min) + min)
}

/**
 * 画点
 * 随机生成点坐标
 */
class Point {
    //构造
    constructor() {
        this.r = 6;
        this.x = getRandom(0,cvs.width - this.r / 2)
        this.y = getRandom(0,cvs.height - this.r / 2)
    }
    // 开始画
    draw(){
        //画点
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2 * Math.PI);
        ctx.fillStyle='rgb(200,200,200)';
        ctx.fill();
        this.lastDrawTime = Date.now();
    }
}

class Graph{
    constructor() {
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
    }

    draw(){
        for (let i = 0; i < this.points.length; i++) {
            const p1 = this.points[i];
            p1.draw();
            for (let i = 0; i < this.points.length; i++) {
                const p1 = this.points[i];

                for (let j = 0; j < this.points.length; j++) {
                    const p2 = this.points[j];
                    // 计算两点间距离(利用直角三角形  a方 = b方 = c方, c就是两点间距离)
                    const d = Math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2)
                    if(d > maxDis){
                        continue;
                    }

                    ctx.beginPath();
                    ctx.moveTo(p1.x,p1.y);
                    ctx.lineTo(p2.x, p2.y);
                    ctx.strokeStyle = `rgba(200,200,200, ${1 - d / maxDis})`
                    ctx.stroke();
                }


            }
        }
    }
}

const g = new Graph();
g.draw();

3 效果

在这里插入图片描述

七 动起来(动画)

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 动起来

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');
// 点数量
const pointNumber = 88;
// 两点连线最大距离
const maxDis = 150;
// 初始化画布
function init() {
    cvs.width = window.innerWidth * devicePixelRatio;
    cvs.height = window.innerHeight * devicePixelRatio;
}

init()

/**
 * 获取[min, max]范围内的随机整数
 */
function getRandom(min, max) {
    return Math.floor(Math.random() * (max + 1 - min) + min)
}

/**
 * 画点
 * 随机生成点坐标
 */
class Point {
    //构造
    constructor() {
        this.r = 2;
        this.x = getRandom(0,cvs.width - this.r / 2)
        this.y = getRandom(0,cvs.height - this.r / 2)

        this.xSpeed = getRandom(-50,50);
        this.ySpeed = getRandom(-50,50);
        this.lastDrawTime = null;
    }
    // 开始画
    draw(){
        //更新坐标
        if(this.lastDrawTime){
            const duration = (Date.now() - this.lastDrawTime) / 1000;
            //距离
            const xDis = this.xSpeed * duration,
                yDis = this.ySpeed * duration;
            // 新的坐标
            let x = this.x + xDis,
                y = this.y + yDis;
            // 点到边界回弹
            if(x > cvs.width - this.r / 2){
                x = cvs.width - this.r / 2
                this.xSpeed = -this.xSpeed;
            }else if(x < 0){
                x = 0;
                this.xSpeed = -this.xSpeed;
            }
            if(y > cvs.height - this.r / 2){
                y = cvs.height - this.r / 2
                this.ySpeed = -this.ySpeed;
            }else if(y < 0){
                y = 0;
                this.ySpeed = -this.ySpeed;
            }

            this.x = x;
            this.y = y;
        }

        //画点
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2 * Math.PI);
        ctx.fillStyle='rgb(200,200,200)';
        ctx.fill();
        this.lastDrawTime = Date.now();
    }
}



class Graph{
    constructor() {
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
    }

    draw(){
        requestAnimationFrame(() => {
            this.draw()
        })
        // 清除画布
        ctx.clearRect(0,0,cvs.width,cvs.height)

        for (let i = 0; i < this.points.length; i++) {
            const p1 = this.points[i];
            p1.draw();

            for (let j = 0; j < this.points.length; j++) {
                const p2 = this.points[j];
                // 计算两点间距离(利用直角三角形  a方 = b方 = c方, c就是两点间距离)
                const d = Math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2)
                if(d > maxDis){
                    continue;
                }

                ctx.beginPath();
                ctx.moveTo(p1.x,p1.y);
                ctx.lineTo(p2.x, p2.y);
                ctx.strokeStyle = `rgba(200,200,200, ${1 - d / maxDis})`
                ctx.stroke();
            }


        }
    }
}

const g = new Graph();
g.draw();

3 效果

不上动图了,还要制作gif,麻烦…
在这里插入图片描述

八 添加鼠标

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 添加鼠标

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');
//鼠标最后的坐标
let mouseLastX = 0;
let mouseLastY = 0;
// 点数量
const pointNumber = 88;
// 两点连线最大距离
const maxDis = 150;
// 初始化画布
function init() {
    cvs.width = window.innerWidth * devicePixelRatio;
    cvs.height = window.innerHeight * devicePixelRatio;

    // 鼠标移动事件
    cvs.addEventListener('mousemove', function(event) {
        // 鼠标进入 怎加鼠标 点,
        var canvasRect = cvs.getBoundingClientRect();
        var mouseX = event.clientX - canvasRect.left;
        var mouseY = event.clientY - canvasRect.top;
        // console.log("鼠标在canvas中的坐标:(" + mouseX + ", " + mouseY + ")");
        const d = Math.sqrt((mouseLastX-mouseX)**2 + (mouseLastY-mouseY)**2)
        // 移动距离
        if(d > 5){
            if(g.points.length > pointNumber){
                g.points.pop();
            }
            g.points.push(new Point(mouseX,mouseY,0));
            mouseLastX = mouseX;
            mouseLastY = mouseY;
        }
    });

    // 添加鼠标离开事件监听器
    cvs.addEventListener('mouseleave', function(event) {
        g.points.pop();
        mouseLastX = 0;
        mouseLastY = 0;
    });
}

init()

/**
 * 获取[min, max]范围内的随机整数
 */
function getRandom(min, max) {
    return Math.floor(Math.random() * (max + 1 - min) + min)
}

/**
 * 画点
 * 随机生成点坐标
 */
class Point {
    //构造
    constructor(x = null,y = null, r = 2) {
        this.r = r;
        if(x == null){
            this.x = getRandom(0,cvs.width - this.r / 2)
            this.y = getRandom(0,cvs.height - this.r / 2)
        }else{
            this.x =x;
            this.y =y;
        }

        this.xSpeed = getRandom(-50,50);
        this.ySpeed = getRandom(-50,50);;
        this.lastDrawTime = null;
    }
    // 开始画
    draw(isUpdate = true){
        // 是否需要更新坐标
        if(isUpdate){
            //更新坐标
            if(this.lastDrawTime){
                const duration = (Date.now() - this.lastDrawTime) / 1000;
                //距离
                const xDis = this.xSpeed * duration,
                    yDis = this.ySpeed * duration;
                // 新的坐标
                let x = this.x + xDis,
                    y = this.y + yDis;
                // 点到边界回弹
                if(x > cvs.width - this.r / 2){
                    x = cvs.width - this.r / 2
                    this.xSpeed = -this.xSpeed;
                }else if(x < 0){
                    x = 0;
                    this.xSpeed = -this.xSpeed;
                }
                if(y > cvs.height - this.r / 2){
                    y = cvs.height - this.r / 2
                    this.ySpeed = -this.ySpeed;
                }else if(y < 0){
                    y = 0;
                    this.ySpeed = -this.ySpeed;
                }

                this.x = x;
                this.y = y;
            }
        }

        //画点
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2 * Math.PI);
        ctx.fillStyle='rgb(200,200,200)';
        ctx.fill();
        this.lastDrawTime = Date.now();
    }
}

class Graph{
    constructor() {
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
    }

    draw(){
        requestAnimationFrame(() => {
            this.draw()
        })
        // 清除画布
        ctx.clearRect(0,0,cvs.width,cvs.height)

        for (let i = 0; i < this.points.length; i++) {
            const p1 = this.points[i];
            // 最后一个是鼠标,不更新坐标
            p1.draw(i < pointNumber);

            for (let j = 0; j < this.points.length; j++) {
                const p2 = this.points[j];
                // 计算两点间距离(利用直角三角形  a方 = b方 = c方, c就是两点间距离)
                const d = Math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2)
                if(d > maxDis){
                    continue;
                }

                ctx.beginPath();
                ctx.moveTo(p1.x,p1.y);
                ctx.lineTo(p2.x, p2.y);
                ctx.strokeStyle = `rgba(200,200,200, ${1 - d / maxDis})`
                ctx.stroke();
            }


        }
    }
}

const g = new Graph();
g.draw();

3 效果

在这里插入图片描述

九 鼠标吸附

1 写一个页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas {
            position: fixed;
            left: 0px;
            top: 0px;
            background: #222;
        }
    </style>
</head>
<body>
    <canvas></canvas>
    <script src="./canvasjs03.js"></script>
</body>
</html>

2 鼠标吸附

// 在画布上画 随机点,点与点之间连线,鼠标移动,鼠标移出,吸附   例子

// 获取画布
const cvs = document.querySelector('canvas');
// 获取画笔
const ctx = cvs.getContext('2d');
//鼠标最后的坐标
let mouseLastX = 0;
let mouseLastY = 0;
// 点数量
const pointNumber = 88;
// 两点连线最大距离
const maxDis = 150;
// 初始化画布
function init() {
    cvs.width = window.innerWidth * devicePixelRatio;
    cvs.height = window.innerHeight * devicePixelRatio;

    // 鼠标移动事件
    cvs.addEventListener('mousemove', function(event) {
        // 鼠标进入 怎加鼠标 点,
        var canvasRect = cvs.getBoundingClientRect();
        var mouseX = event.clientX - canvasRect.left;
        var mouseY = event.clientY - canvasRect.top;
        // console.log("鼠标在canvas中的坐标:(" + mouseX + ", " + mouseY + ")");
        const d = Math.sqrt((mouseLastX-mouseX)**2 + (mouseLastY-mouseY)**2)
        // 移动距离
        if(d > 2){
            if(g.points.length > pointNumber){
                //移除鼠标  点
                g.points.pop();
            }
            //添加鼠标  点
            g.points.push(new Point(mouseX,mouseY,0));

            // 鼠标移动 吸附效果()
            if(mouseLastX > 0){
                // 最后一个是 鼠标  不计算
                for (let i = 0; i < g.points.length - 1; i++) {
                    const p0 = g.points[i];
                    // 计算点与鼠标的距离
                    const d0 = Math.sqrt((p0.x-mouseX)**2 + (p0.y-mouseY)**2)
                    // 在鼠标附近的点  进入 吸附效果
                    if(d0 < maxDis && d0 > maxDis-50){
                        // 计算xy 是加是减
                        p0.x > mouseX ? p0.x -= 2 : p0.x += 2;
                        p0.y > mouseY ? p0.y -= 2 : p0.y += 2;
                        // // 无需重画
                        // p0.draw();
                    }
                }
            }
            //记录鼠标坐标
            mouseLastX = mouseX;
            mouseLastY = mouseY;
        }
    });

    // 添加鼠标离开事件监听器
    cvs.addEventListener('mouseleave', function(event) {
        // 移出鼠标 点
        g.points.pop();
        mouseLastX = 0;
        mouseLastY = 0;
    });
}

init()

/**
 * 获取[min, max]范围内的随机整数
 */
function getRandom(min, max) {
    return Math.floor(Math.random() * (max + 1 - min) + min)
}

/**
 * 画点
 * 随机生成点坐标
 */
class Point {
    /**
     * 构造
     * @param x 点x坐标
     * @param y 点y左边
     * @param r 点半径
     */
    constructor(x = null,y = null, r = 2) {
        this.r = r;
        if(x == null){
            this.x = getRandom(0,cvs.width - this.r / 2)
            this.y = getRandom(0,cvs.height - this.r / 2)
        }else{
            this.x =x;
            this.y =y;
        }
        // 点随机变化位置时的 步长
        this.xSpeed = getRandom(-50,50);
        this.ySpeed = getRandom(-50,50);
        this.lastDrawTime = null;
    }
    // 开始画
    draw(isUpdate = true){
        // 是否需要更新坐标
        if(isUpdate){
            //更新坐标
            if(this.lastDrawTime){
                const duration = (Date.now() - this.lastDrawTime) / 1000;
                //距离
                const xDis = this.xSpeed * duration,
                    yDis = this.ySpeed * duration;
                // 新的坐标
                let x = this.x + xDis,
                    y = this.y + yDis;

                // 点到边界回弹
                if(x > cvs.width - this.r / 2){
                    x = cvs.width - this.r / 2
                    this.xSpeed = -this.xSpeed;
                }else if(x < 0){
                    x = 0;
                    this.xSpeed = -this.xSpeed;
                }
                if(y > cvs.height - this.r / 2){
                    y = cvs.height - this.r / 2
                    this.ySpeed = -this.ySpeed;
                }else if(y < 0){
                    y = 0;
                    this.ySpeed = -this.ySpeed;
                }

                this.x = x;
                this.y = y;
            }
        }

        //画点
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2 * Math.PI);
        ctx.fillStyle='rgb(200,200,200)';
        ctx.fill();
        this.lastDrawTime = Date.now();
    }
}


/**
 * 画线
 */
class Graph{
    constructor() {
        // 生成 pointNumber 个点
        this.points = new Array(pointNumber).fill(0).map(() => new Point())
    }

    draw(){
        /**
         * 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行
         */
        requestAnimationFrame(() => {
            this.draw()
        })
        // 清除画布
        ctx.clearRect(0,0,cvs.width,cvs.height)

        for (let i = 0; i < this.points.length; i++) {
            const p1 = this.points[i];
            // 最后一个是鼠标,不更新坐标
            p1.draw(i < pointNumber);

            // 链接两点间 直线
            for (let j = 0; j < this.points.length; j++) {
                const p2 = this.points[j];
                // 计算两点间距离(利用直角三角形  a方 = b方 = c方, c就是两点间距离)
                const d = Math.sqrt((p1.x-p2.x)**2 + (p1.y-p2.y)**2)
                if(d > maxDis){
                    continue;
                }

                ctx.beginPath();
                ctx.moveTo(p1.x,p1.y);
                ctx.lineTo(p2.x, p2.y);
                ctx.strokeStyle = `rgba(200,200,200, ${1 - d / maxDis})`
                ctx.stroke();
            }
        }
    }
}

const g = new Graph();
g.draw();

3 效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1461640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE使用 Sentinel-1 SAR影像 和 Otsu 方法绘制洪水地图

洪水是世界上最常见、破坏性最大的自然灾害之一,造成了巨大的生命和财产损失。此外,随着气候变化的影响,近年来,洪灾变得更加频繁和不可预测。为了最大限度地减少生命和财产损失,必须迅速发现洪水蔓延的情况,并及时采取必要的干预措施。洪水蔓延探测大多使用光学传感器或…

如何批量注册多个Google账号?

电子邮件地址对于在线帐户至关重要&#xff0c;但它们可能被滥用于发送垃圾邮件。因此Google使用先进的算法来检测可疑的注册和验证尝试&#xff0c;保护用户免受垃圾邮件和其他有害活动的侵害&#xff0c;所以如果需要批量注册多个Google帐户&#xff0c;需要做好账号防关联&a…

QT 文本编辑框textBrowser接收数据保持光标在底部的方法

目录 1.实现效果2.代码 1.实现效果 2.代码 右键textBrowser加入触发信号textChanged&#xff1a; 双击&#xff0c;跳转到槽函数&#xff1a;(文本更改时执行该函数) void Widget::updata_textBrowser() void Widget::on_textBrowser_textChanged() {//光标移动至底部ui->…

Py之pydantic:pydantic的简介、安装、使用方法之详细攻略

Py之pydantic&#xff1a;pydantic的简介、安装、使用方法之详细攻略 目录 pydantic的简介 1、Pydantic V1.10 vs. V2 pydantic的安装 pydantic的使用方法 1、简单的示例 pydantic的简介 pydantic是使用Python类型提示进行数据验证。快速且可扩展&#xff0c;Pydantic与您…

【云原生】Docker 安全与CA证书生成

目录 容器的安全行问题 Docker 容器与虚拟机的区别 Docker 存在的安全问题 1.Docker 自身漏洞 2.Docker 源码问题 Docker 架构缺陷与安全机制 1. 容器之间的局域网攻击 2. DDoS 攻击耗尽资源 3. 有漏洞的系统调用 4. 共享root用户权限 Docker 安全基线标准 1. 内…

【UI自动化】八大元素定位方式|xpath css id name...

目录 一、基础元素定位 二、cssSelector元素定位——通过元素属性定位 三、xpath元素定位——通过路径 1 、xpath绝对定位 &#xff08;用的不多&#xff09; 缺点&#xff1a;一旦页面结构发生变化&#xff08;比如重新设计时&#xff0c;路径少两节&#xff09;&#x…

HGAME 2024 WEEK 2

hgame2024官方题解-week2.pdf Misc ek1ng_want_girlfriend 打开流量包后点击“导出对象” 打开这张图片就是flag Web What the cow say?

粉丝2000 啦,选对赛道,做正确的事情,粉丝涨到2000说明大家对我做的事情还是非常的认可的,继续坚持中,将相关资料做了视频整理

1&#xff0c;见证历史成长&#xff0c;粉丝涨到 2000 啦 2&#xff0c;把视频进行分类&#xff0c;研究xinference相关视频 【xinference】&#xff08;1&#xff09;&#xff1a;在autodl上&#xff0c;使用xinference部署chatglm3大模型&#xff0c;支持函数调用&#xff0…

(一)全连接神经网络

参考资料&#xff1a;https://zhuanlan.zhihu.com/p/273595649 一、前向传播 1、第一层 &#xff08;1&#xff09;线性层 { z 1 ( 1 ) w 11 ( 1 ) ∗ x 1 w 12 ( 1 ) ∗ x 2 b 1 ( 1 ) z 2 ( 1 ) w 21 ( 1 ) ∗ x 1 w 22 ( 1 ) ∗ x 2 b 2 ( 1 ) z 3 ( 1 ) w 31 ( …

CCF-B类SGP‘24 4月10日截稿!速速行动!

会议之眼 快讯 第22届SGP(Eurographics Symposium on Geometry Processing)即欧洲图形学几何处理专题讨论会将于 2024 年 6月24 -日至26日在美国麻省理工学院举行&#xff01;SGP是传播几何处理新研究想法和尖端成果的首要学术会议。作为该领域的重要学术盛事&#xff0c;SGP会…

IO 作业 24/2/21

1、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 #include <myhead.h> //定义分支线程1 void *task1(void *arg) {int fdr-1;//只读打开被复制文件if((fdropen("./111.txt…

sora生成高质量视频的原理

Sora是怎样生成视频的&#xff1f; 写在前面 Sora 是 OpenAI 在日前发布的超强视频生成 AI&#xff0c;旨在探索 AI 如何在理解真实世界运动和交互方面做得更好Sora目前无灰度体验 面临挑战 Sora面对的挑战就像是需要处理和理解来自世界各地、不同设备拍摄的数以百万计的图…

Java SourceDataLine 播放MP3音频 显示频谱

Java SourceDataLine 播放MP3音频 显示频谱 1 添加依赖2 快速傅里叶变换2.1 FFT.java2.2 Complex.java 3 音频播放3.1 Player.java3.1 XPlayer.java 4 显示频谱5 结果 项目Value音频格式 添加依赖*.wav(JDK 原生支持)*.pcm(JDK 原生支持)*.au(JDK 原生支持)*.aiff(JDK 原生支持…

2024 年 6 个变革性大型机预测

当今数字经济中组织的成功需要速度&#xff0c;即通过新应用程序和服务快速响应市场趋势、即时访问关键数据以及在问题影响服务之前解决问题的能力。进入新的一年&#xff0c;大型机上新兴技术的采用和适应将使企业能够拥抱不断变化的市场力量&#xff0c;并将其转化为竞争优势…

JVM对象的创建流程与内存分配

对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程 加载 验证 解析 准备 初始化 使用 写在 对象内存分配方式 内存分配…

C语言系列(所需基础:大学C语言及格)-3-字符串/ASCII码表

文章目录 一、字符串二、ASCII码表 一、字符串 用" "来定义字符串&#xff1a; #include <stdio.h>int main() {"";//空字符串"hkl";//由""定义的字符串return(0); }用数组来存储字符串&#xff0c;并打印&#xff1a; #incl…

箱形理论在交易策略中的实战应用与优化

箱形理论&#xff0c;简单来说&#xff0c;就是将价格波动分成一段一段的方框&#xff0c;研究这些方框的高点和低点&#xff0c;来推测价格的趋势。 在上升行情中&#xff0c;价格每突破新高价后&#xff0c;由于群众惧高心理&#xff0c;可能会回跌一段&#xff0c;然后再上升…

jenkins远程触发构建报:Error 403 No valid crumb was included in the request

最近在跨jenkins触发构建的时候发现不能触发相应的项目&#xff0c;报如下图错误 解决方案&#xff1a; 1、安装Build Authorization Token Root Plugin插件 安装完成后去配置API Token&#xff0c;用户列表&#xff0c;配置用户的API Token&#xff0c;生成后记得保存 2、项…

Windows Server 2012 安装

1.镜像安装 镜像安装:Windows Server 2012 2.安装过程(直接以图的形式呈现) 2012激活秘钥:J7TJK-NQPGQ-Q7VRH-G3B93-2WCQD

【flutter】第一个flutter项目

前言 我们通过Android Studio来创建flutter项目。 安装dart和flutter插件 新版编译器需要先安装flutter插件才能构建flutter项目。 项目目录 我们基本就在lib中写代码 项目启动