代码来源于openprocessing,考虑到国内不是很好访问,我把我找到的比较好的搬运过来!

@

合集1

参考:https://openprocessing.org/sketch/793375

https://github.com/SourceOf0-HTML/processing-p5.js/tree/master

这个可以体验6种笔触,作者介绍如下:

There are multiple pages. Use the "←" "→" buttons below to switch.

The second page explains the UI.

I will explain the sketches I made in the past.

Some variable names have been changed. I wanted to explain in order, so I divided the processing in detail. The UI has been added so the code is getting longer ...

Video of this sketch in action (Twitter)

https://twitter.com/BUN_information/status/1195300719231791104

Gorilla Sun has written an explanation of each part with animations on his blog. Thank you!

https://gorillasun.de/blog/Simulating-brush-strokes-with-Hookes-Law-in-P5JS-and-Processing

其中三种种笔触的代码如下:

笔触4(流速笔触,速写)

原笔触代码地址:https://openprocessing.org/sketch/748836

特点:越快越粗,很适合画速写。

代码

/*
setup=()=>{m=n=x=y=u=v=0,s=0.08,f=0.8;createCanvas(L=500,L);background(C=255)}
draw=()=>{u+=(m-x)*s,v+=(n-y)*s,u*=f,v*=f,a=x,b=y;strokeWeight(abs(u+v)/3+1);line(x+=u,y+=v,a,b)}
mousePressed=()=>{x=m=mouseX,y=n=mouseY}
mouseDragged=()=>{m=mouseX,n=mouseY}
/**/ function setup() {
mX = mY = x = y = ax = ay = 0;
spring = 0.08;
friction = 0.8;
createCanvas( 500, 500 );
background( 255 );
} function draw() {
ax += ( mX - x ) * spring;
ay += ( mY - y ) * spring;
ax *= friction;
ay *= friction; oldX = x;
oldY = y;
x += ax;
y += ay;
strokeWeight( abs( ax + ay ) / 3 + 1 );
line( x, y, oldX, oldY );
} function mousePressed() {
mX = x = mouseX;
mY = y = mouseY;
} function mouseDragged() {
mX = mouseX;
mY = mouseY;
}

笔触5(流速笔触,晕染)

原笔触代码地址:https://openprocessing.org/sketch/754815

特点:越慢越粗,墨水有晕染感,适合写字。

/*
setup=_=>createCanvas(S=500,S),D=10,m=n=x=y=u=v=r=f=0
draw=_=>{R=r;if(mouseIsPressed){m=mouseX;n=mouseY;!f?(f=1,x=m,y=n):0;u+=(m-x)/2;v+=(n-y)/2;u/=2;v/=2;r=25-sqrt(u*u+v*v)*.7;i=D;while(--i)strokeWeight(R+=(r-R)/D),line(x,y,x+=u/D,y+=v/D)}else if(f){u=v=f=0}}
/**/ function setup() {
createCanvas(S=500,S);
distance = 10;
spring = 0.5;
friction = 0.5;
mX = mY = x = y = ax = ay = r = f = 0;
} function draw() {
oldR = r;
if(mouseIsPressed) {
mX = mouseX;
mY = mouseY;
if(!f) {
f = 1;
x = mX;
y = mY;
}
ax += ( mX - x ) * spring;
ay += ( mY - y ) * spring;
ax *= friction;
ay *= friction;
r = 25 - sqrt( ax*ax + ay*ay ) * 0.7; for( i = 0; i < distance; ++i ) {
oldX = x;
oldY = y;
x += ax / distance;
y += ay / distance;
oldR += ( r - oldR ) / distance;
strokeWeight( oldR );
line( x, y, oldX, oldY );
}
} else if(f) {
ax = ay = f = 0;
}
}
/**/

笔触6(流速笔触,毛笔)

原笔触代码地址:https://openprocessing.org/sketch/755877

特点:越慢越粗,有墨水晕染,线条有割裂,适合写毛笔字。

