processing 写的规律图形运动

processing 写的规律图形运动

也是第一次用processing写图形,期间参考了别人的做法,废话不多说,直接开始

我原本是准备完成这一张图

在这里插入图片描述
不过做的途中出现了点问题,然后我又想实现点花里胡哨的的效果,结果就变成了这个样子
在这里插入图片描述
好的,我知道这两个完全不像,其实是我数学有点算不明白。
下面一点一点说明

原图分析:第一个图实际上有这么几个方面
1.旋转
2.旋转的同时,每个点都在沿着直线简谐运动
3.时间要卡的很准,否则就是混乱的
4.运动模糊

接下来是我做的过程
我不喜欢模糊的感觉,我喜欢拖尾的感觉,然后查找别人的代码,知道了大概点运动的时候拖尾,而且是两层该怎么处理(一层是黑,一层是变色)。

刚开始我是考虑拖尾的问题,喜欢研究这些花哨的。
这样实现的。
class Particle {
ArrayList points = new ArrayList();

void draw(int k) {
stroke(30);
for (int i = points.size()-1; i > 0; i–) {
PVector l = points.get(i);
PVector l2 = points.get(i-1);
strokeWeight(map(i, 0, points.size(), 0, 20));
line(l.x, l.y, l2.x, l2.y);
}
//hei
for (int i = points.size()-1; i > 0; i–) {
PVector l = points.get(i);
PVector l2 = points.get(i-1);
stroke(map(i, points.size()-1, 0, k20%255+80, 0), 255-k, k17%255);
strokeWeight(map(i, 0, points.size(), 0, 10));
line(l.x, l.y, l2.x, l2.y);
}//hong
}

void move(PVector loc) {
points.add(loc);
if (points.size() > 10) {
points.remove(0);
}
}
}
这个是点的定义,这个拖尾的主要方式就是把点连成线,然后点的大小和颜色改变,做成水滴的感觉(不过上面那是蝌蚪的感觉,我会说明为啥的)

下面是线的定义,就是如何排列这一个一个点。
class Link {
Particle p;

int i;

Link(int i) {
this.i = i;
p = new Particle();
// p2 = new Particle();
}

void draw(int k) {
p.draw(k);
// p2.draw();
}
//100sin(frameCount)
void move() {
PVector loc;
if((t/180)%2==1 && ((i/24)==0 || (i/24)==3 || (i/24)==6 || (i/24)==9 || (i/24)==12|| (i/24)==15)){
loc = new PVector(sin(PI/180
(i+frameCount2))100+100sin(PIframeCount/180)cos(PIframeCount/90+12), cos(PI/180*(i+frameCount2))100+100sin(PIframeCount/90)sin(PIframeCount/180+12));

}
else{
loc = new PVector(sin(PI/180*(i+frameCount2))100, cos(PI/180(i+frameCount2))100);
}
p.move(new PVector(loc.x+sin(5
frameCount), loc.y+cos(5frameCount)));
// p2.move(new PVector(loc.x-sin(radians(i))50, loc.y-cos(radians(i))50));
//100
cos(radians(2
frameCount+i))sin(radians(2frameCount+i)),+100
cos(radians(2*frameCount+i))cos(radians(2frameCount+i))
//(t/180)%2==1
}
}

这个是线的处理,里面的重要的函数的意思,和数学的意思我会在接下来讲。
不同的点的颜色的处理,以及每个水滴的颜色包括每个颜色的内部都不太一样是因为这一句。
stroke(map(i, points.size()-1, 0, k20%255+80, 0), 255-k, k17%255);
里面的k是我在之前设定的一个变量,每个水滴的k都不一样。map就是把一段数字映射到另一段数字上。上面的rgb值都是我瞎试的,发现这个方式做出来确实是挺随机的,关键还不是random那种乱七八糟的随机,是有规律的,那相连的点的颜色就会是渐变的。
strokeWeight(map(i, 0, points.size(), 0, 10));
这句话当然就是改变每个点的大小了,头大尾小的水滴就是这样了,i是我之前定义的每个初始点的度数,基本就是代表是哪个点了。

下面是蝌蚪的实现
p.move(new PVector(loc.x+sin(5frameCount), loc.y+cos(5frameCount)));
简单的说就是在算出点的坐标后给个圆,就神奇的发现他在绕着圈抖。

最难的部分就是数学这里了。就是这一段的得来
if((t/180)%2==1 && ((i/24)==0 || (i/24)==3 || (i/24)==6 || (i/24)==9 || (i/24)==12|| (i/24)==15)){

loc = new PVector(sin(PI/180*(i+frameCount2))100+100sin(PIframeCount/180)cos(PIframeCount/90+12), cos(PI/180*(i+frameCount2))100+100sin(PIframeCount/90)sin(PIframeCount/180+12));

}
else{
loc = new PVector(sin(PI/180*(i+frameCount2))100, cos(PI/180(i+frameCount2))*100);
}
每个数字都是经过计算的,否则运动过程中一定有地方不对
开头的if是每180帧可以绕圈转,然后180帧有五个蝌蚪开始转,然后绕一圈后愉快的回归大家庭中,我是有15个点,所以每个点都隔24°。我一直想计算出个表达式让他的点可以一个一个运动出来,但是每次的结果都不对,但是实际上每次的结果还都挺漂亮的。

我之前还想过,只让点简谐运动,不让他旋转,让画布旋转,后来我放弃了这个想法,因为画布旋转的话可以实现这个效果,但是这就让蝌蚪沿着圆走的时候没有了拖尾,因为蝌蚪实际上没动,是画布旋转的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值