首页 > 未分类 > 文盲角度,什么是向量,什么是类,向量怎样相加?
2017
09-29

文盲角度,什么是向量,什么是类,向量怎样相加?

//二话不说,先上代码
//该段内容来自于《代码本色》P24,向量章节

//x与y为小球的位置
//小球在二维坐标系中的位置都是由x与y两个轴组成的
//小球在二维坐标系中的运动也就可以理解/分解成
//在x轴与y轴单独运动后组合起来的结果
//因为程序中的时间单位为帧,所以每帧移动多远也可以理解为速度
//也就是说小球的运动是由x轴与y轴两个地方的速度组合起来的
//也就是向量的雏形
float x = 100;
float y = 100;
float xspeed=1;
float yspeed=3.3;

void setup(){
size(200,200);
smooth();
background(255);
}

void draw(){
background(255);

//每帧都比上一帧多走一段,这一帧里的“一段”就是速度
x=x+xspeed;
y=y+yspeed;

//等于最大或者等于0的时候就是在x轴处碰壁
//此时于x轴的运动立即往之前方向的负方向走
//运动由速度构成,也就是正速度变为负速度
if((x>width)||(x<0)){
xspeed=xspeed*-1;
}
//与上一段同理
if((y>height)||(y<0)){
yspeed=yspeed*-1;
}

//描边,填色,告诉电脑是给啥描边填色——给下面的圆
stroke(0);
fill(175);
ellipse(x,y,16,16);
}

//何为向量?
//位置:float x与float y 可为向量Vector location
//速度:float xspeed与float yspeed 可为向量Vector speed

//还有更多的可例子可以转换为向量,例如
//加速度 xacceleration和yacceleration
//目标位置 xtarget和ytarget
//摩擦力 xfriction和yfriction

//引入向量最起码的作用是可以简化代码

//
//
//新位置=当前位置在速度作用下的位置
//
//
//当用向量表示位置时,向量可理解为原点到该位置的路径

//下面的内容中,“类”,“对象”,“面向对象”是一个绕不开的概念
//所以需要回过头补一下这方面的课,不过不用担心,
//学习“对象”与“面向对象”的时候不一定需要拥有对象
//当然,如果你有一个对象,也许会比其他人学得更快一些

//首先了解一下“类”和“对象”的关系,
//“苹果”是一个“类”,那苹果中的一个品种”红富士“
//就是“苹果”这个“类”中创建的一个“对象”
//而“苹果”有很多品种,但所有的品种都属于“苹果”
//(装个逼,“类”和“对象”的关系有点像符号学里索绪尔提出的
//“能指”与“所指”的概念,这也说明了毕竟编程语言也是一门语言哈~)

//关于此节内容的更详细讲解,请看《processing语言权威指南》P395
//这里的讲解非常形象到位
//毕竟我只是做笔记的~

//然后再阅读一段《Processing语言权威指南》P399的一段运用类与对象的代码
//实际感受一下什么是类与代码

//代码如下

//首先给电脑说好有一个变量,这个变量名字叫sp
//类型为Spot,电脑可能不认识,因为这是一个自定义的变量
//不过没关系,在后文会告诉电脑这个变量类型是啥意思
Spot sp;

void setup(){
size(100,100);
smooth();
noStroke();
//虽然还没告诉电脑变量是啥,但是依旧装作无事发生,淡定创建新变量
//sp是一个变量,是一个对象,是Spot类里的新变量
//所以要叫new Spot,虽然Spot是啥还没有讲给电脑
//Spot里也没有变量,那自然第一个变量就是新变量了~
sp=new Spot();
//因为一个对象的变量是封装起来的,不会被外界随便访问/窥探/调用
//所以当我们要用到这些藏于密封纸箱里的变量时,必须要通过
//“点操作符”访问,也就是这个变量是哪个对象里的,
//就先写好所属对象名,再加个点,在写上你要操作的变量名
sp.x=33;
sp.y=50;
sp.diameter=30;
}

void draw(){
background(0);
//告诉电脑用这些变量画个圆,当然电脑还不知道这些对象和变量是啥意思
//如果它着急了,请安抚一下,别急,下面会就告诉电脑了
//读取上一段的几个变量,放入函数
ellipse(sp.x,sp.y,sp.diameter,sp.diameter);
}

//等了这么久,终于到了给电脑搞对象的时候了
//记住,“对象”是归于“类”之中的,所以要搞对象,就先创建类
//此处创建一个类,名字叫Spot的类
class Spot{
//这个类中有以下几种变量
//表示坐标的x与y
//表示直径的diameter
//当然,也可以一起全部写在一行里
float x,y;
float diameter;
}
//创建完“类”之后,就可以随便在“类”之下创建对象啦!

