如何用canvans实现地图上的运动轨迹

news2024/9/25 7:23:45

 1.先需要一个地图的图片

2.通过canvas绘制出运动轨迹

 // 创建渐变
    function createGradient(context, p0, p1) {
        const gradient = context.createLinearGradient(p0.x, p0.y, p1.x, p1.y);

        gradient.addColorStop(0, "rgba(255, 0, 255, 0)");
        gradient.addColorStop(1, "rgba(255, 0, 255, 1)");

        return gradient;
    }

    // 计算二次贝塞尔曲线上的点
    function computeCurvePoint(p0, p1, p2, t) {
        return (1 - t) * (1 - t) * p0 + 2 * t * (1 - t) * p1 + t * t * p2;
    }

    // 绘制曲线
    function createCurveLine(points) {
        const gradient = createGradient(
            context,
            points[0],
            points[points.length - 1]
        );

        context.beginPath();
        context.moveTo(points[0].x, points[0].y);

        for (let i = 0; i < points.length; i++) {
            const p = points[i];
            context.lineTo(p.x, p.y);
        }

        context.moveTo(points[0].x, points[0].y);
        context.strokeStyle = '#b12225';
        context.lineCap = "round";
        context.lineWidth = 1;
        // context.shadowColor = "rgba(255, 255, 0, 1)";
        // context.shadowBlur = 1;
        context.stroke();
    }

    // 创建画布和设置宽高
    const mycanvas = document.getElementById("mycanvans");
    const context = mycanvas.getContext("2d");

    const canvasWidth = mycanvas.width;
    const canvasHeight = mycanvas.height;


    console.info(canvasWidth)
    console.info(canvasHeight)

    // mycanvas.width = canvasWidth;
    // mycanvas.height = canvasHeight;
    const lineLength = 1;

    var lines =[
        {
            p0:{x:220,y:50},
            p1:{x:100,y:-20},
            p2:{x:50,y:43},
            t0:0,
            t1:0,
            points:[],
        },

        {
            p0:{x:220,y:50},
            p1:{x:160,y:0},
            p2:{x:138,y:40},
            t0:0,
            t1:0,
            points:[],
        },

        {
            p0:{x:220,y:50},
            p1:{x:160,y:0},
            p2:{x:70,y:100},
            t0:0,
            t1:0,
            points:[],
        },

        {
            p0:{x:220,y:50},
            p1:{x:180,y:40},
            p2:{x:151,y:88},
            t0:0,
            t1:0,
            points:[],
        },

        {
            p0:{x:220,y:50},
            p1:{x:240,y:60},
            p2:{x:260,y:115},
            t0:0,
            t1:0,
            points:[],
        },


    ]


    function draw() {
        context.clearRect(0, 0, canvasWidth, canvasHeight);

        for (let i = 0; i < lines.length; i++) {
            const line = lines[i];
            var P0 = line.p0;
            var P1 = line.p1;
            var P2 = line.p2;
            if (line.t1 < lineLength) {
                line.t0 = 0;
            }

            if (line.t0 > 1 - lineLength) {
                line.t1 = 1;
            }


            const currentPoint = {
                x: computeCurvePoint(P0.x, P1.x, P2.x, line.t1),
                y: computeCurvePoint(P0.y, P1.y, P2.y, line.t1),
            };




            line.points.push(currentPoint);

            const len = line.points.length;

            context.save();
            if (len > 1) {

                createCurveLine(
                    line.points.slice(Math.floor(len * line.t0), Math.max(Math.ceil(len * line.t1), 2))
                );
            }
            context.restore();
            line.t0 += 0.005;
            line.t1 += 0.005;


            if (line.t0 > 0.5 && line.t1 > 0.5) {
                line.t0 = 0;
                line.t1 = 0;
                line.points = [];
            }
        }

        requestAnimationFrame(draw);
    }
    draw();

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

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

相关文章

颜色渐变的数据密集适用的堆叠图

一般情况会用柱状图去堆叠&#xff0c;但是如果数据量太大了&#xff0c;就可考虑这种方式堆叠。可以呈现时间和数量上不同层次数据的变化。 效果图&#xff1a; 比较详细的注释一下源码&#xff1a; import matplotlib as mpl import matplotlib.pyplot as plt import numpy …

第七章:L2JMobius学习 – 登录服务LoginServer讲解

在上一个章节中&#xff0c;我们学习了网络数据传输的封装network。那么&#xff0c;在本章的登录服务LoginServer的讲解中&#xff0c;我们就来使用一下这个封装好的功能。Network的封装需要我们继承很多的接口或类。我们首先查看一下登录服务LoginServer的文件结构&#xff0…

[Android 13]Binder系列--获取ServiceManager

获取ServiceManager hongxi.zhu 2023-7-1 以SurfaceFlinger为例&#xff0c;分析客户端进程如何获取ServiceManager代理服务对象 主要流程 SurfaceFlinger中获取SM服务 frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp // publish surface flingersp<…

mysql单表查询,排序,分组查询,运算符

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…

随机产生50个100以内的不重复的整数,设计位图排序算法进行排序。

1.问题 随机产生50个100以内的不重复的整数&#xff0c;设计位图排序算法进行排序。 2.设计思路 阶段1&#xff1a; 初始化一个空集合    for i[0,n)    bit[i]0 阶段2&#xff1a; 读入数据i&#xff0c;并设置bit[i]1    for each i in the input file    bit[i]1…

Tomcat 应用服务 WEB服务

简述&#xff1a; 中间件产品介绍 目前来说IBM的WebSphere&#xff0c;Oracle的Weblogic占据了市场上Java语言Web站点的部分份额&#xff0c;该两种软件由于无与伦比的性能及可靠性等优势被广泛应用于大型互联网公司的Web场景中&#xff0c;但是其高昂的价格也使得中小型互联…

