使用for循环在画布上绘制线条

2023-11-20

我正在尝试用画布绘制线条,并使用 for 循环更改坐标。

这是我的画布元素:

<canvas id="c" width="300px" height="300px"></canvas>

这是js代码:

var c = document.getElementById('c');
ci = c.getContext('2d');
for(var a = 18; a < 300; a +=18){
            fnc(a, ci);
            }   
function fnc(x, ci){

        ci.strokeStyle = 'red'; 
        ci.moveTo(0, x); 
        ci.lineTo(300, x); ci.lineWidth = 0.2; ci.stroke(); 
    }

正如你所看到的,我试图绘制这些线条,线条之间有 18 像素的间距。但是线条的粗细和颜色(或不透明度,我不确定)从上到下正在变化。

这是一个小提琴:http://jsfiddle.net/J6zzD/1/

那么我找不到我的错误是怎么回事。为什么颜色和厚度不同?

UPDATE :

我刚刚将这些线写出函数,现在所有线都变淡了,但粗细是相同的。这么奇怪 :

 ci.strokeStyle = 'red'; 
 ci.lineWidth = 0.2; ci.stroke();

这是演示:http://jsfiddle.net/J6zzD/4/


这又是忘记调用 beginPath 的永恒问题。
每次调用 moveTo 和 lineTo 时,都会创建一个新的 *sub*path,该路径会添加到当前 Path 中。
然后,每次调用中风()时,当前路径,因此当第一次绘制最后添加的路径时,所有当前子路径都会重新绘制。
由于不透明度会累加,因此绘制一次的底线将具有 20% 不透明度 (lineWidth=0.2) 时,顶线将达到 100% 不透明度 (alpha=255)。

在第二个小提琴中,您仅描边一次,因此所有线条都有 20% 的不透明度,这对于 0.2 线宽来说是正确的。

所以:在绘制新图形之前使用 beginPath。
在这种情况下你有两个选择:
• 逐行绘制 或者
• 绘制一次路径,将所有线作为子路径。

(参见下面的代码)。

TIP:要获得干净的线条,请记住像素的中心位于每个像素的 (+0.5, +0.5) 坐标处,因此 一个“技巧”是在应用程序启动时平移 0.5, 0.5,然后仅使用圆角坐标和线宽.

1)逐行绘制

http://jsfiddle.net/gamealchemist/J6zzD/6/

var c = document.getElementById('c');
var ctx = c.getContext('2d');
ctx.translate(0.5, 0.5);
ctx.lineWidth = 1;

for (var y = 18; y < 300; y += 18) {
    strokeLine(ctx, y);
}

function strokeLine(ctx, y) {
    ctx.beginPath();
    ctx.strokeStyle = 'red';
    ctx.moveTo(0, y);
    ctx.lineTo(300, y);
    ctx.stroke();
}

2)绘制多个subPath: (一笔画只能有一种颜色() )

http://jsfiddle.net/gamealchemist/J6zzD/7/

var c = document.getElementById('c');
var ctx = c.getContext('2d');
ctx.translate(0.5, 0.5);
ctx.lineWidth = 1;

ctx.strokeStyle = 'red';

ctx.beginPath();
for (var y = 18; y < 300; y += 18) {
    addLineSubPath(ctx, y);
}
ctx.stroke();

