映射map()
书名:Processing互动编程艺术
作者:谭亮
出版社:电子工业出版社
出版时间:2011-06
ISBN:9787121134630
一、map()用于把指定数从指定范围映射到另一个范围。
-
map (value, start1, stop1, start2, stop2)
start1:第一个范围开始值
stop1:第一个范围结束值
start2:第二个范围开始值
stop2:第二个范围结束值
value:int或float值 -
原理:
start2+(stop2-start2)*norm(value, start1, stop1)
float x=map(55, 50, 100,500,1000) ; //将550.0赋值给x
float y=map(40, 50, 100,500,1000) ; //将400.0赋值给y
float z=map(110, 50, 100,500,1000) ; //将1100赋值给z
二、碰撞变形的四边形
- 从窗口左边飞出一个四边形,碰撞到窗口边缘后变成形状不同的另一个四边形。被弹回的四边形继续运动直到再撞上窗口边缘,变成其他四边形,如此重复
- 涉及知识:
四边形绘制、坐标变换、随机数产生、变换动画。 -
设计思路:
在窗口边缘随机设置两个点,使四边形从初始点运动到终点,实现从窗口的一边运动到另一边。可以通过修改step变量来修改速度;每次碰撞随机选择变成多边形还是矩形,形状和大小随机发生变化,使四边形看起来像是被碰撞变形。
float startX = 5; //最初的X轴
float startY = 155; //最初的Y轴
float stopX = 0; //最终的X轴
float stopY = 0; //最终的Y轴
float x = startX; //现在的X轴
float y = startY; //现在的Y轴
float step = 0.005; //每步的尺寸(0.0~1.0)
float pct = 0.0; //百分比(0.0~1.0)
int side = 0; //下一次终点边界
int number0 = 0; //四边形的类型变量
float number1 = 0; //矩形的长
float number2 = 0; //矩形的宽
float numberx10 = 0; //四边形第一个点初始的X坐标
float numbery10 = 0; //四边形第一个点初始的Y坐标
float numberx20 = 0; //四边形第二个点初始的X坐标
float numbery20 = 0; //四边形第二个点初始的Y坐标
float numberx30 = 0; //四边形第三个点初始的X坐标
float numbery30 = 0; //四边形第三个点初始的Y坐标
float numberx40 = 0; //四边形第四个点初始的X坐标
float numbery40 = 0; //四边形第四个点初始的Y坐标
float numberx11 = 0; //四边形第一个点当前的X坐标
float numbery11 = 0; //四边形第一个点当前的Y坐标
float numberx21 = 0; //四边形第二个点当前的X坐标
float numbery21 = 0; //四边形第二个点当前的Y坐标
float numberx31 = 0; //四边形第三个点当前的X坐标
float numbery31 = 0; //四边形第三个点当前的Y坐标
float numberx41 = 0; //四边形第四个点当前的X坐标
float numbery41 = 0; //四边形第四个点当前的Y坐标
void setup()
{ size(350,310); //设置一个350像素宽、310像素高的窗口
frameRate(80); //设置80帧速率
smooth();
}
void draw()
{ background(204); //设置灰色背景
if(pct == 0)
{ //当运动进度为0时进行边长随机定义及四边形的选择
randnumber(); //四边形各边、点参数的随机生成
choseside(side); //四边形当前所在边界
}
if(pct < 1.0){ //四边形处于运动状态
if(number0 == 0){ //矩形运动
x = startX + ((stopX-startX) * pct); //矩形中心点x当前坐标
y = startY + ((stopY-startY) * pct); //矩形中心点y当前坐标
pct += step; //刷新运动进度
randomrect(number0, x, y); //显示当前矩形
}
else{ //四边形运动
numberx11 = numberx10 + ((stopX-startX) * pct);
numbery11 = numbery10 + ((stopY-startY) * pct);
// 四边形当前第一个点坐标
numberx21 = numberx20 + ((stopX-startX) * pct);
numbery21 = numbery20 + ((stopY-startY) * pct);
// 四边形当前第二个点坐标
numberx31 = numberx30 + ((stopX-startX) * pct);
numbery31 = numbery30 + ((stopY-startY) * pct);
numberx41 = numberx40 + ((stopX-startX) * pct);
numbery41 = numbery40 + ((stopY-startY) * pct);
// 四边形当前第四个点坐标
pct += step;
// 刷新运动进度
randomrect(number0, x, y);
// 显示当前四边形
}
}
if(pct >= 1){ //当进度进行到100%
startX = stopX;
startY = stopY; //将终点坐标设置为初始坐标
pct = 0; //将进度归0
}
}
void choseside(int side){
switch (side){
case 0:side0(); break; //当前位于屏幕左边边界
case 1:side1(); break; //当前位于屏幕上边边界
case 2:side2(); break; //当前位于屏幕右边边界
case 3:side3(); break; //当前位于屏幕下边边界
default:break;
}
}
void side0(){ //当前位于屏幕左边边界
switch ((int)random(3))
{ //随机生成3个数字决定下次运动到哪个边界
case 0:stopX = (int)random(270)+40; stopY = 10;
// 下次运动到屏幕上边
side = 1; //返回终点边界的上边编号
break;
case 1:stopX = 340; stopY = (int)random(250)+30;
// 下次运动到屏幕右边
side = 2; //返回终点边界的右边编号
break;
case 2:stopX = (int)random(270)+40; stopY = 300;
// 下次运动到屏幕下边
side = 3; //返回终点边界的下边编号
break;
default:break;
}
}
void side1(){ //当前位于屏幕上边边界
switch ((int)random(3))
{ //随机生成3个数字决定下次运动到哪个边界
case 0:stopX = 10; stopY = (int)random(250)+30;
// 下次运动到屏幕左边
side = 0; //返回终点边界的左边编号
break;
case 1:stopX = 340; stopY = (int)random(250)+30;
// 下次运动到屏幕右边
side = 2; //返回终点边界的右边编号
break;
case 2:stopX = (int)random(270)+40; stopY = 300;
// 下次运动到屏幕下边
side = 3; //返回终点边界的下边编号
break;
default:break;
}
}
void side2(){ //当前位于屏幕右边边界
switch ((int)random(3))
{ //随机生成3个数字决定下次运动到哪个边界
case 0:stopX = 10; stopY = (int)random(250)+30;
// 下次运动到屏幕左边
side = 0; //返回终点边界的左边编号
break;
case 1:stopX = (int)random(270)+40; stopY = 10;
// 下次运动到屏幕上边
side = 1; //返回终点边界的上边编号
break;
case 2:stopX = (int)random(270)+40; stopY = 300;
// 下次运动到屏幕下边
side = 3; //返回终点边界的下边编号
break;
default:break;
}
}
void side3(){ //当前位于屏幕右边边界
switch ((int)random(3)){
// 随机生成3个数字决定下次运动到哪个边界
case 0:stopX = 10; stopY = (int)random(250)+30;
// 下次运动到屏幕左边
side = 0; //返回终点边界的左边编号
break;
case 1:stopX = (int)random(270)+40; stopY = 10;
// 下次运动到屏幕上边
side = 1; //返回终点边界的上边编号
break;
case 2:stopX = 340; stopY = (int)random(250)+30;
// 下次运动到屏幕右边
side = 2; //返回终点边界的下边编号
break;
default:break;
}
}
void randnumber(){
number0 = (int)random(2); //等于0为矩形,等于1为四边形
number1 = (int)random(40)+40; //矩形的长
number2 = (int)random(30)+20; //矩形的宽
numberx10 = -random(20) + startX;
numbery10 = -(random(10)+20) + startY;
// 初始四边形第一个点的坐标
numberx20 = random(20)+30 + startX;
numbery20 = -(random(10)+20) + startY;
// 初始四边形第二个点的坐标
numberx30 = random(20)+30 + startX;
numbery30 = random(10)+20 + startY;
// 初始四边形第三个点的坐标
numberx40 = -random(20) + startX;
numbery40 =random(10)+20 + startY;
// 初始四边形第四个点的坐标
}
void randomrect(int number, float x, float y){ //随机生成一种四边形模式
switch (number){
case 0:rect0(x, y); break; //矩形模式
case 1:rect1(); break; //四边形模式
default:break;
}
}
void rect0(float x, float y){ //矩形模式
rectMode(CENTER); //默认模式
rect(x, y, number1, number2);
}
void rect1(){ //四边形模式
rectMode(CENTER); //默认模式
quad(numberx11, numbery11, numberx21, numbery21, numberx31, numbery31, numberx41, numbery41);
}
共有 0 条评论