无法在画布上绘制垂直虚线

2024-02-18

我正在使用以下 javascript 算法在画布上绘制虚线。该算法正确绘制水平线,但无法绘制垂直线:

            g.dashedLine = function (x, y, x2, y2, dashArray) {
            this.beginPath();
            this.lineWidth = "2";

            if (!dashArray)
                dashArray = [10, 5];

            if (dashLength == 0)
                dashLength = 0.001;     // Hack for Safari

            var dashCount = dashArray.length;
            this.moveTo(x, y);

            var dx = (x2 - x);
            var dy = (y2 - y);
            var slope = dy / dx;

            var distRemaining = Math.sqrt(dx * dx + dy * dy);
            var dashIndex = 0;
            var draw = true;

            while (distRemaining >= 0.1) {
                var dashLength = dashArray[(dashIndex++) % dashCount];

                if (dashLength > distRemaining)
                    dashLength = distRemaining;

                var xStep = Math.sqrt((dashLength * dashLength) / (1 + slope * slope));
                if (x < x2) {
                    x += xStep;
                    y += slope * xStep;
                }
                else {
                    x -= xStep;
                    y -= slope * xStep;
                }

                if (draw) {
                    this.lineTo(x, y);
                }
                else {
                    this.moveTo(x, y);
                }
                distRemaining -= dashLength;
                draw = !draw;
            }
            this.stroke();
            this.closePath();
        };

用于测试垂直线绘制的以下点:

  g.dashedLine(157, 117, 157,153, [10, 5]);

用于测试水平线绘制的以下点: g.dashedLine(157, 117, 160,157, [10, 5]);


当直线垂直时,dx = 0,导致斜率 = 无穷大。如果您编写自己的破折号逻辑,那么您需要处理 dx = 0(或非常接近 0)的特殊情况。在这种特殊情况下,您必须使用反斜率(即 dx / dy)和 yStep(而不是 xStep)。

一个更大的问题是你为什么要编写自己的破折号逻辑。 Canvas 内置了对虚线的支持。调用 setLineDash() 函数设置虚线图案。完成后恢复之前的破折号图案。例如...

