在 HTML 5 画布上创建 Reuleaux 多边形的函数

2024-03-05

我正在开展一个使用 HTML 5 画布设计系统艺术作品的项目。为了给我的作品带来更有机和多样化的感觉,我想要一个创建 reuleaux 多边形的函数。我认为可能有一种方法可以改变我的draw_sharp_polygon(center_position, radius, number_of_sides, regular, anticlockwise)函数到我需要的函数中,但我不确定如何做到这一点。我需要使用大量吗context.lineTo()功能或者我可以使用context.arcTo()以某种方式发挥作用?

function draw_sharp_polygon(center_position, radius, number_of_sides, regular, anticlockwise)
{
    if(typeof center_position == 'undefined')
        center_position = new Position();
    if(typeof radius == 'undefined')
        radius = dice_roll(diagonal);
    if(typeof number_of_sides == 'undefined' || number_of_sides < 3)
        number_of_sides = dice_roll(10);
    if(typeof regular == 'undefined')
        regular = coin_toss();
    if(typeof anticlockwise == 'undefined')
        anticlockwise = coin_toss();
    context.moveTo(center_position.x + radius, center_position.y)
    if(regular)
    {
        var circular_angle_division = (Math.PI * 2)/number_of_sides;
        circular_angle_division = anticlockwise ? -1 * circular_angle_division : circular_angle_division;
        for(var i = 1; i < number_of_sides; i++)
        {
            context.lineTo(radius * Math.cos(circular_angle_division * i),radius * Math.sin(circular_angle_division * i));
        }
    }
    else
    {
        var amount_of_circle_taken = 0;
        var direction = anticlockwise ? -1 : 1;
        var sides_left = number_of_sides;
        for(var i = 1; i < number_of_sides; i++)
        {
            if(i < number_of_sides -1)
            {
                var circular_angle_division = get_random_value(1, (((Math.PI * 2) - amount_of_circle_taken)/number_of_sides*(sides_left / 2)));
                amount_of_circle_taken += circular_angle_division;
            }
            else
            {
                var circular_angle_division = (Math.PI * 2) - amount_of_circle_taken;
            }
            context.lineTo(radius * Math.cos(direction * circular_angle_division * i),radius * Math.sin(direction * circular_angle_division * i));
        }
    }
}

这就是我的平边多边形。我想知道是否有办法使用context.arcTo()代替context.lineTo()创建鲁洛多边形。

我本来打算发布一个鲁洛三角形的例子,但我没有足够的声誉。维基百科有一个很好的例子。

附:我还没有在我的任何个人项目中使用 jQuery,因为我觉得它们中的大多数都可以成为独立 javascript 库的一部分。所以请不要使用 jQuery 来回答。


所需的切点arcTo()实际上位于外接圆上,圆弧端点之间的中间。所需的半径可以通过以下公式计算:

reuleaux_radius = radius * sqrt(2 + 2*cos(pi / number_of_sides))

这相当于

reuleaux_radius = radius * sqrt(2 + 2*cos(angle2 - angle1))

完整代码:

var taget = document.getElementById('target');
var context = target.getContext('2d');

var sides = 3;
var radius = 100;
var center = new Position(150,150);

// normal polygon
context.beginPath();
draw_sharp_polygon(center, radius, sides);
context.strokeStyle = 'silver';
context.stroke();

// circle
context.beginPath();
context.arc(center.x, center.y, radius, 0, 2*Math.PI, false);
context.strokeStyle = 'silver';
context.stroke();

// reuleaux polygon
context.beginPath();
draw_reuleaux_polygon(center,radius,sides);
context.strokeStyle = 'black';
context.stroke();

function Position(x, y)
{
    this.x = x || 0;
    this.y = y || 0;
}

function draw_reuleaux_polygon(center_position, radius, number_of_sides)
{
    if(typeof center_position == 'undefined')
        throw new Error("center_position not defined");
    if(typeof radius == 'undefined')
        throw new Error("radius not defined");
    if(typeof number_of_sides == 'undefined' || number_of_sides < 3)
        throw new Error("number_of_sides not defined");

    context.moveTo(center_position.x + radius, center_position.y);
    for (var index1 = 0; index1 < number_of_sides; index1++)
    {
        // point 1 = arc start
        // point 2 = tangent intersection
        // point 3 = arc end
        var index2 = (index1 + 0.5) % number_of_sides;
        var index3 = (index1 + 1) % number_of_sides;
        var angle1 = index1*2*Math.PI/number_of_sides;
        var angle2 = index2*2*Math.PI/number_of_sides;
        var angle3 = index3*2*Math.PI/number_of_sides;
        var p1 = new Position(center_position.x + radius*Math.cos(angle1), center_position.y + radius*Math.sin(angle1));
        var p2 = new Position(center_position.x + radius*Math.cos(angle2), center_position.y + radius*Math.sin(angle2));
        var p3 = new Position(center_position.x + radius*Math.cos(angle3), center_position.y + radius*Math.sin(angle3));

        var reuleaux_radius = radius*Math.sqrt(2 + 2*Math.cos(Math.PI/number_of_sides));
        
        context.arcTo(p2.x, p2.y, p3.x, p3.y, reuleaux_radius);
    }
    
    context.closePath();
}

