映射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);
}

版权声明:
作者:Zad
链接:https://www.techfm.club/p/45939.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>