曲线艺术编程第一章 coding curves
原作:Keith Peters
原文:https://www.bit-101.com/blog/2022/11/coding-curves/
译者:池中物王二狗(sheldon)
blog: http://cnblogs.com/willian/
源码与中英对照:github: https://github.com/willian12345/coding-curves
译者闲白:
我入前端这行已经 10 几年了,很幸运刚入行就赶上了互联网的爆发期。最开始其实是写 Flash 的,完全是兴趣爱好。当然那时候应该没有前端这个岗位。前端这类工作,因为所见即所得,这种即时反馈我很喜欢。
到现在 2023 年了都,然而技术其实还是挺菜的。说白了这么多年都在努力上班,写各种莫名其妙的业务,接各种奇怪的需求。从 PC 到 Mobile,从 Flash 到 HTML Javascript。其间还写过一点 php 和 Objective-C, 2015 年的时候公司要搞 VR 还写过一段时间的 Unity 所以 C# 也会一点。但是以前学的很多语言特性相关的知识都往事如烟了,唯有基础的知识至今还依然在工作中还有用。
最早知道 Keith Peters 是在 2008 年,他出过两本关于 flash 的书《基础动画》与《高级动画》都有中文版本。很幸运这两本书都拜读过,两本都是讲动画相关的基础知识,写的相当优秀,尤其对前端这个职业非常有帮助。
为什么我想翻译他的这个系列文章?嗯。。因为足够简单,不需要引用任何库,拿个文本编辑器就能写,有个浏览器就能跑。虽然我的英语水平也不好,但基于以前读过他的书还有自身处于前端岗位。所以我觉得没问题。我是在 Markdown 上一段一段翻译的,所以中英对照的 Markdown 也在 github 上了。
https://github.com/willian12345/coding-curves/tree/main/posts
作者用的是伪代码方式讲解,我用 Javascript 实现了一遍。每个例子源码都是单独的 html文件,无任何引用,安心...
现已翻译至 10 章.. 需要校对后再发成文章,如果急的话,可以去看中英对照的 Markdown 文件,但弄的挺乱的...
如果有翻译不到位的地方欢迎指正
以下开始作者原文译文
背景
多年来,我一直希望写一本名为“曲线编程”的书。 各种领人着迷的曲线,可以用于趣味编程、更好的理解曲线、生成生动有趣的图形。
我开始写这本书至少三次了,结果冲动又来了,但这回我会现实一点,我不会正襟危坐从头到尾写一本书完整的书并把它编辑成册自己出版(译者注:原作者之前自己出版过《Playing with Chaos 》)。不得不承认这不太可能。我只是想写了。
计划
所以呢,我打算写成系列博客。我不知道发布频率有多高。勤快的话也许一周一篇。如果运气好一切顺利的话可能更的更快些。
但如果我感到无聊、分心或忙于其它事情也可能会更新的很慢。但只要有空,我还是会继续写。
也许,全部完成后真的可以搞成一本书,鬼知道呢。。
目录
计划是这样的。也许会有一丢丢不同。我会将博文连接放在此处,这里就作为总目录了。
- 梦开始的地方(对就是你正在读的)
- 三角函数曲线
- 弧线、圆、椭圆
- 利萨茹曲线 Lissajous
- 谐波图 Harmonographs
- 平托图 Pintographs
- 抛物线 Parabolas
- 贝赛尔曲线 Bezier curves
- 转盘曲线 Roulette curves
- 螺旋 Spirals
- 玫瑰 Roses
- 玑镂(扭索)纹 Guilloche Patterns
- 超级椭圆和超级方程 Superellipses and Superformulas
- 其它曲线 Miscellaneous Curve
一般来说我们会限制在讨论二维的曲线。其中一些课题会用多篇博文.隨着内容的更新,目录也会更新。也许有更多的章节,我很 open 的,欢迎提建议。
受众目标
此课程目标用户是那些对探索不同类型的曲线,并在绘制中实践它们。可能适合:艺术家、设计师、游戏开发、UI、休闲数学家。这不是一个数学教程,尽管有大量的数学包含在内。我给的大量的解释也是非常不完整的。希望提供的材料信息足以让你理解将要绘制的绘制曲线并举一反三。 但,每个章节仅仅介绍了一下相关的数学主题。希望没有什么直接错误。当然我很乐你们指出我的错误,我会尽最大努力改的。
个人来讲,我喜欢找一些数学公式用于创建一些有趣的图形,并观察参数对形状的影响,最终对这些参数进行动态改变形成动画,最后通过对曲线应用公式不断叠加创造一些前所未有的形状。如果你也是其中的爱好者,相信你也会喜欢的。
内容约定
我之前写的大多数文章会使用特定的编程语言,如: Playing With Chaos 内,使用的是 javascript 和 HTML5 Canvas. 主要是希望能它能通用的转换成的任意语言或平台,但又感觉需要使用实际的编程语言来实现它。
但最近在阅读一些优秀的 “射线追踪” 相关的文章时,看到它们没有使用某种真实的编译语言实现,而是通过伪代码的方式展示例子。所以我改主意了,我也将使用伪代码作为代码示例。
所以,无论你在任何编程语言,任何平台上实现,你需要注意以下几点必要条件:
A. 有能力设置canvas或其它类似可以提供绘制的能力
B. 在此基础上可提供绘制不同颜色、粗细线条的能力
C. 拥有典型的编程语言特征和控制结构,如方法,变量,循环,条件等等 。可能还需要一些数组或列表还有对象结构类型,这样就可以创建一个像 Point 这样拥有 x 和 y 属性的类。 任何现代编程语言都包含以上提到的大多数特性,尽管可能样子看起来不太一样。
另外,如果能画圆(至少能画圆弧,圆弧能组成圆)和矩形且能为其填充颜色,当然如果能有填充文本的 api 就更好了。
简单的伪代码例子可能看起来像下面这样:
canvas(800, 800)
setLineWidth(5)
setColor(1, 0, 0) // red
moveTo(100, 100)
lineTo(700, 700)
stroke()
应该输出像这样的图