function draw_sharp_polygon(center_position, radius, number_of_sides)
{
    if(typeof center_position == 'undefined')
        throw new Error("center_position not defined");
    if(typeof radius == 'undefined')
        throw new Error("radius not defined");
    if(typeof number_of_sides == 'undefined' || number_of_sides < 3)
        throw new Error("number_of_sides not defined");
    
    context.moveTo(center_position.x + radius, center_position.y);
    var circular_angle_division = (Math.PI * 2)/number_of_sides;
    for(var i = 1; i < number_of_sides; i++)
    {
        var x = center_position.x + radius * Math.cos(circular_angle_division * i);
        var y = center_position.y + radius * Math.sin(circular_angle_division * i);
        console.log(i,x,y);
        context.lineTo(x,y);
    }
    
    context.closePath();
}
<canvas id="target" width="300" height="300"></canvas>

http://jsfiddle.net/hebvseju/ http://jsfiddle.net/hebvseju/

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

在 HTML 5 画布上创建 Reuleaux 多边形的函数 的相关文章

  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • 将div设置为隐藏,延时后可见

    我试图在 X 时间后 也许甚至在随机时间之后 但现在我们只做固定时间 在黑色背景上出现一个黄色方块 function initialSetup if document getElementById yellow null document
  • 在 webpack 2.x 中使用 autoprefixer 和 postcss

    如何使用autoprefixer使用 webpack 2 x 以前 它曾经是这样的 module loaders test scss loader style css sass postcss postcss gt return autop
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 避免响应式页面的重复内容

    我目前正在做一个涉及响应式设计的项目 整个布局应该使用HTML和CSS来实现 我知道可以使用 java 脚本将内容从一个列布局移动到另一列布局 而无需复制内容 但是使用 HTML 和 CSS 是否可以实现相同的效果 以下面的例子为例 它会在
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 在 React.js 中编辑丰富的数据结构

    我正在尝试为数据结构创建一个简单的基于网格的编辑器 但我在使用 React js 时遇到了一些概念问题 他们的文档对此没有太大帮助 所以我希望这里有人可以提供帮助 首先 将状态从外部组件传输到内部组件的正确方法是什么 是否有可能将内部组件中
  • 使用 Ajax 请求作为源数据的 Jquery 自动完成搜索

    我想做的事 我想使用 jquery 自动完成函数创建一个输入文本字段 该函数从跨域curl 请求获取源数据 结果应该与此示例完全相同 CSS 在这里并不重要 http abload de img jquerydblf5 png http a
  • Schema.org 的常见问题解答页面

    我有一个常见问题解答页面 我想用更好的 html 架构来实现它
  • 无效字符错误:“fred”

    我确信他一定是一个新手问题 简单来说 我想定义我的第一个 Polymer dart 组件 只是我一直在同一个减速带上踢脚趾 为了使事情变得非常简单 我将其简化为一个非常简单的示例 我做了一个简单的rename示例 跑表 来自 Dart 组件
  • CSS 是否有不等于选择器?

    CSS中有类似 不等于 的东西吗 例如 我有以下代码 input 但对于某些输入 我需要将其作废 我想通过将类 reset 添加到输入标签来做到这一点 例如

