随机产生一些直线,当直线相交时产生交点,直线不断移动,交点的位置也随之改变。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Canvas绘制点线相交</title>
<style>body {background-color: #eee;overflow: hidden;}canvas {background-color: #eee;display: block;margin: 0 auto;}
</style>
</head>
<body><canvas id="canvas"></canvas>
</body>
<script>var canvas = document.getElementById("canvas");var ctx = canvas.getContext("2d");var cw = canvas.width = window.innerWidth,cx = cw / 2;var ch = canvas.height = window.innerHeight,cy = ch / 2;ctx.fillStyle = "#000";var linesNum = 16;var linesRy = [];var requestId = null;function Line(flag) {this.flag = flag;this.a = {};this.b = {};if (flag == "v") {this.a.y = 0;this.b.y = ch;this.a.x = randomIntFromInterval(0, ch);this.b.x = randomIntFromInterval(0, ch);} else if (flag == "h") {this.a.x = 0;this.b.x = cw;this.a.y = randomIntFromInterval(0, cw);this.b.y = randomIntFromInterval(0, cw);}this.va = randomIntFromInterval(25, 100) / 100;this.vb = randomIntFromInterval(25, 100) / 100;this.draw = function() {ctx.strokeStyle = "#ccc";ctx.beginPath();ctx.moveTo(this.a.x, this.a.y);ctx.lineTo(this.b.x, this.b.y);ctx.stroke();}this.update = function() {if (this.flag == "v") {this.a.x += this.va;this.b.x += this.vb;} else if (flag == "h") {this.a.y += this.va;this.b.y += this.vb;}this.edges();}this.edges = function() {if (this.flag == "v") {if (this.a.x < 0 || this.a.x > cw) {this.va *= -1;}if (this.b.x < 0 || this.b.x > cw) {this.vb *= -1;}} else if (flag == "h") {if (this.a.y < 0 || this.a.y > ch) {this.va *= -1;}if (this.b.y < 0 || this.b.y > ch) {this.vb *= -1;}}}}for (var i = 0; i < linesNum; i++) {var flag = i % 2 == 0 ? "h" : "v";var l = new Line(flag);linesRy.push(l);}function Draw() {requestId = window.requestAnimationFrame(Draw);ctx.clearRect(0, 0, cw, ch);for (var i = 0; i < linesRy.length; i++) {var l = linesRy[i];l.draw();l.update();}for (var i = 0; i < linesRy.length; i++) {var l = linesRy[i];for (var j = i + 1; j < linesRy.length; j++) {var l1 = linesRy[j]Intersect2lines(l, l1);}}}function Init() {linesRy.length = 0;for (var i = 0; i < linesNum; i++) {var flag = i % 2 == 0 ? "h" : "v";var l = new Line(flag);linesRy.push(l);}if (requestId) {window.cancelAnimationFrame(requestId);requestId = null;}cw = canvas.width = window.innerWidth,cx = cw / 2;ch = canvas.height = window.innerHeight,cy = ch / 2;Draw();};setTimeout(function() {Init();addEventListener('resize', Init, false);}, 15);function Intersect2lines(l1, l2) {var p1 = l1.a,p2 = l1.b,p3 = l2.a,p4 = l2.b;var denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y);var ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator;var ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator;var x = p1.x + ua * (p2.x - p1.x);var y = p1.y + ua * (p2.y - p1.y);if (ua > 0 && ub > 0) {markPoint({x: x,y: y})}}function markPoint(p) {ctx.beginPath();ctx.arc(p.x, p.y, 2, 0, 2 * Math.PI);ctx.fill();}function randomIntFromInterval(mn, mx) {return ~~(Math.random() * (mx - mn + 1) + mn);}
</script>
</html>

  无论是Canvas 还是别的,前端的学习总是妙趣横生,只要思想在不断进步,技术就会一次次的突破。如果你学习过Canvas ,你会更加了解这段代码的神奇,送给你,远道而来的求学者。

推荐阅读:
线条动画
怦然心动
阿波罗的轻语
游动的花花肠子
V3.14激流勇进