我会避免深入面向对象或函数式编程它们在不同平台上看起来太不一样了, 但我们又需要一些方法函数 ,所以我保留了一些最基本的:
canvas(500, 100)
foo(100)
function foo(count) {
for (i = 0; i < count; i++) {
moveTo(i * 10, 10)
lineTo(i * 10, 90)
}
stroke()
}
看起来应该是这样

还有一些注意事项
首先,在定义 foo 方法前我先调用了 foo ,在某些编程语言中可能会报错。如果报错,请根据你自己使用的语言调整调用顺序。
其次,绘图 api 调用方式写的好像是直接全局调用。在你的编程语言中可能需要在 canvas 对象下调用,定义成全局或将 api 传进来。 我自己能搞定, 我信你。我就不多说了。重点是有这样的概念,但这可不是最佳的编程实践。
当然我也不会在伪代码中强调变量类型,传参类型,结果返回类型,除非某些特例。随着本系列的深入我的伪代码风格可能也会发生变化,如果是的话,我会回来改这里的说明的。安心了…
等风来
期待第一章吧!
本章 Javascript 源码 https://github.com/willian12345/coding-curves/blob/main/examples/ch01/
博客园: http://cnblogs.com/willian/
github: https://github.com/willian12345/
曲线艺术编程第一章 coding curves的更多相关文章
- Windows核心编程第一章.错误处理
Windows核心编程第一章,错误处理. 一丶错误处理 1.核心编程学习总结 不管是做逆向,开始做开发.在Windows下.你都需要看一下核心编程这本书.这本书确实写得很好.所以自己在学习这本书的同时 ...
- Java 面向对象编程——第一章 初识Java
第一章 初识Java 1. 什么是Java? Java是一种简单的.面向对象的.分布式的.解释的.安全的.可移植的.性能优异的多线程语言.它以其强安全性.平台无关性.硬件结构无关性.语言简 ...
- UNIX环境高级编程--第一章 UNIX基础知识
第一章 UNIX基础知识 1.2 UNIX体系结构 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...
- 读高性能JavaScript编程 第一章
草草的看完第一章,虽然看的是译文也是感觉涨姿势了, 我来总结一下: 由于 大多数浏览器都是 single process 处理 ui updatas and js execute 于是产生问题: js ...
- Go Web 编程 第一章 Web相关概念
第一章 Go与Web应用 Go学习群:415660935 1.1 Web应用 在计算机的世界里,应用(application)是一个与用户进行交互,并完成用户特定任务的软件程序.而Web应用则是部署在 ...
- windows核心编程-第一章 对程序错误的处理
第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...
- 【程序员翻身计划】Java高性能编程第一章-Java多线程概述
目标 重点: 线程安全的概念 线程通信的方式与应用 reactor线程模型 线程数量的优化 jdk常用命令 Netty框架的作用 难点 java运行的原理 同步关键字的原理 AQS的抽象 JUC的源码 ...
- windows核心编程---第一章 谈谈windows中的错误处理机制
我们写的函数会用返回值表示程序执行的正确与否,使用void,就意味着程序一定不会出错.Bool类型标识true时为真,false时为假.其他类型根据需要可以定义成不同意义. Win ...
- 开启Golang编程第一章
Go is an open source programming language that makes it easy to build simple,reliable, and effcient ...
- java并发编程--第一章并发编程的挑战
一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...
随机推荐
- 由反射引出的Java动态代理与静态代理
写在开头 在<深入剖析Java中的反射,由浅入深,层层剥离!>这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代 ...
- 打造个性化日历:Python编程实现,选择适合你的方式!
在本文中,我们将使用Python编写一个简单的日历程序.虽然市面上已经存在现成的日历功能,并且有第三方库可以直接调用实现,但我们仍然希望通过自己编写日历程序来引出我认为好用的日历实现.希望这篇文章能够 ...
- 2021 ASP.NET Core 开发者路线图
GitHub地址:https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md
- B3610 [图论与代数结构 801] 无向图的块 题解
题目传送门 前言 本题解内容均摘自我的 Tarjan 学习笔记 . 解法 Tarjan 与无向图 无向图与割点(割顶) 在一个无向图中,不存在横叉边(因为边是双向的). 一个无向图中,可能不止存在一个 ...
- 跨界协作:借助gRPC实现Python数据分析能力的共享
gRPC是一个高性能.开源.通用的远程过程调用(RPC)框架,由Google推出.它基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言. 在gR ...
- NVME CLI 命令使用
1.下载地址https://github.com/linux-nvme/nvme-cli2.安装unzip nvme-cli-master.zipcd nvme-cli-master.zipmake ...
- jq 完成复选框的全选和全不选,并组装成数组发送到后台
jQuery 代码实现,HTML dom节点对应js的id 即可 <script> $(function() { //复选框全选和全不选 $("#selectAll") ...
- colrm命令
colrm命令 colrm命令用于编辑源代码文件,脚本文件或常规文本文件中的文本,此命令从文件中删除选定的列,列定义为一行中的单个字符.索引总是从1开始,而不是0.如果同时指定了开始和结束,则它们之间 ...
- OpenStack调度器
计算使用 nova-scheduler 服务来确定如何调度计算请求 默认配置中,调度程序会考虑以下所有条件的主机: 位于请求的可用区 (map_az_to_placement_aggregate) 放 ...
- oracle 游标变量ref cursor详解
一 介绍 像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...