随机推荐

  • 使用 Cargo 时如何获得带有调试信息的发布版本?

    以下命令 cargo build 产生一个未优化 build with调试信息 相反 cargo build release 产生一个优化 build without调试信息 有没有一种方法可以产生优化 build with调试信息 我需要
  • Heroku 上的 Radiant 扩展?

    有人有过将 Radiant CMS 扩展实际应用到 Heroku 实例上的经验吗 我尝试删除子模块并将文件添加回来 但运气不太好 Heroku 目前不支持 git 子模块 然而 他们的 优秀的 文档表达了解决这个问题的方法 在这里查看 ht
  • 删除 .svn/pristine 的内容是否安全?

    我正在使用一个大型应用程序 我从我的存储库中签出了该应用程序的大部分内容 svn pristine文件夹 据我了解 原始文件夹包含我的workingCopy目录中的文件副本 话虽如此 删除这些文件可以吗 我真的需要它们吗 我已经备份了文件
  • 如何在 C# 中修改装箱值而不创建新对象?

    如何在 C 中修改装箱值而不创建新对象 例如 如果我有object o 5 我想改变盒装的值5 to 6 我怎样才能做到这一点 The o 6 将在堆上创建一个新对象并将对该对象的引用分配给o 还有其他方法可以更改盒装值吗 你可以自己 拳击
  • 从 ansible 运行 powershell 脚本并注册输出

    我正在尝试运行一个 Powershell 脚本 该脚本在远程 Windows PC 上使用 ansible 从 MSI 文件读取 ProductGUID powershell 在本地工作台上作为 ps1 文件运行 但从 ansible 中它
  • 请求超时并显示代码

    Error Domain NSURLErrorDomain Code 1001 The request timed out UserInfo NSUnderlyingError 0x608000244a70 Error Domain kCF
  • Spring Boot JSF 集成

    环境 雄猫8 春季启动 1 5 JSF 2 2 阿帕奇 MyFaces 春季MVC Code 我正在 Servlet 3 0 环境中集成 Spring Boot 和 JSF 2 2 配置类 JSFConfig java JSF 的配置 Co
  • 无法通用导入Python包

    假设我有以下目录结构 workspace init py ys manage init py manage py ys utils init py project dicts py 现在 假设我需要访问project dicts py in
  • 如何合并多个数组而不减慢编译器速度?

    添加这行代码会使我的编译时间从 10 秒缩短到 3 分钟 var resultsArray hashTagParticipantCodes prefixParticipantCodes asterixParticipantCodes att
  • C# 中引用类型和值类型有什么区别?

    几个月前有人问我这个问题 我无法详细解释 C 中引用类型和值类型有什么区别 我知道值类型是int bool float等 参考类型是delegate interface等等 或者这也是错误的吗 你能用专业的方式给我解释一下吗 你的例子有点奇
  • Windows 8 ARM(A.K.A.)吗? “Windows RT”有可供第三方开发人员使用的 Winapi (win32) 吗?

    Windows 8 for ARM 也称为 Windows RT 它是否具有与 Win32 API 等效的功能 I don t意味着它是否可以运行 Win32 x86 代码 但如果它具有 Win32 API可用的给第三方开发商 是的 ARM
  • Rake 任务只调用一次就执行两次

    我编写了一个非常简单的 rake 任务来尝试找到这个问题的根源 namespace foo do task bar environment do puts RUNNING end end 在控制台执行时rake foo bar输出是 RUN
  • SSIS 格式化货币输出

    在我的输出 CSV 文件中 有 4 列数据类型为货币 我的输出是平面文件 CSV 文件 我希望输出中的每一列都采用以下格式 这并没有发生 输出 CSV 文件中出现实际包含美分的列50 79 no 以以下结尾的列0正在压制0 40 8 零列看
  • Rest API 与客户端分离的多租户数据库

    我有一个带有组合键的多租户数据库 clientId docId 路由看起来像这样 api controller clientId docId 对于身份验证 我使用 全局 用户名 例如电子邮件 密码 通过 https 在每个请求的 http
  • Spring Data动态查询

    我正在尝试使用 spring 数据设置一个动态查询 基本上我有一个具有一堆特征的数组 我需要根据这些特征组装查询 几乎类似于 WHEREcharacteristic A ANDcharacteristic B AND特征 C 但特征的数量可
  • 单击 FusionTablesLayer 多边形时的事件

    每次客户端点击多边形时 我都需要在我的 JavaScript 中知道 我还需要知道它对应于我的融合表中的哪一行 有这样做的活动吗 有这样做的活动吗 FusionTables鼠标事件 https developers google com m
  • 将 functools 与 IronPython 结合使用

    我正在使用带有 IronPython 的 functools 库 它在开发机器上运行良好 但在生产中无法导入库 抛出异常 IronPython Runtime Exceptions ImportException 没有命名的模块 funct
  • 如何重命名 MongoDB 数据库?

    我的 MongoDB 数据库名称有一个拼写错误 我正在尝试重命名该数据库 I can copy http www mongodb org display DOCS Copy Database Commands然后像这样删除 db copyD
  • OpenGL 3.0 中 glDrawPixels 的替代品?

    所以我知道 glDrawPixels 已被弃用 有没有做同样事情的函数 我想过使用纹理 但它们是由当前矩阵修改的 与 glDrawPixels 绘制的像素不同 我想过使用纹理 但它们被当前矩阵修改了 当前矩阵 在 3 0 中已弃用 并在 3
  • 在 HTML 5 画布上创建 Reuleaux 多边形的函数

    我正在开展一个使用 HTML 5 画布设计系统艺术作品的项目 为了给我的作品带来更有机和多样化的感觉 我想要一个创建 reuleaux 多边形的函数 我认为可能有一种方法可以改变我的draw sharp polygon center pos