用编程对P5中的一些“线条”效果进行扩充

一.实现对接口line的扩展

1.实现动态的绘制直线,同时添加线宽和颜色的随机生成。
在这里插入图片描述

核心代码:

    push();
	for(var i=1;i<res;i++)
	{
		var t = i/res;
		var xt = lerp(x0,x1,t);
		var yt = lerp(y0,y1,t);
		var x = xt;
		var y = yt;		
		strokeWeight(10);//设置线宽
		stroke(random(0,255),random(0,255),random(0,255));//颜色随机生成
		line(xp,yp,x,y);
		xp = x;
		yp = y;
	}
	pop();

2.实现对sin曲线的扩展,形成类似声波的线条。
在这里插入图片描述
(增加了sin函数的振幅随着i的增加而增加)

核心代码:

	for(var i=1;i<res;i++)
	{
		var t = i/res;
		var xt = lerp(x0,x1,t);
		var yt = lerp(y0,y1,t);
		var x = xt + i;
		var y = yt + radius *i* sin(100*i);
		strokeWeight(5);
		stroke(random(0,255),random(0,255),random(0,255));
		line(xp,yp,x,y);
		xp = x;
		yp = y;
	}

3.绘制sin函数时,用大小随机的圆来代替直线。

在这里插入图片描述在这里插入图片描述
(其实就是绘制sin函数的时候,每一小段不是用直线来画,而是绘制一个大小和颜色随机的圆)
核心代码:

	for(var i=1;i<res;i++)
	{
		var t = i/res;
		var xt = lerp(x0,x1,t);
		var yt = lerp(y0,y1,t);
		var x = xt + i;
		var y = yt + radius*sin(50*i);
		//r=random(100,250);g=random(100,250);b=random(100,250);
		r=random(200,250);g=random(100,140);b=random(150,200);
        fill(r,g,b,random(50,255));
        var t=random(0.1,8);
        ellipse(random(x-5,x+5),random(y-5,y+5),t,t);
		xp = x;
		yp = y;
		
	}
    //注释这句就会出现动态的serin曲线
	//nostroke();

4.用noise噪声来绘制山丘
在这里插入图片描述
主要使用了noise函数,其与random函数最大的不同点在于前者是在一个无限的n维空间内定义的。实现山的起伏效果使用了两个noise噪声,第一个用来顶定山脉存在较大起伏的地方,第二个噪声值在第一个的基础上使山脉的细节变化更多些。
核心代码:

var noiseScale=0.01;
	var noiseScale2=0.02;
	for(var k=0;k<mountainNum;k++){
		for(var x=0;x<width;x++){
			var noiseVal=noise((-mouseX+x)*noiseScale+k*100);
			var noiseVal2=noise((-mouseX+x+100)*noiseScale2+k*100);
			stroke(230-40*k);
			var mountainstall=height-mountainTall+noiseVal*160-50+noiseVal2*60+50*k;
			line(x, mountainstall, x, height);
		}
		var tem=height-mountainstall+180+50*k;
		mountainShade(tem,230-40*k,shade);在这里插入代码片

5.通过鼠标控制Bezier曲线的绘制。
在这里插入图片描述
通过P5的官网了解到,bezier()函数的用法,通过鼠标的位置决定控制点的位置。
核心代码:

    var r=random(10,20);
	stroke(random(10,150),random(100,250),random(100,250));
	strokeWeight(2);
	noFill();
	bezier(mouseX,mouseY,mouseX-100,
		mouseY+100,mouseX+100,mouseY-100,40,3);里插入代码片
二.实现2D图形的扩展(主要是circle)

1.随机绘制大小颜色不一样的圆
在这里插入图片描述
核心代码:

stroke(random(10,250),random(10,250),random(10,250));
	var d=random(10,30);
	//ellipse(mouseX,mouseY,d,d);
	ellipse(random(0,weight),random(0,height),d,d);

2.绘制由内向外,圆的半径依次增大,一个周期的变化,参考网址:https://m.yisu.com/zixun/158611.html
在这里插入图片描述

核心代码:

for(var i=13;i>0;i--){
		var y=22*sin(PI*frameCount/30-13*(i-1));
		if(y>=10){
			a=y;
		}
		else{
			a=0;
		}
		fill(0,93,172,a);
		ellipse(x0,y0,a+50*i);
		fill(0,93,172,a);
		ellipse(x0,y0,25+50*(i-1));
	}

3.绘制圆运动撞墙反弹并继续运动。

在这里插入图片描述

实验核心代码:

function bounceOnEdge() {
  //if条件判断
  if (x >= width - ballSize / 2) {
    xSpeed *= -1;
    x = width - ballSize / 2;
  }
  if (x <= ballSize / 2) {
    xSpeed *= -1;
    x = ballSize / 2;
  }
  if (y >= height - ballSize / 2) {
    ySpeed *= -1;
    y = height - ballSize / 2;
  }
  if (y <= ballSize / 2) {
    ySpeed *= -1;
    y = ballSize / 2;
  }
}

修改小球的大小,不覆盖小球运动的路径时会出现:
在这里插入图片描述
4.实现被拖拽的小球始终回到画布中间的效果
在这里插入图片描述
用向量控制小球运动的轨迹,同时边缘检测和控制使小球不会出界
核心代码:

 //边缘检测和控制
  //if条件判断
  if (pos.x >= width - ballSize / 2) {
    vel.x *= -1;
    pos.x = width - ballSize / 2;
    //fill(random(255), random(255),random(255));
  }
  if (pos.x <= ballSize / 2) {
    vel.x *= -1;
    pos.x = ballSize / 2;
    //fill(random(255), random(255),random(255));
  }
  if (pos.y >= height - ballSize / 2) {
    vel.y *= -1;
    pos.y = height - ballSize / 2;
    //fill(random(255), random(255),random(255));
  }
  if (pos.y <= ballSize / 2) {
    vel.y *= -1;
    pos.y = ballSize / 2;
    //fill(random(255), random(255),random(255));
  }
}

无论怎么拖拽,小球都会回到画布中心:

//回到画布中心
function moveTo(target) {
  let force = p5.Vector.sub(target, pos);
  force.mult(1 / 7);
  vel.add(force);//向量加法
  vel.mult(0.5);
}

实验源代码下载:https://download.csdn.net/download/N0BUGLL/13204670

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值