vector<int> grayCode(int n) { vector<int> res; if(n == 0) { res.push_back(0); return res; } if(n == 1) { res.push_back(0); res.push_back(1); return res; } res.push_back(0); res.push_back(1); for(int i = 2; i <= n; ++i) { for(int j = Power2(i - 1) - 1; j >= 0; --j) { res.push_back(Power2(i - 1) + res[j]); } } return res; }
int Clng ( char *Str ,int n ){ char s[10];int ns = 0; int ret = 0; while(!(Str[n] == '\0' ) && ns < 10){ switch (Str[n]){ case '0': s[ns] = 0 ;ns++;break;case '1': s[ns] = 1 ;ns++;break; case '2': s[ns] = 2 ;ns++;break;case '3': s[ns] = 3 ;ns++;break; case '4': s[ns] = 4 ;ns++;break;case '5': s[ns] = 5 ;ns++;break; case '6': s[ns] = 6 ;ns++;break;case '7': s[ns] = 7 ;ns++;break; case '8': s[ns] = 8 ;ns++;break;case '9': s[ns] = 9 ;ns++;break; } n++; } int ss = 0;ns--; while(ns >= 0){ ret += s[ns] * Power2(10,ss); ns--; ss++; } return ret ; }
block* complex::Merge(node* n) { list<block*> sub_blocks; Recurse(n,&sub_blocks,0); list<block*>::iterator sbit=sub_blocks.begin(); // if (sbit==sub_blocks.end()) // exit(1); block* b=new block(BC(*sbit),this); // block* b=new block(*((*sbit)->bc),this); // assert(b->bdry_verts.Empty()); // (b->bc)->SetAs(BC(*sbit)); BC(b).SetAs(BC(*sbit)); for(int i=0;i<DIM;++i) BC(b)++; int level=(cube_bits-BC(b).Bits())/DIM; for(int i=0;i<level*DIM;++i) BC(b)--; BC(b).Coordinates(min); for(int i=0;i<level*DIM;++i) BC(b)++; vertex* v; int vc[DIM]; int flag=1; cell_iter bvit; cell_iter cit; cobdry_iter cbit; while(sbit!=sub_blocks.end()) { bvit=(*sbit)->bdry_verts.Begin(); while(bvit!=(*sbit)->bdry_verts.End()) { v=(vertex*)(*bvit); v->bc->Coordinates(vc); flag=1; for (int i=0; i<DIM; ++i) flag*=(((min[i]<vc[i])&&(vc[i]<min[i]+Power2(level)))||((vc[i]==0)||(vc[i]==Power2(cube_bits/DIM)))); if (flag) { if (!(v->Interior())) { v->MarkInterior(); DeleteVertex(v); b->cells[0].InsertUniqueSort(v); } } else b->bdry_verts.InsertUniqueSort(v); ++bvit; } for(int i=0;i<DIM;++i) { cit=(*sbit)->cells[i].Begin(); while(cit!=(*sbit)->cells[i].End()) { b->cells[i].InsertUniqueSort(Ptr(cit)); ++cit; } } ++sbit; } cit=b->cells[0].Begin(); while(cit!=b->cells[0].End()) { cbit=((vertex*)(*cit))->Cobdry()->Begin(); // cout << "size " << (*cit)->Cobdry()->Size() << endl; while(cbit!=((vertex*)(*cit))->Cobdry()->End()) { ((edge*)Ptr(cbit))->MarkInterior(); // b->cells[1].InsertUniqueSort(Ptr(cbit)); if (b->cells[1].Find(Ptr(cbit))==b->cells[1].End()) { b->cells[1].InsertUniqueSort(Ptr(cbit)); } ++cbit; } ++cit; } cit=b->cells[1].Begin(); while(cit!=b->cells[1].End()) { cbit=((edge*)(*cit))->Cobdry()->Begin(); // cout << "size " << (*cit)->Cobdry()->Size() << endl; while(cbit!=((edge*)(*cit))->Cobdry()->End()) { ((ncell*)Ptr(cbit))->MarkInterior(); // b->cells[2].InsertUniqueSort(Ptr(cbit)); if (b->cells[2].Find(Ptr(cbit))==b->cells[2].End()) { b->cells[2].InsertUniqueSort(Ptr(cbit)); } ++cbit; } ++cit; } for(int i=3;i<DIM;++i) { cit=b->cells[i-1].Begin(); while(cit!=b->cells[i-1].End()) { cbit=((ncell*)(*cit))->Cobdry()->Begin(); // cout << "size " << (*cit)->Cobdry()->Size() << endl; while(cbit!=((ncell*)(*cit))->Cobdry()->End()) { ((ncell*)Ptr(cbit))->MarkInterior(); // b->cells[i].InsertUniqueSort(Ptr(cbit)); if (b->cells[i].Find(Ptr(cbit))==b->cells[i].End()) { b->cells[i].InsertUniqueSort(Ptr(cbit)); } ++cbit; } ++cit; } } if (n==cubes.Root) cubes.Root=b; else { node* parent=n->Parent; if (parent->Left==n) parent->Left=b; else parent->Right=b; b->Parent=parent; } Delete(n,0); return(b); }
const float32 CVector2D::GetVectorLengthSq() const{ return Power2(this->X) + Power2(this->Y); }
/** * Perform algebraic simplification and strenth reduction */ Symbol Simplify(Type ty, int opcode, Symbol src1, Symbol src2) { VariableSymbol t; Symbol p1, p2; int c1, c2; if (IsRealType(ty)) goto add_value; if (src2 == NULL || (src2->kind != SK_Constant && opcode != SUB)) goto add_value; switch (opcode) { case ADD: // a + 0 = a if (src2->val.i[0] == 0) return src1; // a + c1 + c2 = a + (c1 + c2) // a - c1 + c2 = a + (-c1 + c2) p1 = src1; c1 = 0; if (src1->kind == SK_Temp) { t = AsVar(src1); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p1 = t->def->src1; c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } if (c1 != 0) { src1 = p1; src2 = IntConstant(c1 + src2->val.i[0]); } break; case SUB: // a - 0 = a if (src2->kind == SK_Constant && src2->val.i[0] == 0) return src1; // put source operand into v + c format (v maybe NULL, c maybe 0) p1 = src1; c1 = 0; if (src1->kind == SK_Temp) { t = AsVar(src1); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p1 = t->def->src1; c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } else if (src1->kind == SK_Constant) { p1 = NULL; c1 = src1->val.i[0]; } p2 = src2; c2 = 0; if (src2->kind == SK_Temp) { t = AsVar(src2); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p2 = t->def->src1; c2 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } else if (src2->kind == SK_Constant) { p2 = NULL; c2 = src2->val.i[0]; } if (p1 == p2) { // (a + c1) - (a + c2) = c1 - c2 return IntConstant(c1 - c2); } else if (p1 == NULL) { // c1 - (a + c2) = (c1 - c2) - a src1 = IntConstant(c1 - c2); src2 = p2; } else if (p2 == NULL) { // (a + c1) - c2 = a + (c1 - c2) src1 = p1; opcode = ADD; src2 = IntConstant(c1 - c2); } break; case MUL: case DIV: // a * 1 = a; a / 1 = a; if (src2->val.i[0] == 1) return src1; // a * 2 power of n = a >> n c1 = Power2(src2->val.i[0]); if (c1 != 0) { src2 = IntConstant(c1); opcode = opcode == MUL ? LSH : RSH; } break; case MOD: // a % 1 = 0 if (src2->val.i[0] == 1) return IntConstant(0); // a % 2 power of n = a & (2 power of n - 1) c1 = Power2(src2->val.i[0]); if (c1 != 0) { src2 = IntConstant(src2->val.i[0] - 1); opcode = BAND; } break; case LSH: case RSH: // a >> 0 = a << 0 = a if (src2->val.i[0] == 0) return src1; break; case BOR: // a | 0 = a; a | -1 = -1 if (src2->val.i[0] == 0) return src1; if (src2->val.i[0] == -1) return src2; break; case BXOR: // a ^ 0 = a if (src2->val.i[0] == 0) return src1; break; case BAND: // a & 0 = 0, a & -1 = a if (src2->val.i[0] == 0) return IntConstant(0); if (src2->val.i[0] == -1) return src1; break; default: break; } add_value: return TryAddValue(ty, opcode, src1, src2); }
/* 算数优化 */ Symbol Simplify (Type ty, int opcode, Symbol src1, Symbol src2) { VariableSymbol t; Symbol p1, p2; int c1, c2; /* 浮点 */ if (IsRealType (ty)) goto add_value; if (src2 == NULL || (src2->kind != SK_Constant && opcode != SUB)) goto add_value; /* 以下是 加, 减, 乘, 除, 取余, 左移, 右移, 按位操作的优化 */ switch (opcode) { case ADD: { /* a + 0 = a */ if (src2->val.i[0] == 0) return src1; /* a + c1 + c2 = a + (c1 + c2) */ /* a - c1 + c2 = a + (-c1 + c2) */ p1 = src1; c1 = 0; if (src1->kind == SK_Temp) { t = AsVar(src1); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p1 = t->def->src1; c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } if (c1 != 0) { src1 = p1; /* 合并c1, c2 */ src2 = IntConstant (c1 + src2->val.i[0]); } }break; case SUB: { /* a - 0 = a */ if (src2->kind == SK_Constant && src2->val.i[0] == 0) return src1; // put source operand into v + c format (v maybe NULL, c maybe 0) p1 = src1; c1 = 0; if (src1->kind == SK_Temp) { t = AsVar(src1); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p1 = t->def->src1; c1 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } else if (src1->kind == SK_Constant) { p1 = NULL; c1 = src1->val.i[0]; } p2 = src2; c2 = 0; if (src2->kind == SK_Temp) { t = AsVar(src2); if (t->def->src2 && t->def->src2->kind == SK_Constant && (t->def->op == ADD || t->def->op == SUB)) { p2 = t->def->src1; c2 = (t->def->op == ADD ? 1 : -1) * t->def->src2->val.i[0]; } } else if (src2->kind == SK_Constant) { p2 = NULL; c2 = src2->val.i[0]; } if (p1 == p2) { /* (a + c1) - (a + c2) = c1 - c2 */ return IntConstant (c1 - c2); } else if (p1 == NULL) { /* c1 - (a + c2) = (c1 - c2) - a */ src1 = IntConstant (c1 - c2); src2 = p2; } else if (p2 == NULL) { /* (a + c1) - c2 = a + (c1 - c2) */ src1 = p1; opcode = ADD; src2 = IntConstant(c1 - c2); } }break; case MUL: case DIV: { /* a * 1 = a; a / 1 = a; */ if (src2->val.i[0] == 1) return src1; /* a * 2 power of n = a >> n */ c1 = Power2 (src2->val.i[0]); if (c1 != 0) { /* 转换乘除为位移操作 */ src2 = IntConstant (c1); opcode = opcode == MUL ? LSH : RSH; } }break; case MOD: { /* a % 1 = 0 */ if (src2->val.i[0] == 1) return IntConstant (0); /* a % 2 power of n = a & (2 power of n - 1) */ c1 = Power2 (src2->val.i[0]); if (c1 != 0) { src2 = IntConstant (src2->val.i[0] - 1); opcode = BAND; } }break; case LSH: case RSH: { /* a >> 0 = a << 0 = a */ if (src2->val.i[0] == 0) return src1; }break; case BOR: { /* a | 0 = a; a | -1 = -1 */ if (src2->val.i[0] == 0) return src1; if (src2->val.i[0] == -1) return src2; }break; case BXOR: { /* a ^ 0 = a */ if (src2->val.i[0] == 0) return src1; }break; case BAND: { /* a & 0 = 0, a & -1 = a */ if (src2->val.i[0] == 0) return IntConstant(0); if (src2->val.i[0] == -1) return src1; }break; default: break; } add_value: /* 构造值添加到符号表中,并返回 */ return TryAddValue (ty, opcode, src1, src2); }
static void InitializeScreen(Game* game) { const int bpp = 32; VALUE rbScreen = game->screen; const Texture* screen; Data_Get_Struct(rbScreen, Texture, screen); strb_CheckDisposedTexture(screen); const int width = screen->width; const int height = screen->height; int screenWidth = 0; int screenHeight = 0; Uint32 options = 0; options |= SDL_OPENGL; if (game->isFullscreen) { options |= SDL_HWSURFACE | SDL_FULLSCREEN; game->windowScale = 1; SDL_Rect** modes = SDL_ListModes(NULL, options); if (!modes) { rb_raise(rb_eRuntimeError, "not supported fullscreen resolution"); } if (modes != (SDL_Rect**)-1) { for (int i = 0; modes[i]; i++) { int realBpp = SDL_VideoModeOK(modes[i]->w, modes[i]->h, bpp, options); if (width <= modes[i]->w && height <= modes[i]->h && realBpp == bpp) { screenWidth = modes[i]->w; screenHeight = modes[i]->h; } else { break; } } if (screenWidth == 0 || screenHeight == 0) { rb_raise(rb_eRuntimeError, "not supported fullscreen resolution"); } } else { // any resolution are available screenWidth = width; screenHeight = height; } } else { screenWidth = width * game->windowScale; screenHeight = height * game->windowScale; options |= SDL_SWSURFACE; } SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, game->isVsync ? 1 : 0); game->sdlScreen = SDL_SetVideoMode(screenWidth, screenHeight, bpp, options); if (!game->sdlScreen) { rb_raise_sdl_error(); } SDL_PixelFormat* format = game->sdlScreen->format; game->sdlScreenBuffer = SDL_CreateRGBSurface(SDL_SWSURFACE, Power2(width), Power2(height), bpp, format->Bmask, format->Gmask, format->Bmask, format->Amask); if (!game->sdlScreenBuffer) { rb_raise_sdl_error(); } glClearColor(0.0, 0.0, 0.0, 0.0); glOrtho(0.0, screenWidth, screenHeight, 0.0, -1.0, 1.0); glEnable(GL_TEXTURE_2D); glGenTextures(1, &game->glScreen); glBindTexture(GL_TEXTURE_2D, game->glScreen); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); }