DL-FWI:数据(第二次培训作业)

代码&#xff1a; import scipy.io import matplotlib import numpy as np import matplotlib.pylab as plt matplotlib.use(TkAgg) from mpl_toolkits.axes_grid1 import make_axes_locatable import cv2font21 {family: Times New Roman,weight: normal,size: 21,}font18 …

【通览一百个大模型】LaMDA(Google)

【通览一百个大模型】LaMDA&#xff08;Google&#xff09; 作者&#xff1a;王嘉宁&#xff0c;本文章内容为原创&#xff0c;仓库链接&#xff1a;https://github.com/wjn1996/LLMs-NLP-Algo 订阅专栏【大模型&NLP&算法】可获得博主多年积累的全部NLP、大模型和算法干…

图像金字塔、滑动条、鼠标事件响应

1、拉普拉斯图像金字塔 1.1 原理 1.2 实现 //拉普拉斯图像金字塔 void test1() {//高斯图像金字塔构建Mat img imread("F:/testMap/lena.png");vector<Mat> Guass;int level 3;Guass.push_back(img);for (int i 0; i < level; i){Mat guass;pyrDown(Gua…

蓝桥杯每日一练专栏导读2

之前一直更新的是C、C相关的题目&#xff0c;但作为一名前端工程师&#xff0c;还是对Js了解的更多一些&#xff0c;所以从此以后停止更新C/C相关内容&#xff0c;改为更新Js相关的练习题。 内容 更新的内容依旧是蓝桥杯大赛官网提供的习题。每一道题都会提供详细的解题思路&a…

方案编制要求--模版--可以借鉴

写方案的标题要求的编写&#xff0c;可以参照这个进行编写&#xff1b; 附录2&#xff1a;方案编制要求及模板 一、封面格式要求 封面内容应包括项目名称、需求单位&#xff08;盖章&#xff09;、建设单位&#xff08;盖章&#xff09;、设计单位&#xff08;盖章&#xff0…

线段树:一遍通透线段树

线段树有关的操作&#xff08;先大体上知道什么意思&#xff09;: 1 2 3 4 5 线段树前置知识&#xff1a; 由于线段树是一个完美二叉树&#xff0c;所以我们选择的是一维数组来存储线段树的相关知识&#xff1a; 所以&#xff1a; 1如果一个结点是X&#xff0c;则父节…

基于MATLAB的简单线性回归详解

概要 在机器学习领域中大多数任务通常都与预测&#xff08;prediction&#xff09;有关。当我们想预测一个数值时&#xff0c;就会涉及到回归问题。常见的例子包括&#xff1a;预测价格&#xff08;房屋、股票等&#xff09;、预测住院时间&#xff08;针对住院病人等&#xff…

如何用python编写3D游戏

Vizard是一款虚拟现实开发平台软件&#xff0c;从开发至今已走过十个年头。它基于C/C&#xff0c;运用新近OpenGL拓展模块开发出的高性能图形引擎。当运用Python语言执行开发时&#xff0c;Vizard同时自动将编写的程式转换为字节码抽象层(LAXMI)&#xff0c;进而运行渲染核心。…

当型循环和直到型循环(精讲)

目录 背景概念当型循环直到型循环 二维表对比图示与代码当型循环流程图N-S图&#xff08;盒图&#xff09; 直到型循环流程图N-S图&#xff08;盒图&#xff09; 例子当型图示代码 直到型图示代码 Do–Loop 和For –Next相同点&#xff1a;不同点&#xff1a;代码 总结 背景 两…

day02 重新学python——判断语句和循坏语句

文章目录 一、python中的判断语句1.布尔类型和比较运算符2.if语句的基本格式3.if else 语句4.if elif else 语句5.判断语句的嵌套6.实战案例 二、循环语句1.while循环的基础语法2.while循环的基础案例3.while循环的嵌套应用4.while循环的嵌套案例5.for循环的基础语法6.for循环的…

【计算机网络】第三章 数据链路层(点对点协议 媒体介入控制)

文章目录 3.5 点对点协议PPP3.6 媒体接入控制3.6.1 媒体接入控制的基本概念3.6.2 媒体接入控制——静态划分信道3.6.3 随机接入——CSMA/CD协议3.6.4 随机接入——CSMA/CA协议 3.5 点对点协议PPP 点对点协议是目前使用最广泛的点对点数据链路层协议。PPP协议为在点对点链路传输…

JAVA Email

Email就是电子邮件。电子邮件的应用已经有几十年的历史了&#xff0c;我们熟悉的邮箱地址比如aaaa22222163.com&#xff0c;邮件软件比如Outlook、网易闪电邮、Foxmail都是用来收发邮件的。当然&#xff0c;使用Java程序也可以收发电子邮件。 传统的邮件就是通过邮局投递&#…

目标检测+车道线识别+追踪+测距(代码+部署运行)

目标检测车道线识别追踪测距 本文主要讲述项目集成&#xff1a;从车道线识别、测距、到追踪&#xff0c;集各种流行模型于一体&#xff01; 不讲原理&#xff0c;直接上干货&#xff01; 把下文环境配置学会&#xff0c;受益终生&#xff01; 各大项目皆适用&#xff01; …

具有音调控制功能的25W混合式Hi—Fi放大器

现代电子技术应用中电子管的使用虽然已经较少&#xff0c;但由于电子管有晶体管不可替代的一些优越特性&#xff0c;所以在部分领域特别是音响电路中还受到人们的亲睐。这是一款由“靓”音电子管和音响集成电路联合组成的混合放大器。该放大器由电子管作前级&#xff0c;音响专…