g.dashedLine = function (x, y, x2, y2, dashArray) {
    this.beginPath();
    this.lineWidth = "2";
    if (!dashArray)
        dashArray = [10, 5];
    var prevDashArray = this.getLineDash();
    this.setLineDash(dashArray);
    this.moveTo(x, y);
    this.lineTo(x2, y2);
    this.stroke();
    this.closePath();
    this.setLineDash(prevDashArray);
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在画布上绘制垂直虚线 的相关文章

随机推荐

  • 对于 .NET 项目,Elastic Beanstalk 和 CloudFormation 之间有什么区别? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我开发了一个 NET MVC 应用程序 并开始使用 AWS 并通过 Visual Studio Tool
  • EMR 与 AWS 上的 EC2/Hadoop

    我知道 EC2 比 EMR 更灵活 但工作量更大 然而就成本而言 如果使用 EC2 可能需要将 EBS 卷附加到 EC2 实例 而 AWS 只是从 S3 流入数据 因此 在 AWS 计算器上计算数字 即使对于 EMR 也必须为 EC2 付费
  • git 从合并中删除提交

    我有以下问题 我试图将远程分支合并到本地 然后将更改推送到存储库 好吧 我获取了具有三个提交的远程分支 但其中一个尚未完成 所以我不想推送一个这些提交到存储库 当我运行 git log 时 它向我显示以下内容 commit A1 merge
  • 是否可以在 MVC 5 控制器中的一项操作上禁用身份验证过滤器?

    AuthenticateUser public class HomeController Controller GET Home public ActionResult Index return View AllowAnonymous pu
  • Keras 中的反向传播?

    谁能告诉我 Keras 中的反向传播是如何完成的 我读到它在 Torch 中非常简单 在 Caffe 中很复杂 但我找不到任何关于使用 Keras 执行此操作的信息 我正在 Keras 中实现我自己的层 非常初学者 并且想知道如何进行反向传
  • C# 可序列化类到 xsd

    有没有办法从可序列化的 C 类输出 xml 模式 xsd 我浏览过网络 但不确定我是否在寻找正确的东西 Thanks 您正在寻找 XSD exehttp msdn microsoft com en us library x6c1kb0s a
  • Play Protect 无法识别该应用程序的开发者

    我尝试在 Google Play 以外的市场中发布我的应用程序 当我尝试安装我的应用程序时 它说 Play Protect 无法识别该应用程序的开发者 来自未知开发者的应用程序有时可能不安全 我认为问题可能出在应用程序的标志上 我通过另一个
  • IntelliJ 无法将爆炸战争部署到 tomcat

    我有一个 Java Web 应用程序 正在 IntelliJ 中开发并使用 Apache Tomcat 进行部署 我定义了一些在团队中的每个人之间共享的运行配置 这些运行配置被定义为将分解的战争工件部署到本地 tomcat 中 其他团队成员
  • 如何从检测意图 API 触发对话流事件?

    如何从 python 检测意图 API 触发对话流中的事件 我想在启动聊天窗口时立即触发欢迎意图 您需要将 WELCOME 事件作为查询输入的一部分发送到调用detect intent 它可能看起来像这样 import dialogflow
  • 在应用程序购买沙箱中不提示我输入登录/密码

    我们正在开发一款应用程序 当然 用于应用程序购买 IAP 我已完成指南中启用 iap 的所有操作 一切正常 直到我想购买 一些代码 MainViewController m void viewDidLoad if SKPaymentQueu
  • 将 JTable 放入 JTree 中

    与螺纹有关Jtable 作为 Jtree 节点 https stackoverflow com questions 8839025 jtable as a jtree node我把 JTable 放到 JTree 中 但是JTree视图在启
  • 无法解析缺少分钟的日期?

    我正在尝试解析不包含分钟 2019 10 12T07Z 的日期时间字符串 import java time OffsetDateTime import java time format DateTimeFormatter public cl
  • 从触发器下载delphi中的文件并捕获文件名

    我有一个网站的网址 它看起来像这样 http www example com downloads file 4789 download http www example com downloads file 4789 download 我想
  • shouldOverrideUrlLoading 仅在某些网页上被调用

    我正在为针对多个客户端进行个性化的应用程序使用 shouldOverrideUrlLoading 方法 每个客户端都有自己的网页想要加载到 webview 中 我的问题是这样的 该应用程序非常适合客户 A 及其网页 但不适用于客户 B 的网
  • django-admin startproject尝试创建manage.py两次?

    我正在努力解决Django 教程 https docs djangoproject com en 1 9 intro tutorial01 版本 1 9 在 Ubuntu 15 10 上运行 当我到达跑步的台阶时django admin s
  • Express.js 无法 GET /index.html.var

    所以我在共享主机 FastComet 中运行一个快速应用程序 但如果我想访问 我会收到此消息 无法获取 index html var 显然这与 htaccess file 我解决这个问题的方法是添加 DirectoryIndex disab
  • 删除 iOS 7 中的 Tab Bar 水平分隔符

    我想删除 UITabBar 和屏幕其余部分之间的水平分隔线 我问和这个人有同样的问题 https stackoverflow com q 11104796 1224741但针对 iOS7 进行了更新 设置我的 UITabBar 的背景图像并
  • 使用mockito库模拟java中的final类[重复]

    这个问题在这里已经有答案了 我有一个最终类 它有一个我想执行特定操作的方法 因此我想创建最终类的对象 但我无法创建它 以下是我的课程 public final class A private String name A String nam
  • 在 Emacs 中搜索标记(选定)文本

    我使用 emacs 查看和编辑代码和其他文本文件 我想知道是否有一种方法可以向前或向后搜索当前缓冲区中标记的文本 类似于我在记事本或写字板中可以执行的操作 就像我可以在缓冲区中标记一些文本并执行 C s 或 C r 并能够使用标记的文本进行
  • 无法在画布上绘制垂直虚线

    我正在使用以下 javascript 算法在画布上绘制虚线 该算法正确绘制水平线 但无法绘制垂直线 g dashedLine function x y x2 y2 dashArray this beginPath this lineWidt