Curves曲线

J David Eisenberg(人名)

这篇简短的教程将向您介绍正在处理的三种类型的曲线:圆弧、样条曲线和Bézier曲线

弧线

圆弧是最简单的曲线。处理将圆弧定义为椭圆的一段。使用以下参数调用函数:

arc(x, y, width, height, start, stop);

The first four parameters are the same as the ones for ellipse(); they define the boundary box for your arc. The last two parameters are the starting and ending angle for the arc. These angles, as with all other angles in Processing, are given in radians. Remember that angles are measured clockwise, with zero degrees pointing east. Using the fact that PI radians equals 180°, here are some example arcs.

前四个参数与ellipse();的参数相同;它们定义了弧的边界框。最后两个参数是弧的开始和结束角度。这些角度,和处理中的所有其他角度一样,都是以弧度表示的。记住,角度是顺时针测量的,零度指向东方。利用PI(π)弧度等于180°的事实,这里有一些例子弧。

(补充说明:在后期学习过程中发现,TAU使用起来更方便,TAU=2*PI ,也就是圆周弧长,而PI是半个圆周弧长。基于TAU圆周弧长计算会变得更加清晰,易懂)

void setup() {size(300, 200);background(255);smooth();rectMode(CENTER); // 显示边框stroke(128);rect(35, 35, 50, 50);rect(105, 35, 50, 50);rect(175, 35, 50, 50);rect(105, 105, 100, 50);stroke(0);arc(35, 35, 50, 50, 0, PI / 2.0); // 下四分之一圆arc(105, 35, 50, 50, -PI, 0);  // 圆的上半部分arc(175, 35, 50, 50, -PI / 6, PI / 6); // 60度arc(105, 105, 100, 50, PI / 2, 3 * PI / 2); // 180度
}

样条曲线

弧线很好,但很简单。下一个函数curve()允许您绘制不一定是圆弧一部分的曲线。该函数绘制技术上称为Rom-Catmull样条曲线。要绘制曲线,必须指定曲线开始和结束的点的(x,y)坐标。还必须指定两个控制点来确定曲率的方向和数量。对curve()的调用使用以下参数:

curve(cpx1, cpy1, x1, y1, x2, y2, cpx2, cpy2);
cpx1, cpy1

第一控制点坐标

x1, y1

曲线起点坐标

x2, y2

曲线终点坐标

cpx2, cpy2

第二控制点坐标

下面是一个显示curve()的示例。控制点显示为红色,曲线点显示为蓝色。

void setup() {size(200, 200);background(255);smooth();stroke(0);curve(40, 40, 80, 60, 100, 100, 60, 120);noStroke();fill(255, 0, 0);ellipse(40, 40, 3, 3);fill(0, 0, 255, 192);ellipse(100, 100, 3, 3);ellipse(80, 60, 3, 3);fill(255, 0, 0);ellipse(60, 120, 3, 3);
}

控制点如何影响曲线的外观?深呼吸,因为这有点复杂。

•起点处与曲线的切线与控制点1和曲线终点之间的直线平行。这些是左边图表中用绿色显示的线。

•终点处曲线的切线与起点和控制点2之间的直线平行。这些是左边图表中紫色的线。

连续样条曲线

孤立地说,一条curve())并不特别吸引人。要通过多个点绘制连续曲线,最好使用curveVertex()函数。只有在使用beginShape()endShape() 函数创建形状时,才能使用此函数。

这是一条连接点(40,40),(80,60),(100,100),(60,120)和(50,150)的曲线。常用的方法是将曲线的第一个点作为第一个控制点,最后一个点作为最后一个控制点。

int[] coords = {40, 40, 80, 60, 100, 100, 60, 120, 50, 150
};
void setup() {size(200, 200);background(255);smooth();noFill();stroke(0);beginShape();curveVertex(40, 40); // 第一个控制点curveVertex(40, 40); // 也是曲线的起点curveVertex(80, 60);curveVertex(100, 100);curveVertex(60, 120);curveVertex(50, 150); // 曲线的最后一点curveVertex(50, 150); // 也是最后一个控制点endShape();//使用数组使代码更短;//你已经知道怎么画椭圆了!fill(255, 0, 0);noStroke();for (int i = 0; i < coords.length; i += 2) {ellipse(coords[i], coords[i + 1], 3, 3);}
}