//这只是类的最基本用法,可以说只是演示了什么是类,怎么用而已
//正常使用中遇到的情况会比这个例子更加复杂一点,
//所以就需要引入下一个概念
//“类”中的“构造函数”
//这里先引入这个概念,后面遇到再提

//了解完类后,继续接着刚刚向量的话题

//刚刚说到“当用向量表示位置时,向量可理解为原点到该位置的路径”
//意思就是说向量不但可以表示物体在二维坐标系中运动的速度
//也可以用来表示位置
//为什么要提一下“类”呢,因为向量大多数是当做对象使用,
//而对象是存储于类中的
//例如(该处引用《代码本色》中文版P27-28部分内容)
//clsaa PVector{

//float x
//float y

//PVector(float _x,float _y){
//x=_x;
//y=_y;
//}
//}

//这里的PVector是只储存了两个变量的简单数据结构
//那么之前代码中的
//float x = 100;
//float y = 100;
//float xspeed = 1;
//float yspeed = 3.3;
//就变成了:
//PVector location = new PVector(100,100);
//Pvector Velocity = new PVector(1,3.3);
//也就是说在PVector类中新建了两个向量对象
//分别是位置向量与速度向量
//而描述一个物体的运动是
//新位置=原位置+速度(因为时间总是按帧来算的,所以就不特别引入时间)
//按之前没有向量概念的代码中来写就是
//x=x+xspeed;
//y=y+yspeed;
//切换到我们现在的向量思维中就是
//location=location+velocity
//当然这是理想状态,事实上processing语言中
//加号只是为原生数据类型(整数,浮点数等)预留的
//在processing中,我们并不能直接将两个PVector对象相加
//但是Pvector中却包含了一些常用的数学操作函数。
//接下来就要引入一些对PVector对象的操作函数了
//首先跟着书本回顾一下向量的加法运算
//这里就不多说了,毕竟写这个只是用来读代码的

//在向量加法之后书中给出了一段用add()函数操作对象的例子
//class Pvector{
//float x;
//float y;

//PVector(float x_,flpat y_);{
//x=x_;
//y=y_;
//}
//到这里为止都是我们之前刚刚读过的内容,
//下面就开始新东西了,add()函数,用该函数让向量相加

//一个函数,名为add()的函数,
//将对象PVector v放入函数使用
//在该函数中,遵照向量相加的法则,两个对应的分量相加
//x加x,y加y(注意,此x非彼x,此y非彼y,只是为了好说明)
//void add(PVector v){
//y轴上的新位置=y轴上的位置+y轴上的速度
//y=y+v.y;
//x轴上的新位置=x轴上的位置+x轴上的速度
//x=x+v.x;
//x与y合起来就是(x轴上的新位置,y轴上的新位置)
//也就是说(x,y)就是在二维坐标上的新位置
//也就是说PVector v这个向量的意思就是新位置的向量
//}
//}

//这番操作之后得出的结果也就是
//我们之前简单理想中的location=location+velocity这个式子的
//最终结果:location.add(velocity)

//A.add(B)也就是向量A加向量B

//在每一帧刷新一个位置的“运动”中
//新位置=原位置+速度
//就是我们模拟“运动”的主体思路
//location=location+velocity=location.add(veloity)
//接下来就是带着新式装备返回原处重新是施工
//代码如下:

//声明两个向量
//一个向量名字叫location
//一个向量名字叫velocity
//在该段代码中,以后见到这两个名字,就是向量
PVector location;
PVector velocity;

void setup(){
size(200,200);
smooth();

//PVector()为构造函数,用于创建对象时初始化对象
//即为对象赋初始值,与new一块用
//此处为两个向量分别赋值
//给向量赋值要用到构造函数
//location向量的初始值为(100,100)
location = new PVector(100,100);
//velocity向量的初始值为(2.5,5)
velocity = new PVector(2.5,5);
}
void draw(){
background(255);
//用add()函数进行一个location向量与velocity向量间的加法
//并以此相加的结果为location向量赋值
//效果等同于
//向量location=向量location+向量velocity
//等同于x=x+xspeed;y=y+yspeed
//该向量运算可同时得出x与y两个值,直接得出位置的坐标
//(location.x,location,y)
//接下来的每一帧都进行一次这样的位置更新运算
location.add(velocity);
//if语句对每一帧的运算结果进行检测
//当x轴的位置大于边界或者小于0的时候
//则x轴的速度变为负
if((location.x>width)||(location.x<0)){
velocity.x=velocity.x*-1;
}
//与上同理
if((location.y>height)||(location.y<0)){
velocity.y=velocity.y*-1;
}

stroke(0);
fill(175);
//根据圆心位置画圆
ellipse(location.x,location.y,16,16);
}

//至此,一个小球弹跳的向量化改造完成
//恭喜你,升级了!



最后编辑:
作者:DurianBomb
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。