/**
* Added on October 22, 2020
*
* Hi, I'm BUN.
* I've been surprised at how many people have forked over this sketch, more than I expected. Thanks.
*
* Here is a sketch that explains this code with multiple codes.
* Please use it as a reference.
* https://www.openprocessing.org/sketch/793375
*
* Brief explanation.
* This code primarily uses "Hook's Law".
* In other words, it simulates the motion of a spring.
*
* From the mouse position, the position to be drawn is moved like a spring.
* And the width of the line is changed according to the speed of the movement.
*
** Added on May 8, 2021 **
* Gorilla Sun has written an explanation of each part with animations on his blog. Thank you!
* https://gorillasun.de/blog/Simulating-brush-strokes-with-Hooke's-Law-in-P5JS-and-Processing
**/
function setup() {
createCanvas(windowWidth,windowHeight);
distance = 10;
spring = 0.5;
friction = 0.5;
size = 25;
diff = size/8;
x = y = ax = ay = a = r = f = 0;
} function draw() {
oldR = r;
if(mouseIsPressed) {
mX = mouseX;
mY = mouseY;
if(!f) {
f = 1;
x = mX;
y = mY;
}
ax += ( mX - x ) * spring;
ay += ( mY - y ) * spring;
ax *= friction;
ay *= friction;
a += sqrt( ax*ax + ay*ay ) - a;
a *= 0.6;
r = size - a; for( i = 0; i < distance; ++i ) {
oldX = x;
oldY = y;
x += ax / distance;
y += ay / distance;
oldR += ( r - oldR ) / distance;
if(oldR < 1) oldR = 1;
strokeWeight( oldR+diff );
line( x, y, oldX, oldY );
strokeWeight( oldR );
line( x+diff*2, y+diff*2, oldX+diff*2, oldY+diff*2 );
line( x-diff, y-diff, oldX-diff, oldY-diff );
}
} else if(f) {
ax = ay = f = 0;
}
}
/**/

合集2

压感笔触,这个我暂时也没找到合集也没找到太多现成的就只找到一个,剩下的我打算自己写一下。

笔触1(平板压感笔触,不连续圆点)

原笔触代码地址:https://openprocessing.org/sketch/591905

特点: 有压感,支持平板手写笔,可惜是不连续的圆点。

size(600,600);
var p=0;
this.addEventListener('pointermove', function(ev) {
p=(ev.pressure);
}, false);
background(55);
draw = function(){
ellipse(mouseX,mouseY,20*p,20*p);
};

笔触2(平板压感笔触,连续)【自制】

基于前面的笔触自己合的。

var p=0;
this.addEventListener('pointermove', function(ev) {
p=(ev.pressure);
}, false); function setup() {
createCanvas(S=500,S);
distance = 10;
spring = 0.5;
friction = 0.5;
mX = mY = x = y = ax = ay = r = f = 0;
} function draw() {
if(mouseIsPressed) {
mX = mouseX;
mY = mouseY;
if(!f) {
f = 1;
x = mX;
y = mY;
}
ax += ( mX - x ) * spring;
ay += ( mY - y ) * spring;
ax *= friction;
ay *= friction; for( i = 0; i < distance; ++i ) {
oldX = x;
oldY = y;
x += ax / distance;
y += ay / distance;
strokeWeight( p*20 );
line( x, y, oldX, oldY );
}
} else if(f) {
ax = ay = f = 0;
}
}

笔触3(平板压感笔触,连续,修复上一个的压感不连续的毛病)【自制】

已经公开发布,欢迎测试:https://openprocessing.org/sketch/2249898

var p=0;
// this.addEventListener('pointermove', function(ev) {
// p=(ev.pressure);
// }, false); function setup() {
createCanvas(S=500,S);
distance = 10;
spring = 0.5;
friction = 0.5;
size = 150;
pressure = 0;
mX = mY = x = y = ax = ay = r = f = 0;
} function draw() {
oldX = x;
oldY = y;
if(mouseIsPressed) {
oldR = r;
// get pressure 取第一个touches的压力值
for (i = 0; i < touches.length; i++) {
pressure = touches[i].pressure;
break;
}
r = size * pressure; // 使用压力值来调整圆点大小
if (r < 1) r = 1; // 确保圆点有最小大小
mX = mouseX;
mY = mouseY;
if(!f) {
f = 1;
x = mX;
y = mY;
}
ax += ( mX - x ) * spring;
ay += ( mY - y ) * spring;
ax *= friction;
ay *= friction; for( i = 0; i < distance; ++i ) {
oldX = x;
oldY = y;
x += ax / distance;
y += ay / distance;
// 平滑过度压力值
oldR += ( r - oldR ) / distance;
strokeWeight( oldR ); // 设置基于压力的笔触宽度
// 画一个基于压力大小的线
line( x, y, oldX, oldY );
}
} else if(f) {
ax = ay = f = 0;
}
}