贝塞尔曲线

虽然样条曲线比圆弧更好,但它似乎没有那些优美的、说“艺术”的俯冲曲线,为此,需要使用bezier()函数绘制Bézier曲线。与样条曲线一样,bezier()函数有八个参数,但顺序不同:

bezier(x1, y1, cpx1, cpy1, cpx2, cpy2, x2, y2);
x1, y1

曲线起点坐标

cpx1, cpy1

第一控制点坐标

cpx2, cpy2

第二控制点坐标

x2, y2

曲线终点坐标

这是一个显示贝塞尔曲线及其控制点的程序。

void setup() {size(150, 150);background(255);ellipse(50, 75, 5, 5); // 曲线端点ellipse(100, 75, 5, 5);fill(255, 0, 0);ellipse(25, 25, 5, 5);  // 控制点ellipse(125, 25, 5, 5); noFill();stroke(0);bezier(50, 75, 25, 25, 125, 25, 100, 75);
}

虽然很难可视化控制点如何影响curve(),但更容易看到控制点如何影响Bézier曲线。想象一下两根杆子和几个橡皮筋。极点将控制点连接到曲线的端点。一条橡皮筋把电线杆的顶端连接起来。另外两个橡皮筋将磁极的中点连接到第一个橡皮筋的中点。另外一个橡皮筋连接他们的中点。最后一根橡皮筋的中心与曲线相连。这些图表有助于解释:

连续贝塞尔曲线

正如curveVertex()允许您生成连续的样条曲线一样,bezierVertex()允许您生成连续的Bézier曲线。同样,您必须在beginShape() / endShape() 序列中。必须使用vertex(startX, startY) 指定曲线的起点。通过调用指定后续点:

bezierVertex(cpx1, cpy1, cpx2, cpy2, x, y);
cpx1, cpy1

第一控制点坐标

cpx2, cpy2

第二控制点坐标

x, y

曲线上的下一点

因此,要使用bezierVertex()绘制上一个示例,请执行以下操作:

void setup() {size(150, 150);background(255);smooth();// 不显示控制点的位置noFill();stroke(0);beginShape();vertex(50, 75); // first pointbezierVertex(25, 25, 125, 25, 100, 75);endShape();
}

这是一条连续的Bézier曲线,但它并不平滑地连接起来。图中显示了控制点,但这里只有绘制曲线的相关代码。

size(200, 200);
background(255);noFill();beginShape();vertex(30, 70); // 第一个点bezierVertex(25, 25, 100, 50, 50, 100);bezierVertex(50, 140, 75, 140, 120, 120);
endShape();

为了使两条曲线A和B平滑地连续,A的最后一个控制点、A的最后一个点和B的第一个控制点必须在一条直线上。下面是一个符合这些条件的例子。直线上的点以粗体显示。

size(200, 200);
background(255);
beginShape();
vertex(30, 70); // 第一个点
bezierVertex(25, 25, 100, 50, 50, 100);
bezierVertex(20, 130, 75, 140, 120, 120);
endShape();

摘要

•当您需要一段圆或椭圆时,请使用arc()。不能创建连续的圆弧或将它们用作形状的一部分。

•当两点之间需要一条小曲线时,请使用curve()。使用curveVertex()将连续的一系列曲线作为形状的一部分。

•需要长而平滑的曲线时,请使用bezier()。使用bezierVertex()将连续的Bézier曲线系列作为形状的一部分。