function addLineSubPath(ctx, y) {
    ctx.moveTo(0, y);
    ctx.lineTo(300, y);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用for循环在画布上绘制线条 的相关文章

随机推荐

  • 如何创建 Django 模型

    介绍 在之前的教程中 如何创建 Django 应用程序并将其连接到数据库 我们介绍了如何创建 MySQL 数据库 如何创建和启动 Django 应用程序以及如何将其连接到 MySQL 数据库 在本教程中 我们将创建 Djangomodels
  • 如何在 JavaScript 中修改 CSS 类

    介绍 在本教程中 您将学习如何使用 JavaScript 修改 CSS 类classListDOM 操作项目的对象 这classListobject 允许您调整分配给 HTML 元素的 CSS 类 先决条件 JavaScript 的一般知识
  • 如何在 Python 中将 NumPy 数组转换为列表

    介绍 With NumPy np array对象可以转换为列表tolist 功能 这tolist 函数不接受任何参数 如果数组是一维的 则返回包含数组元素的列表 对于多维数组 返回嵌套列表 先决条件 为了完成本教程 您将需要 熟悉 Pyth
  • 如何访问 DOM 中的元素

    介绍 In 了解 DOM 树和节点中 我们回顾了 DOM 如何构建为称为节点的对象树 这些节点可以是文本 注释或元素 通常当我们访问 DOM 中的内容时 会通过 HTML 元素节点 为了能够自信地访问 DOM 中的元素 最好具备 CSS 选
  • MongoDB findOne 示例

    MongoDB findOne 方法仅返回一个满足以下条件的文档criteria进入 如果输入的条件与多个文档匹配 则该方法根据自然排序仅返回一个文档 这反映了文档在数据库中存储的顺序 MongoDB findOne MongoDB fin
  • 如何在 Java 中打开文件

    有时我们需要在java程序中打开一个文件 java awt Desktop可以用java来打开文件 桌面实现与平台相关 因此首先我们应该检查操作系统是否支持桌面 此类查找注册到当前平台的关联应用程序以打开文件 Java 打开文件 Let s
  • Kotlin 类 - Kotlin 构造函数

    在本教程中 我们将讨论面向对象编程Kotlin 的概念 我们将详细讨论 Kotlin 类 我们还将了解 kotlin 构造函数 访问修饰符和抽象类 Kotlin 类 A class is a blue print defined which
  • 如何在 MySQL 中创建新用户并授予权限

    介绍 MySQL是一个开源的关系数据库管理系统 它通常部署为灯堆栈 这代表Linux Apache MySQL 和PHP 并且 截至撰写本文时 是最流行的开源数据库在世界上 本指南概述了如何创建新的 MySQL 用户并授予他们执行各种操作所
  • 如何在 Rocky Linux 9 上安装和使用 PostgreSQL

    介绍 关系数据库管理系统是许多网站和应用程序的关键组件 它们提供了一种结构化的方式来存储 组织和访问信息 PostgreSQL也称为 Postgres 是一个关系数据库管理系统 它提供结构化查询语言 更广为人知的名称为 SQL 的实现 许多
  • Linux 导航和文件管理

    介绍 导航和操作文件系统中的文件和文件夹是使用大多数计算机的关键部分 云服务器大多使用相同的常见 Linux shell 和常见 Linux 命令来处理文件和文件夹 本终端将介绍使用这些命令的一些基本技能 先决条件和目标 为了遵循本指南 您
  • 如何在 Ubuntu 18.04 上安装 Elasticsearch、Logstash 和 Kibana (Elastic Stack)

    笔者精选互联网档案馆接受捐赠作为为捐款而写程序 介绍 Elastic Stack 以前称为ELK堆栈 是由以下公司制作的开源软件集合Elastic它允许您搜索 分析和可视化从任何来源以任何格式生成的日志 这种做法称为集中记录 当尝试识别服务
  • Log4j2 示例教程 - 配置、级别、Appender

    欢迎使用 Apache Log4j2 示例教程 如果您向专家开发人员询问应用程序中最烦人的事情 答案可能与日志记录有关 如果应用程序中没有合适的日志记录 维护将是一场噩梦 大多数应用程序都会经过开发测试 单元测试 集成测试 但当涉及到生产时
  • 如何在 Debian 8 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈

    介绍 LAMP 软件堆栈 包括LLinux操作系统 A阿帕奇网络服务器 MmySQL 数据库 以及PHP 脚本语言是 Web 或应用程序开发的良好基础 安装在一起后 该软件堆栈使您的服务器能够托管动态网站和 Web 应用程序 在本教程中 我
  • 如何在 Linux 上安装 TestDisk 并恢复已删除的文件

    您是否曾经遇到过不小心删除文件的情况 在本教程中 我们将介绍如何在 Linux 中安装 TestDisk 并恢复已删除的文件 在本教程中 我将使用 Ubuntu 服务器进行工作 但即使您使用任何其他发行版 也可以遵循相同的步骤 唯一不同的是
  • 将QChartView插入到ui中

    我想把在同一个 qtchart 上绘制烛台和 5 天平均线 但给出两个 x 轴图将代码写入 UI 加载器 import sys from PyQt5 QtWidgets import QApplication QWidget from Py
  • 如何将 PowerShell 变量返回到 VBScript

    我有一个 vbscript 来调用 PowerShell 脚本 希望将 PowerShell 输出返回到 HTA HTML 应用程序 GUI 现在我只想看看是否可以将 PowerShell 输出返回到 vbscript 中的 MsgBox
  • 如何找到 .bash_profile 并将其添加到 shell 的初始化文件中? [关闭]

    Closed 这个问题是无关 目前不接受答案 我正在尝试使用 rvm 升级 ruby 上务实网站 它说 重要的部分是将以下行添加到 shell 初始化文件 bash profile 的末尾 s HOME rvm scripts rvm so
  • 卸载 RVM 后 Zshell 启动,退出状态为 1

    我刚刚卸载了rvm 我跑了rvm implode并从中删除了rvm PATH in my zshrc 如指定这个堆栈溢出帖子 卸载后 我注意到我的 shell 启动的退出状态为1 我已经使用它检查过echo 加载 shell 后 我总是得到
  • 按位异或两个数字会得到数字的和或差

    当我对任意两个数字进行异或时 我得到的是它们的差值或总和的绝对值 我在谷歌上搜索了很多 试图找到任何相关的公式 但对此没有明显的公式或陈述 Example 10 XOR 2 1010 XOR 10 1000 8 1 XOR 2 01 XOR
  • 使用for循环在画布上绘制线条

    我正在尝试用画布绘制线条 并使用 for 循环更改坐标 这是我的画布元素