line - 在 p5.js 中画一条不同宽度的线
问题描述
我希望在我的画布上绘制宽度从头到尾逐渐变化的线条。也就是说,假设该行从(等效地, )开始并(0, 0)
以结束,并且必须(线性)从开始到结束增加。width = 1
strokeWeight
(50, 50)
width = 3
width
1
3
关于如何实现这一目标的任何想法?不能把它从网上刮下来。
解决方案
关键是将线分成例如 30 段。您绘制每个段以增加strokeWeight()
。您拥有的线段越多,线条看起来就越平滑。
您可以使用lerp()
来查找两端之间点的 x,y 坐标。
您可以使用lerp()
查找strokeWeight()
两端之间的线。
function setup() {
createCanvas(200, 200);
background("black");
stroke("white");
gradientLine(0, 0, 50, 50, 1, 3, 30);
noLoop();
}
function gradientLine(
start_x,
start_y,
end_x,
end_y,
start_weight,
end_weight,
segments
) {
let prev_loc_x = start_x;
let prev_loc_y = start_y;
for (let i = 1; i <= segments; i++) {
let cur_loc_x = lerp(start_x, end_x, i / segments);
let cur_loc_y = lerp(start_y, end_y, i / segments);
push();
strokeWeight(lerp(start_weight, end_weight, i / segments));
line(prev_loc_x, prev_loc_y, cur_loc_x, cur_loc_y);
pop();
prev_loc_x = cur_loc_x;
prev_loc_y = cur_loc_y;
}
}
<script src="https://cdn.jsdelivr.net/npm/p5@1.0.0/lib/p5.min.js"></script>
编辑:另外,如果使用颜色alpha < 255
,可能会出现这样的伪影:
发生这种情况是因为笔划的默认上限设置为ROUND
。设置strokeCap(SQUARE)
将解决此问题:
这需要push()...pop()
在功能块中设置gradientLine(...)
。(注意:这会使线条的末端看起来很平,这需要更精细的工作。)
推荐阅读
- c++ - 尝试运行安装 Socket.IO C++ 客户端的第 3 步时收到有关 OpenSSL 的错误
- python - 创建一个共现矩阵
- java - java中如何判断当前线程?
- python - 如何在 Python 中查询 Gridfs 对象中的字段
- snowflake-cloud-data-platform - OSError:隧道连接失败:需要 407 代理授权 - snowsql
- c - 当程序从终端运行时,clock_gettime 需要更长的时间来执行
- ios - 运行我的 ios 应用程序后启动错误的应用程序
- python - Python .write 仅在写入与脚本相同的目录时有效
- c# - 通过在.Net core c#中转换日期格式将模型类转换为JSON字符串
- rxjs - 如何随着时间的推移累积每个值的出现次数?