【代码】Processing笔触手写板笔刷代码合集(包含流速、毛笔笔触、压感笔触等多种)的更多相关文章

  1. 《Programming WPF》翻译 第7章 3.笔刷和钢笔

    原文:<Programming WPF>翻译 第7章 3.笔刷和钢笔 为了在屏幕上绘制一个图形,WPF需要知道你想要为图形填充什么颜色以及如何绘制它的边框.WPF提供了一些Brush类型支 ...

  2. .Net 2014 Connect() 相关文章合集

    微软在11月中旬的Connect()研讨会中公布了一系列 2015年的发展规划,今天在MSDN Blog上看到了一篇比较全的相关文章合集,这里转录一下,感兴趣的朋友可以看看. Announcement ...

  3. jsfl调整笔刷的笔触和颜色

    今天在用jsfl写脚本以简化对fla资源的处理工作,在画矩形时需要能自动调整笔刷的笔触颜色,填充颜色透明度,查jsfl文档无果,上网查了多番资料写出了可用代码,共享下: var fill = fl.g ...

  4. 计算机视觉与模式识别代码合集第二版two

    Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...

  5. 计算机视觉与模式识别代码合集第二版three

    计算机视觉与模式识别代码合集第二版three     Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow   ...

  6. WooCommerce代码合集整理

    本文整理了一些WooCommerce代码合集,方便查阅和使用,更是为了理清思路,提高自己.以下WooCommerce简称WC,代码放在主题的functions.php中即可. 修改首页和分类页面每页产 ...

  7. Javascript 语言精粹 代码片段合集

    Javascript 语言精粹 代码片段合集 标签:Douglas-Crockford Javascript 最佳实践 原文链接 更好的阅读体验 使用一个method 方法定义新方法 Function ...

  8. 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集

    1,推荐几篇非常有用的博文 原创写的真的非常好 主要讲解原理,整体布局三部分组成以及设置padding等等作用, 下拉的具体实现 滑动到底部具体加载以及判断手势事件,再次推荐作者的 详细讲解 建议先看 ...

  9. 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...

  10. 位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 中国省市区查询:2017最新中国省市区地址 经纬度地址转换:经纬度 ...

随机推荐

  1. 深入掌握 SQL 深度应用:复杂查询的艺术与技巧

    title: 深入掌握 SQL 深度应用:复杂查询的艺术与技巧 date: 2025/2/10 updated: 2025/2/10 author: cmdragon excerpt: SQL(结构化 ...

  2. jenkins全局工具配置

  3. QT5笔记: 8. QT的全局变量(基本数据类型、函数、宏)

    这个头文件中存放着QT类库的一些全局定义,一般Qt类的头文件会包含这个头文件: 基本数据类型 函数 宏 数据类型:保证跨平台时各数据类型长度统一 函数定义(一些数学函数未在QtGlobal中,而是在Q ...

  4. rust学习笔记(4)

    流程控制 if if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is ...

  5. linux npm 全局安装 command not found

    前言 在 linux 使用 npm 全局安装一个模块时,会提示命令找不到. 例如:npm install @quasar/cli -g 后 $ quasar -v quasar: command no ...

  6. mac mamp php扩展安装

    官网下载需要开启的php扩展 PHP扩展下载官网地址 解压扩展包,指定mamp所使用的php版本的phpize编译安装 # 在解压的扩展包中执行以下命令 /Applications/MAMP/bin/ ...

  7. CISCN&CCB半决赛_2025_PWN_WP

    CISCN&CCB半决赛_2025_PWN_WP 前言: 记录一下第一次打半决赛国赛,总结来说还是自己太菜了,还有check脚本是真的很shi,正规军白给了... typo break edi ...

  8. 【Python自动化测试环境管理】tox

    1. tox基本介绍 1.1 tox是什么? tox 是一个用于管理 Python 项目的自动化测试和环境管理工具.它的主要功能是创建虚拟环境并运行项目的测试套件,tox能够让我们在同一个Host上自 ...

  9. 初识if,if的三种结构

    1.if语句 流程控制语句:通过一语句,来控制程序的执行流程.其中if属于分支结构 2.if语句的第一种格式 . 实操: 3.if的第二种格式 实操: 4.if的第三种格式 实操: 5.注意事项 在i ...

  10. HTML5 定时通知

    通过setInterval()和Notification来实现定时通知功能. demo <script> window.onload = function () { //每10秒弹出一个桌 ...