// 设置阻挡 void CShape::SetBlock(int x, int y, unsigned short block) { assert(GetFather()); switch(block) { case CRegion::BLOCK_SHAPE: for (int i=x-GetFigure(); i<=x+GetFigure(); i++) { for (int j=y-GetFigure(); j<=y+GetFigure(); j++) { CRegion::tagCell* pCell = ((CRegion*)GetFather())->GetCell(i,j); if( pCell && pCell->bBlock == CRegion::BLOCK_NO ) { pCell->bBlock = CRegion::BLOCK_SHAPE; } } } break; case CRegion::BLOCK_NO: for (int i=x-GetFigure(); i<=x+GetFigure(); i++) { for (int j=y-GetFigure(); j<=y+GetFigure(); j++) { CRegion::tagCell* pCell = ((CRegion*)GetFather())->GetCell(i,j); if( pCell && pCell->bBlock == CRegion::BLOCK_SHAPE ) { pCell->bBlock = CRegion::BLOCK_NO; } } } break; } }
void CMonster::SetPosXY(float x, float y) { // 将之前位置的阻挡去除 if(GetFather()) SetBlock(GetTileX(), GetTileY(), CRegion::BLOCK_NO); CShape::SetPosXY(x,y); // 设置新的阻挡位置 if(GetFather()) SetBlock(GetTileX(), GetTileY(), GetBlockType()); }
// 可否攻击 bool CGate::IsAttackAble(CMoveShape* pAttackShape) { if(!GetUnAttack()) return false; if(pAttackShape == NULL) return false; if(GetState() == STATE_DIED || IsDied()) return false; //城门打开时不可攻击 if(GetAction()==ACT_OPEN) return false; CServerRegion* pRegion = (CServerRegion*)GetFather(); if(pRegion == NULL) return false; //城门在非战斗时间不能被攻击 bool bResult = false; switch( pAttackShape -> GetType() ) { case TYPE_PLAYER: { } break; } return bResult; }
void Work(void){ for(long i=1;i<=k;i++){ long x=son[i],ans=0; for(Party* point=p[i];point;point=point->next){ long y=point->y; long t=GetFather(x,y); if(deep[x]+deep[y]-(deep[t]<<1)>ans) ans=deep[x]+deep[y]-(deep[t]<<1); } if(i!=k)printf("%ld\n",ans);else printf("%ld",ans); } }
double Kruskal(int nodenum) { int cnt=0,i,f1,f2; double sumh=0.0,sumd=0.0; QSort(0,edgenum-1); for (i=1;i<=nodenum;i++) father[i]=i; //初始化并查集 for (i=0;i<edgenum;i++) { f1=GetFather(edge[i].u); f2=GetFather(edge[i].v); if (f1!=f2) { father[f1]=f2; //res+=edge[i].w; //下面两行是迭代的处理方式 sumh+=edge[i].h; sumd+=edge[i].dis; cnt++; if (cnt==nodenum-1) break; //已经加入了n-1条边,完成最小生成树 } } return (sumh/sumd); //返回新的迭代值 }
void EERIE_CreateCedricData(EERIE_3DOBJ * eobj) { eobj->m_skeleton = new Skeleton(); if(eobj->grouplist.size() <= 0) { // If no groups were specified // Make one bone eobj->m_skeleton->bones.resize(1); Bone & bone = eobj->m_skeleton->bones[0]; // Add all vertices to the bone for(size_t i = 0; i < eobj->vertexlist.size(); i++) { bone.idxvertices.push_back(i); } // Initialize the bone bone.init.quat = glm::quat(); bone.anim.quat = glm::quat(); bone.init.scale = Vec3f_ZERO; bone.anim.scale = Vec3f_ZERO; bone.init.trans = Vec3f_ZERO; bone.transinit_global = bone.init.trans; bone.father = -1; } else { // Groups were specified // Alloc the bones eobj->m_skeleton->bones.resize(eobj->grouplist.size()); bool * temp = new bool[eobj->vertexlist.size()]; memset(temp, 0, eobj->vertexlist.size()); for(long i = eobj->grouplist.size() - 1; i >= 0; i--) { VertexGroup & group = eobj->grouplist[i]; Bone & bone = eobj->m_skeleton->bones[i]; EERIE_VERTEX * v_origin = &eobj->vertexlist[group.origin]; for(size_t j = 0; j < group.indexes.size(); j++) { if(!temp[group.indexes[j]]) { temp[group.indexes[j]] = true; bone.idxvertices.push_back(group.indexes[j]); } } bone.init.quat = glm::quat(); bone.anim.quat = glm::quat(); bone.init.scale = Vec3f_ZERO; bone.anim.scale = Vec3f_ZERO; bone.init.trans = Vec3f(v_origin->v.x, v_origin->v.y, v_origin->v.z); bone.transinit_global = bone.init.trans; bone.father = GetFather(eobj, group.origin, i - 1); } delete[] temp; // Try to correct lonely vertex for(size_t i = 0; i < eobj->vertexlist.size(); i++) { long ok = 0; for(size_t j = 0; j < eobj->grouplist.size(); j++) { for(size_t k = 0; k < eobj->grouplist[j].indexes.size(); k++) { if((size_t)eobj->grouplist[j].indexes[k] == i) { ok = 1; break; } } if(ok) break; } if(!ok) { eobj->m_skeleton->bones[0].idxvertices.push_back(i); } } for(long i = eobj->grouplist.size() - 1; i >= 0; i--) { Bone & bone = eobj->m_skeleton->bones[i]; if(bone.father >= 0) { long father = bone.father; bone.init.trans -= eobj->m_skeleton->bones[father].init.trans; } bone.transinit_global = bone.init.trans; } } /* Build proper mesh */ { Skeleton* obj = eobj->m_skeleton; for(size_t i = 0; i != obj->bones.size(); i++) { Bone & bone = obj->bones[i]; if(bone.father >= 0) { /* Rotation*/ bone.anim.quat = obj->bones[bone.father].anim.quat * bone.init.quat; /* Translation */ bone.anim.trans = obj->bones[bone.father].anim.quat * bone.init.trans; bone.anim.trans = obj->bones[bone.father].anim.trans + bone.anim.trans; } else { /* Rotation*/ bone.anim.quat = bone.init.quat; /* Translation */ bone.anim.trans = bone.init.trans; } bone.anim.scale = Vec3f_ONE; } eobj->vertexlocal = new Vec3f[eobj->vertexlist.size()]; // TODO constructor is better than memset memset(eobj->vertexlocal, 0, sizeof(Vec3f)*eobj->vertexlist.size()); for(size_t i = 0; i != obj->bones.size(); i++) { Vec3f vector = obj->bones[i].anim.trans; for(size_t v = 0; v != obj->bones[i].idxvertices.size(); v++) { long idx = obj->bones[i].idxvertices[v]; const EERIE_VERTEX & inVert = eobj->vertexlist[idx]; Vec3f & outVert = eobj->vertexlocal[idx]; Vec3f temp = inVert.v - vector; temp = glm::inverse(obj->bones[i].anim.quat) * temp; outVert.x = temp.x; outVert.y = temp.y; outVert.z = temp.z; } } } }
int GetFather(int x) { if (x!=father[x]) father[x]=GetFather(father[x]); //路径合并 return father[x]; }