Canvas 绘制点线相交相关推荐

  1. canvas绘制飞线效果

    在我们做的可视化大屏项目中,经常会遇到飞线的效果. 在我们的大屏编辑器中,可以通过拖拽+配置参数的方式很快就能够实现.下面是我们使用大屏编辑器实现的一个项目效果: 中间地图就有飞线的效果. 抛开编辑器 ...

  2. 画线标记html,markline.js——轻量级canvas绘制标记线的库

    这段时间要做的是一个数据可视化的小型项目.其中最基本要求是实现两点之间的迁徙关系(比如同一个用户不同时间上网的地点)用一条有向线段(markline)联系在一起.很自然的我一开始想的就是采用百度的ec ...

  3. 用html5做一条线,使用HTML5 canvas绘制线条的方法

    使用HTML5 canvas绘制线条的方法 发布时间:2020-08-29 11:24:23 来源:亿速云 阅读:96 作者:小新 这篇文章主要介绍了使用HTML5 canvas绘制线条的方法,具有一 ...

  4. 带着canvas去流浪系列之五 绘制K线图

    [摘要] 用canvas原生API实现百度Echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  5. 【带着canvas去流浪(5)】绘制K线图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...

  6. 神奇的canvas——点与线绘制的绚丽动画效果

    代码地址如下: http://www.demodashi.com/demo/11636.html 前言 之前在某网站上看到了一个canvas绘制的动画效果,虽然组成的元素很简单,只有点和线,但是视觉效 ...

  7. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习 从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方法, ...

  8. canvas绘制时钟

    听了慕课网Sliav Zhou 的课程canvas绘制时钟,记录下来的代码,每句做了注解便于以后学习,原先每次边听别的课边敲码,错误百出,明明原封不动复制的代码,就会出错,还找不到原因,今天可能运气好 ...

  9. 【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )

    文章目录 I . 文字尺寸测量 II . 基线绘制 I . 文字尺寸测量 1 . 精准绘制需求 : Canvas 绘制文字时 , 有时需要精准的控制文字的绘制 , 如绘制到指定的区域 , 居中 , 或 ...

最新文章

  1. LR12的log解释
  2. corosync+pacemaker实现高可用(HA)集群(二)
  3. NioEventLoop加载流程分析
  4. 机器视觉 光学工程专业_瑞士Idonus MEMS制造设备 创新技术 机器视觉测量(远心光学)...
  5. fork()函数_UNIX环境高级编程(APUE)系列学习第8章-2 exit系列函数与wait系列函数...
  6. 03-21 webview 性能分析
  7. xcode模拟器不显示键盘解决方案
  8. nocount on_在SQL Server中设置NOCOUNT ON语句的用法和性能优势
  9. 无锡美景:踏过樱花第几桥
  10. python免费ocr软件_实用工具 | 6款免费OCR神器,总有一款适合你!
  11. 二分排序(java)
  12. 我是如何自学成为程序员的
  13. 【数电基础知识】各逻辑运算符号盘点
  14. 小程序PHP字体,微信小程序在text文本实现多种字体样式
  15. 微信文件撤回时间多长_微信中文件撤回时间延长至多久?
  16. 【数理统计】F检验与单因素方差分析
  17. fpu测试_【测试】拯救者Y9000X性能amp;散热数据
  18. 安装VS2010的过程遇到VC10.0 Runtime组件安装失败怎么解决
  19. 【微信项目】LR参数化-关联--醍醐灌顶
  20. flv 文件格式解析

热门文章

  1. ElasticSearch服务器泄露 5700万个人数据外泄
  2. 如何关闭华为自动杀进程_如何彻底关闭windows 10的 自动更新
  3. 移动端适配:font-size设置方案的理解(浏览器调试移动端网页工具使用)
  4. buildroot rz sz 配置
  5. 关于thread中mutex相关内容的理解
  6. 【学堂上新】Unity UGUI 渲染 3D 对象详解
  7. Jira 史诗指南 (2022)
  8. pgsql命令行直接输入密码登录
  9. FSL处理DTI数据详细流程(本人亲身经历的流程)
  10. 用MSNCartoon制作个性化卡通头像