【11】processing-曲线(中文)相关推荐

  1. 11款开放中文分词引擎大比拼

    在逐渐步入DT(Data Technology)时代的今天,自然语义分析技术越发不可或缺.对于我们每天打交道的中文来说,并没有类似英文空格的边界标志.而理解句子所包含的词语,则是理解汉语语句的第一步. ...

  2. DirectX 11 Tutorial 4 中文翻译版教程: 缓存区、着色器和HLSL

    原英文版地址:http://www.rastertek.com/dx11tut04.html 本教程将介绍如何在Directx11中编写顶点和像素遮影器.它还将介绍如何在Directx11中使用顶点和 ...

  3. DirectX 11 Tutorial 2 中文翻译版教程:创建框架和窗口

    原英文版地址:http://www.rastertek.com/dx11tut02.html 在开始使用Directx11编码之前,我建议构建一个简单的代码框架.这个框架将处理基本的Windows功能 ...

  4. 11款开放中文分词引擎大比拼 1

    在逐渐步入DT(Data Technology)时代的今天,自然语义分析技术越发不可或缺.对于我们每天打交道的中文来说,并没有类似英文空格的边界标志.而理解句子所包含的词语,则是理解汉语语句的第一步. ...

  5. DirectX 11 Tutorial 3 中文翻译版教程: 初始化DirectX 11

    原英文版地址:http://www.rastertek.com/dx11tut03.html 本教程将首次介绍如何使用Directx11.我们将讨论如何初始化和关闭Direct3D以及如何渲染到窗口. ...

  6. 【数学建模之Python】11.炉温曲线可视化

    如果解决了你的问题,点个赞再走嘛٩(๑❛ᴗ❛๑)۶ 目前正在做高教杯2020年A题,记录一下可视化过程,不断更新 根据制程界限绘图 1.已知某次实验数据(附件中),根据本次实验数据做可视化 impor ...

  7. DirectX 11 Tutorial 6 中文翻译版教程: 漫射照明

    原英文版地址:http://www.rastertek.com/dx11tut06.html 在本教程中,我将介绍如何使用漫反射照明和Directx11来照亮三维对象.我们将从前面的教程中的代码开始并 ...

  8. python文本分析的开源工具_共有11款Python 中文分词库开源软件

    "哑哈"中文分词,更快或更准确,由你来定义.通过简单定制,让分词模块更适用于你的需求. "Yaha" You can custom your Chinese W ...

  9. 机器学习11. ROC曲线、AUC值、Accuracy、Precision、Recall 含义

    AUC/ROC,Accuracy,Precision,Recall 含义.查准率,查全率,样本均衡问题 部分图片转自这里 行的True和False表示预测为正负 列的Pos和Neg表示真实的正负 表哥 ...

  10. Python Turtle 小项目11 玫瑰曲线

    本次我们继续使用turtle模块绘制图案,附代码 效果如下图: n=3 n=5 n=7 n=9 n=2 n=8 代码: from turtle import * from math import *d ...

最新文章

  1. TCP/IP协议面试常见题目
  2. 集团化后的挚文还有很多“新故事”可以讲
  3. java数据类型(整型、浮点型、char类型、boolean型、类型转换)
  4. Java 将excel中的内容导入数据库中
  5. 用Java简便地去重+排序(洛谷P1059题题解,Java语言描述)
  6. 命令行编译_[Bazel]自定义命令行编译标志
  7. 数据库路由中间件MyCat - 源代码篇(17)
  8. Cesium - 地形瓦片(Quantized-mesh)
  9. Spring源码解析目录
  10. Basic knowledge about python
  11. SQL Server 2019 安装教程(详细免费,自定义安装)
  12. ofd文件怎么打开?怎么转换成pdf格式发票?ofd文件打开教程
  13. 谷歌地球替代软件、谷歌街景、谷歌三维城市模型查看全方案
  14. pip的安装,卸载和换源
  15. quartz 定时任务不运行问题
  16. 魅蓝手机ROOT权限获取
  17. CentOS 7校准时间–NTP
  18. 使用DDKWirzard+VS2005开发驱动
  19. 数据结构实验课_实验四 队列
  20. Markdown 更改字体颜色

热门文章

  1. 完美池宇峰畅谈创业点滴 男怕入错行
  2. 射频芯片ATE测试从入门到放弃之收发机
  3. 单行道行车模拟(元胞自动机)——greatji1994
  4. matlab 取数组第一行,matlab中如取数组的矩阵的一行出来成为一个向量?
  5. 什么是TensorFlow
  6. matlab解韩信点兵问题,小学数学题目巧解—韩信点兵问题
  7. 姿态估计mmpose一手体验 Ⅱ - 使用它!
  8. python运行报错怎么看_解决python运行启动报错问题
  9. 关于getc与fgetc和getchar的本质区别
  10. 计算机培训课堂感言,信息技术培训学习感言.docx