Box2d系列 – 如何防止物体在空中跳跃

首先,我们知道如果一个物体在地面,那么跳跃就太简单了,直接给力就行了,
以下代码就好了

case 'j': //跳动
{
    b2Vec2 vel = body->GetLinearVelocity();
    vel.y = 10;//  先获取其线速度,修改其y方向的速度即可,这种方法再斜坡的时候会出问题。
    body->SetLinearVelocity( vel );
}

另外一种,这种可以解决斜坡的问题。

body->ApplyForce( b2Vec2(0,500), body->GetWorldCenter() );

但是上面的方法有一个通病,就是如果物体在空中的时候也会跳起来。悲剧了,这怎么能行了。
那么如何防止物体在空中跳动了?iforce2d

read more

多级反馈优先队列调度算法-c语言代码

多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调度算法。
  多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。
  多级(假设为N级)反馈队列调度算法可以如下原理:
  1、设有N个队列(Q1,Q2….QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的

read more

Box2d系列 – 利用box2d editor制作自己的多米诺骨牌

前一段时间写了如何制作简单的物理场景,但凡物理场景不可能是简单的,肯定是由很多个元素控制的场景,但是如果每一个都要些那么多代码的话,那工作量就很大了,于是就有人开发工具了,本文所写的就是用一个工具来构造一个多米洛骨牌系统。
工具的网站是http://www.iforce2d.net/
rube box2d editor
这个工具windows不能用,有bug,完善版的只有mac 和linux的。

read more

Box2d系列 – 动手构建一个简单的物理世界

假定你已经知道了一些物理的基本术语,以及引擎的一些术语。
重力,线速度,角速度,扭矩,冲量,刚体,b2Fixture(夹子),
坐标系,相对坐标系,物理世界,刚体睡眠。
以及如何简单的使用cocos2d-x来构建程序。

那么我们开始吧。

1.坐标系
在cocos2d-x的box2d,其物理世界已经与屏幕坐标系重合了,便于开发者的计算。

2.相对坐标系

假设A是世界坐标点中的(1,1),而B对A的

read more

C++ 整型大数类

因为白痴的广东省赛没提供java,所以只得用C++操作大数。
整理了一下大数的模板,希望用得着吧。

#include <iostream>
#include <string.h>
#include <string>
#define DIGIT   4
#define DEPTH	10000 
#define MAX     400    //数字的位数*4 ,这里就可以保存1600位数的整数
typedef int bigint_t[MAX + 1];
using namespace std;
char combuffer[MAX*DIGIT+10];  //通用buffer
inline int stob(bigint_t a, char * buf)
{
	int i,j,sgn = 1;
	memset(a,0,sizeof(bigint_t));
	if(*buf == '-') sgn = -1 , buf++;
	else if(*buf == '+') buf++;
	for (a[0] = strlen(buf) ,  i = a[0]/2 -1 ; i >= 0 ; i--) std::swap(buf[a[0] - i -1],buf[i]);  //交换
	for (a[0] = (a[0] + DIGIT -1)/DIGIT , j= strlen(buf) ; j < DIGIT*a[0] ; buf[j++] = '0');   //补0
	for (i = 1 ; i <= a[0] ; i++)
		for( a[i] = 0 , j = 0 ; j < DIGIT ; j++)
			a[i] = a[i]*10 + buf[i*DIGIT - 1 -j] - '0';   //4位存
	for (;!a[a[0]] && a[0] > 1 ; a[0]--);  //去零
	if (a[0] == 1 && !a[1] ) sgn=0;  //为0
	return sgn;
}
 
 
void bigadd(bigint_t &a, const bigint_t b) // a = a + b
{
	int i;
	for (i = 1 ;i <= b[0] ; i++)
		if ( (a[i] += b[i]) >= DEPTH)
			a[i]-=DEPTH , a[i+1]++;
	if (b[0] >= a[0])
		a[0] = b[0];
	else
		for (;a[i] >= DEPTH && i < a[0] ; a[i] -= DEPTH, i++ ,a[i]++);
	a[0] += ( a[a[0]+1] > 0);
}
 
void bigsub(bigint_t &a , const bigint_t b) // a = a - b
{
	int i;
	for (i = 1;i <= b[0] ; i ++)
		if (( a[i] -= b[i] ) < 0)
			a[i+1]--,a[i] += DEPTH;
	for (;a[i] < 0;a[i] += DEPTH, i++ , a[i]--);
	for (;!a[a[0]] && a[0] > 1 ; a[0]--);
}
 
void bigmul(bigint_t c,const bigint_t a,const bigint_t b){ // c = a*b
	int i,j;
	memset((void*)c,0,sizeof(bigint_t));
	for (c[0] = a[0] + b[0] - 1 , i = 1 ; i <= a[0] ; i++)
		for (j = 1 ; j <= b[0] ; j++)
			if ( ( c[i+j-1] += a[i]*b[j] ) >= DEPTH)
				c[i+j] += c[i+j-1] / DEPTH ,c[i+j-1]%=DEPTH;
	for ( c[0] += (c[c[0]+1]>0) ; !c[c[0]]&&c[0]>1 ; c[0]--);
}
 
int cmp(const bigint_t a , const bigint_t b)
{
	int i;
	if (a[0]!=b[0])
		return a[0]-b[0];
	for (i=a[0];i;i--)
		if (a[i]!=b[i])
			return a[i]-b[i];
	return 0;
}
 
/*
----------------------------除法部分,
*/
int cmp2(const bigint_t a,const int c,const int d,const bigint_t b){
	int  i , t = 0 , O = -DEPTH * 2;
	if (b[0]-a[0]< d && c)
		return 1;
	for (i = b[0] ; i > d ; i--){
		t = t * DEPTH + a[i-d] * c-b[i];
		if (t > 0) return 1;
		if (t < O) return 0;
	}
	for (i = d ; i ; i--){
		t = t*DEPTH-b[i];
		if (t > 0) return 1;
		if (t < O) return 0;
	}
	return t > 0;
}
void sub2(bigint_t a,const bigint_t b,const int c,const int d){
	int i,O = b[0] + d;
	for (i = 1 + d ; i <= O ; i++)
		if ((a[i] -= b[i-d]*c)<0)
			a[i+1] += (a[i]-DEPTH+1)/DEPTH, a[i] -= (a[i]-DEPTH+1)/DEPTH*DEPTH;
	for (;a[i] < 0 ; a[i+1] += (a[i]-DEPTH+1)/DEPTH , a[i] -= (a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
	for (;!a[a[0]] && a[0]>1 ;a[0]--);
}
void bigdiv(bigint_t c,bigint_t a,const bigint_t b){
	int h , l , m ,i;
	memset((void*)c,0,sizeof(bigint_t));
	c[0] = (b[0]<a[0]+1) ? (a[0]-b[0]+2) :1;
	for (i = c[0]; i ;sub2(a , b , c[i] = m, i-1) , i--)
		for (h = DEPTH - 1 , l=0 , m = (h + l + 1)>>1 ; h > l ; m = (h + l + 1)>>1)
			if (cmp2( b , m , i-1 , a)) h = m-1;
			else l = m;
			for (;!c[c[0]] && c[0] > 1 ; c[0]--);
			c[0] = c[0]>1 ? c[0]:1;
}
 
//////////////////////////////////////////////////////////////////////////
struct bigint{
	/*
	如没有负数和减法,重载可以全部不用写
	*/
	bigint_t value;
	int sgn;
	bigint (char *buf) {    //构造器
		sprintf(combuffer,"%s",buf);
		sgn = stob(value,combuffer); 
	}
	bigint (int v)   {   //整型构造
		sgn = stob(value,itoa(v,combuffer,10));	
	}  
	bigint (){
		memset(value,0,sizeof(bigint_t));
		sgn = 0;
	}
	void init(char *buf)   //设定值,如不需要,可以不用写
	{
		sprintf(combuffer,"%s",buf);
		sgn = stob(value,combuffer); 
	}
	void init(int v) {	sgn = stob(value,itoa(v,combuffer,10));	}
	void show()   //显示字符的函数
	{
		if(sgn == -1)
			printf("-");
		int i,j;
		for (printf("%d",value[i=value[0]]),i--;i;i--)
			for (j=DEPTH/10;j;j/=10)
				printf("%d",value[i]/j%10);
	}
	inline bigint & operator = (const  bigint& a)
	{
		memcpy(value,a.value,sizeof(bigint_t));
		sgn = a.sgn;
		return *this;
	}
	inline bigint& operator += (const bigint& a){
		if(sgn == a.sgn) bigadd(value,a.value);
		else if(sgn && a.sgn)
		{
			int ret=cmp(value,a.value);
			if(ret > 0)
				bigsub(value,a.value);
			else if(ret < 0)
			{
				bigint_t t;
				memcpy(t,value,sizeof(bigint_t));
				memcpy(value,a.value,sizeof(bigint_t));
				bigsub(value,t);sgn=a.sgn;
			}
			else memset(value,0,sizeof(bigint_t)),value[0]=1,sgn=0;
		}else if(!sgn)
			memcpy(value,a.value,sizeof(bigint_t)),sgn=a.sgn;
		return *this;
	}
 
	inline bigint & operator + (const bigint & a)
	{
		bigint ret;
		memcpy(ret.value,value,sizeof(bigint_t));
		ret.sgn = sgn;
		ret += a;
		return ret;
	}
	inline bigint& operator -= (const bigint& a){
		if(sgn * a.sgn < 0)bigadd(value,a.value);
		else if(sgn && a.sgn)
		{
			int ret = cmp(value,a.value);
			if(ret > 0) bigsub(value,a.value);
			else if( ret < 0)
			{
				bigint_t t;
				memcpy(t,value,sizeof(bigint_t));
				memcpy(value,a.value,sizeof(bigint_t));
				bigsub(value,t);sgn =- sgn;
			}else memset(value,0,sizeof(bigint_t)),value[0]=1,sgn=0;
		}
		else if(!sgn)
			bigadd(value,a.value),sgn=-a.sgn;
		return *this;
	}
	inline bigint & operator - (const bigint &a)
	{
		bigint ret;
		memcpy(ret.value,value,sizeof(bigint_t));
		ret.sgn = sgn;
		ret -= a;
		return ret;
	}
	inline bigint & operator * (const bigint &a)
	{
		bigint ret;
		bigmul(ret.value,value,a.value);
		ret.sgn = sgn*a.sgn;
		return ret;
	}
 
	//除法重载
	inline bigint& operator/=(const bigint& a)
	{
		bigint_t t;
		bigdiv(t, value , a.value);
		memcpy(value,t,sizeof(bigint_t));
		sgn=(value[0]==1&&!value[1])?0:sgn*a.sgn;
		return *this;
	}
	inline bigint operator / (const bigint& a){
		bigint ret;
		bigint_t t;
		memcpy(t,value,sizeof(bigint_t));
		bigdiv(ret.value,t,a.value);ret.sgn=(ret.value[0]==1&&!ret.value[1])?0:sgn*a.sgn;
		return ret;
	}
};
 
 
int main()
{
	bigint a(0),b("1"),c;
 
	scanf("%s",combuffer);
	c.sgn = stob(c.value,combuffer);
	a.init(5);
	b.init("111111111111111111111111111111111111111111111111111111111111111111111111111");
	c.show(),puts("");
	c = a+b;
	c.show(),puts("");
	c = a*c;
	c.show(),puts("");
	c = c/a;
	c.show(),puts("");
	return 0;
}
Pages: 1 2 3 4 5 6 7 8 9 10 ...35 36 37 Next