void Comparer::SortTree(Node *p, std::multiset<Node *, NCompare> &setNodes) { std::vector<Node *> temp; setNodes.insert(p); temp = p->getChildren(); for (auto node : temp) { SortTree(node, setNodes); } temp.clear(); }
inline std::multiset<T>& operator>> (object o, std::multiset<T>& v) { if(o.type != type::ARRAY) { throw type_error(); } object* p = o.via.array.ptr + o.via.array.size; object* const pbegin = o.via.array.ptr; while(p > pbegin) { --p; v.insert(p->as<T>()); } return v; }
int plPXPhysicalControllerCore::SweepControllerPath(const hsPoint3& startPos, const hsPoint3& endPos, hsBool vsDynamics, hsBool vsStatics, uint32_t& vsSimGroups, std::multiset< plControllerSweepRecord >& WhatWasHitOut) { NxCapsule tempCap; tempCap.p0 =plPXConvert::Point( startPos); tempCap.p0.z = tempCap.p0.z + fPreferedRadius; tempCap.radius = fPreferedRadius ; tempCap.p1 = tempCap.p0; tempCap.p1.z = tempCap.p1.z + fPreferedHeight; NxVec3 vec; vec.x = endPos.fX - startPos.fX; vec.y = endPos.fY - startPos.fY; vec.z = endPos.fZ - startPos.fZ; int numberofHits = 0; int HitsReturned = 0; WhatWasHitOut.clear(); NxScene *myscene = plSimulationMgr::GetInstance()->GetScene(fWorldKey); NxSweepQueryHit whatdidIhit[10]; unsigned int flags = NX_SF_ALL_HITS; if(vsDynamics) flags |= NX_SF_DYNAMICS; if(vsStatics) flags |= NX_SF_STATICS; numberofHits = myscene->linearCapsuleSweep(tempCap, vec, flags, nil, 10, whatdidIhit, nil, vsSimGroups); if(numberofHits) {//we hit a dynamic object lets make sure it is not animatable for(int i=0; i<numberofHits; i++) { plControllerSweepRecord CurrentHit; CurrentHit.ObjHit=(plPhysical*)whatdidIhit[i].hitShape->getActor().userData; CurrentHit.Norm.fX = whatdidIhit[i].normal.x; CurrentHit.Norm.fY = whatdidIhit[i].normal.y; CurrentHit.Norm.fZ = whatdidIhit[i].normal.z; if(CurrentHit.ObjHit != nil) { hsPoint3 where; where.fX = whatdidIhit[i].point.x; where.fY = whatdidIhit[i].point.y; where.fZ = whatdidIhit[i].point.z; CurrentHit.locHit = where; CurrentHit.TimeHit = whatdidIhit[i].t ; WhatWasHitOut.insert(CurrentHit); HitsReturned++; } } } return HitsReturned; }
void ExtremalQuery3BSP<Real>::CreateSphericalBisectors (BasicMesh& mesh, std::multiset<SphericalArc>& arcs) { // For each vertex, sort the normals into a counterclockwise spherical // polygon when viewed from outside the sphere. SortVertexAdjacents(mesh); int numVertices = mesh.GetNumVertices(); const BasicMesh::Vertex* vertices = mesh.GetVertices(); std::queue<std::pair<int,int> > queue; for (int i = 0; i < numVertices; ++i) { const BasicMesh::Vertex& vertex = vertices[i]; queue.push(std::make_pair(0, vertex.NumTriangles)); while (!queue.empty()) { std::pair<int,int> arc = queue.front(); queue.pop(); int i0 = arc.first, i1 = arc.second; int separation = i1 - i0; if (separation > 1 && separation != vertex.NumTriangles - 1) { if (i1 < vertex.NumTriangles) { SphericalArc arc; arc.NIndex[0] = vertex.T[i0]; arc.NIndex[1] = vertex.T[i1]; arc.Separation = separation; arc.Normal = mFaceNormals[arc.NIndex[0]].Cross( mFaceNormals[arc.NIndex[1]]); arc.PosVertex = i; arc.NegVertex = i; arcs.insert(arc); } int iMid = (i0 + i1 + 1)/2; if (iMid != i1) { queue.push(std::make_pair(i0, iMid)); queue.push(std::make_pair(iMid, i1)); } } } } }
int main(){ // read input scanf("%d",&N); for(int i=0;i<N;++i) scanf("%lld%lld",&P[i].x,&P[i].y); // sort points by x-coordinate std::sort(P,P+N); for(int i=0,j=0;i<N;++i){ while(j<i&&P[i].x-P[j].x>ans) // these points should not be considered // so remove them from the active set bbst.erase(bbst.lower_bound(P[j++])); for(auto x=bbst.lower_bound(pnt(P[i].x-ans,P[i].y-ans));x!=bbst.end()&&x->y<=P[i].y+ans;++x) // this algorithm looks like it should take O(N^2), but the number of iterations is actually constant ans=std::min(ans,dist(P[i],*x)); // insert into the active set bbst.insert(P[i]); } printf("%lld\n",ans); }
virtual int preserve(int sid) { #ifdef DEBUG std::clog << "preserve" << std::endl; #endif if (preserveCnt >= MAX_RUN) return -1; pthread_mutex_lock(&cntLock); preserveCnt++; pthread_mutex_unlock(&cntLock); int exitCode; pid_t child = fork(); if (!child) { if (webServer=="127.0.0.1" || webServer=="localhost") exit(0); std::ostringstream s; s << "mkdir -p " << sourcePath << '/' << sid/10000; system(s.str().c_str()); s.str(""); s << "rsync -e 'ssh -c arcfour' -rz -W --del " << webServer << ":" << sourcePath << '/' << sid/10000 << '/' << sid%10000 << ' ' << sourcePath << '/' << sid/10000; int exitCode=system(s.str().c_str()); if (!WIFEXITED(exitCode)) syslog(LOG_ERR, "failed to run rsync"); exit(WEXITSTATUS(exitCode)); } waitpid(child,&exitCode,0); if (!WIFEXITED(exitCode)||WEXITSTATUS(exitCode)) { pthread_mutex_lock(&cntLock); preserveCnt--; pthread_mutex_unlock(&cntLock); return -1; } int ret; pthread_mutex_lock(&cntLock); ret = rand(); boardingPass.insert(ret); pthread_mutex_unlock(&cntLock); return ret; }
void ExtremalQuery3BSP<Real>::CreateSphericalArcs (BasicMesh& mesh, std::multiset<SphericalArc>& arcs) { int numEdges = mesh.GetNumEdges(); const BasicMesh::Edge* edges = mesh.GetEdges(); const BasicMesh::Triangle* triangles = mesh.GetTriangles(); const int prev[3] = { 2, 0, 1 }; const int next[3] = { 1, 2, 0 }; for (int i = 0; i < numEdges; ++i) { const BasicMesh::Edge& edge = edges[i]; SphericalArc arc; arc.NIndex[0] = edge.T[0]; arc.NIndex[1] = edge.T[1]; arc.Separation = 1; arc.Normal = mFaceNormals[arc.NIndex[0]].Cross( mFaceNormals[arc.NIndex[1]]); const BasicMesh::Triangle& adj = triangles[edge.T[0]]; int j; for (j = 0; j < 3; ++j) { if (adj.V[j] != edge.V[0] && adj.V[j] != edge.V[1]) { arc.PosVertex = adj.V[prev[j]]; arc.NegVertex = adj.V[next[j]]; break; } } assertion(j < 3, "Unexpected condition\n"); arcs.insert(arc); } CreateSphericalBisectors(mesh, arcs); }
void ExpMapGenerator::UpdateNeighbours( ExpMapParticle * pParticle, std::multiset< ParticleQueueWrapper > & pq ) { // iterate through neighbours, updating particle distances and pushing onto pq ExpMapParticle::ListEntry * pCur = GetNeighbourList( pParticle ); if ( pCur == NULL ) lgBreakToDebugger(); while ( pCur != NULL ) { ExpMapParticle * pCurParticle = pCur->pParticle; pCur = pCur->pNext; // skip inactive particles if ( pCurParticle->State() == ExpMapParticle::Frozen ) continue; // set active state pCurParticle->State() = ExpMapParticle::Active; // compute new distance float fDistToPoint = (pParticle->Position() - pCurParticle->Position()).Length(); float fSurfDist = fDistToPoint + pParticle->SurfaceDistance(); // update particle distance and/or nearest particle bool bUpdated = false; if ( fSurfDist < pCurParticle->SurfaceDistance() ) { pCurParticle->SetNearestParticle( pParticle ); pCurParticle->SurfaceDistance() = fSurfDist; bUpdated = true; } if ( pCurParticle->SurfaceDistance() < std::numeric_limits<float>::max() && pCurParticle->NearestParticle() == NULL ) lgBreakToDebugger(); // re-insert particle into priority queue pq.insert( ParticleQueueWrapper(pCurParticle) ); } }
void Decompiler::decompileRange(Byte *start, Byte *end) { // First, scan for IFFUPJMP, which is used for repeat/until, so // we can recognize the start of such loops. We only keep the // last value to match each address, which represents the outermost // repeat/until loop starting at that point. std::map<Byte *, Byte *> rev_iffupjmp_map; for (Byte *scan = start; end == NULL || scan < end; scan += get_instr_len(*scan)) { if (*scan == IFFUPJMP) rev_iffupjmp_map[scan + 2 - scan[1]] = scan; else if (*scan == IFFUPJMPW) rev_iffupjmp_map[scan + 3 - (scan[1] | (scan[2] << 8))] = scan; else if (*scan == ENDCODE) break; } while (end == NULL || start < end) { int locs_here = local_var_defs->count(start); if (locs_here > 0) { // There were local variable slots just pushed onto the stack // Print them out (in the second pass) // First, if there are multiple defined, it must be from // local x, y, z = f() or local a, b. So just ignore the extra // entries. for (int i = 1; i < locs_here; i++) { delete stk->top(); stk->pop(); } Expression *def = stk->top(); stk->pop(); // Print the local variable names, and at the same time push // fake values onto the stack *os << indent_str << "local "; for (int i = 0; i < locs_here; i++) { std::string locname = localname(tf, tf->code[1] + stk->size()); *os << locname; if (i + 1 < locs_here) *os << ", "; stk->push(new VarExpr(start, "<" + locname + " stack slot>")); } // Print the definition, unless it's nil VarExpr *v = dynamic_cast<VarExpr *>(def); if (v == NULL || v->name != "nil") *os << " = " << *def; *os << std::endl; delete def; local_var_defs->erase(start); } if (rev_iffupjmp_map.find(start) != rev_iffupjmp_map.end()) { // aha, do a repeat/until loop *os << indent_str << "repeat\n"; Decompiler indented_dc = *this; indented_dc.indent_str += std::string(4, ' '); indented_dc.break_pos = rev_iffupjmp_map[start]; indented_dc.break_pos += get_instr_len(*indented_dc.break_pos); indented_dc.decompileRange(start, rev_iffupjmp_map[start]); Expression *e = stk->top(); stk->pop(); *os << indent_str << "until " << *e << std::endl; delete e; start = indented_dc.break_pos; continue; } Byte opc = *start++; int aux; switch (opc) { case ENDCODE: return; case PUSHNIL: aux = *start++; goto pushnil; case PUSHNIL0: aux = 0; pushnil: for (int i = 0; i <= aux; i++) stk->push(new VarExpr(start, "nil")); // Cheat a little :) break; case PUSHNUMBER: aux = *start++; goto pushnumber; case PUSHNUMBER0: case PUSHNUMBER1: case PUSHNUMBER2: aux = opc - PUSHNUMBER0; goto pushnumber; case PUSHNUMBERW: aux = start[0] | (start[1] << 8); start += 2; pushnumber: stk->push(new NumberExpr(start, aux)); break; case PUSHCONSTANT: aux = *start++; goto pushconst; case PUSHCONSTANT0: case PUSHCONSTANT1: case PUSHCONSTANT2: case PUSHCONSTANT3: case PUSHCONSTANT4: case PUSHCONSTANT5: case PUSHCONSTANT6: case PUSHCONSTANT7: aux = opc - PUSHCONSTANT0; goto pushconst; case PUSHCONSTANTW: aux = start[0] | (start[1] << 8); start += 2; pushconst: switch (ttype(tf->consts + aux)) { case LUA_T_STRING: stk->push(new StringExpr(start, tsvalue(tf->consts + aux))); break; case LUA_T_NUMBER: stk->push(new NumberExpr(start, nvalue(tf->consts + aux))); break; case LUA_T_PROTO: stk->push(new FuncExpr(start, tfvalue(tf->consts + aux), indent_str)); break; default: *os << indent_str << "error: invalid constant type " << int(ttype(tf->consts + aux)) << std::endl; } break; case PUSHUPVALUE: aux = *start++; goto pushupvalue; case PUSHUPVALUE0: case PUSHUPVALUE1: aux = opc - PUSHUPVALUE0; pushupvalue: { if (aux >= num_upvals) { *os << indent_str << "error: invalid upvalue #" << aux << std::endl; } std::ostringstream s; s << "%" << *upvals[aux]; stk->push(new VarExpr(start, s.str())); } break; case PUSHLOCAL: aux = *start++; goto pushlocal; case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: case PUSHLOCAL6: case PUSHLOCAL7: aux = opc - PUSHLOCAL0; pushlocal: stk->push(new VarExpr(start, localname(tf, aux))); break; case GETGLOBAL: aux = *start++; goto getglobal; case GETGLOBAL0: case GETGLOBAL1: case GETGLOBAL2: case GETGLOBAL3: case GETGLOBAL4: case GETGLOBAL5: case GETGLOBAL6: case GETGLOBAL7: aux = opc - GETGLOBAL0; goto getglobal; case GETGLOBALW: aux = start[0] | (start[1] << 8); start += 2; getglobal: stk->push(new VarExpr(start, svalue(tf->consts + aux))); break; case GETTABLE: { Expression *index = stk->top(); stk->pop(); Expression *table = stk->top(); stk->pop(); stk->push(new BracketsIndexExpr(start, table, index)); } break; case GETDOTTED: aux = *start++; goto getdotted; case GETDOTTED0: case GETDOTTED1: case GETDOTTED2: case GETDOTTED3: case GETDOTTED4: case GETDOTTED5: case GETDOTTED6: case GETDOTTED7: aux = opc - GETDOTTED0; goto getdotted; case GETDOTTEDW: aux = start[0] | (start[1] << 8); start += 2; getdotted: { Expression *tbl = stk->top(); stk->pop(); stk->push(new DotIndexExpr(start, tbl, new StringExpr (start, tsvalue(tf->consts + aux)))); } break; case PUSHSELF: aux = *start++; goto pushself; case PUSHSELF0: case PUSHSELF1: case PUSHSELF2: case PUSHSELF3: case PUSHSELF4: case PUSHSELF5: case PUSHSELF6: case PUSHSELF7: aux = opc - PUSHSELF0; goto pushself; case PUSHSELFW: aux = start[0] | (start[1] << 8); start += 2; pushself: { Expression *tbl = stk->top(); stk->pop(); stk->push(new SelfExpr(start, tbl, new StringExpr (start, tsvalue(tf->consts + aux)))); stk->push(new VarExpr(start, "<self>")); // Fake value, FuncCallExpr will handle it } break; case CREATEARRAY: start++; goto createarray; case CREATEARRAY0: case CREATEARRAY1: goto createarray; case CREATEARRAYW: start += 2; createarray: stk->push(new ArrayExpr(start)); break; case SETLOCAL: case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: case SETLOCAL6: case SETLOCAL7: case SETGLOBAL: case SETGLOBAL0: case SETGLOBAL1: case SETGLOBAL2: case SETGLOBAL3: case SETGLOBAL4: case SETGLOBAL5: case SETGLOBAL6: case SETGLOBAL7: case SETGLOBALW: case SETTABLE0: case SETTABLE: start--; do_multi_assign(start); break; case SETLIST: start++; // assume offset is correct goto setlist; case SETLISTW: start += 2; case SETLIST0: setlist: aux = *start++; { ArrayExpr::mapping_list new_mappings; for (int i = 0; i < aux; i++) { Expression *val = stk->top(); stk->pop(); new_mappings.push_front(std::make_pair((Expression *) NULL, val)); } ArrayExpr *a = dynamic_cast<ArrayExpr *>(stk->top()); if (a == NULL) { *os << indent_str << "error: attempt to setlist a non-array object\n"; } // Append the new list a->mappings.splice(a->mappings.end(), new_mappings); a->pos = start; } break; case SETMAP: aux = *start++; goto setmap; case SETMAP0: aux = 0; setmap: { ArrayExpr::mapping_list new_mappings; for (int i = 0; i <= aux; i++) { Expression *val = stk->top(); stk->pop(); Expression *key = stk->top(); stk->pop(); new_mappings.push_front(std::make_pair(key, val)); } ArrayExpr *a = dynamic_cast<ArrayExpr *>(stk->top()); if (a == NULL) { *os << indent_str << "error: attempt to setmap a non-array object\n"; } // Append the new list a->mappings.splice(a->mappings.end(), new_mappings); a->pos = start; } break; case EQOP: do_binary_op(start, 1, false, " == "); break; case NEQOP: do_binary_op(start, 1, false, " ~= "); break; case LTOP: do_binary_op(start, 1, false, " < "); break; case LEOP: do_binary_op(start, 1, false, " <= "); break; case GTOP: do_binary_op(start, 1, false, " > "); break; case GEOP: do_binary_op(start, 1, false, " >= "); break; case ADDOP: do_binary_op(start, 3, false, " + "); break; case SUBOP: do_binary_op(start, 3, false, " - "); break; case MULTOP: do_binary_op(start, 4, false, " * "); break; case DIVOP: do_binary_op(start, 4, false, " / "); break; case POWOP: do_binary_op(start, 6, true, " ^ "); break; case CONCOP: do_binary_op(start, 2, false, " .. "); break; case MINUSOP: do_unary_op(start, 5, "-"); break; case NOTOP: do_unary_op(start, 5, "not "); break; case ONTJMP: aux = *start++; goto ontjmp; case ONTJMPW: aux = start[0] | (start[1] << 8); start += 2; ontjmp: // push_expr_1 ontjmp(label) push_expr_2 label: -> expr_1 || expr_2 decompileRange(start, start + aux); do_binary_op(start + aux, 0, false, " or "); start = start + aux; break; case ONFJMP: aux = *start++; goto onfjmp; case ONFJMPW: aux = start[0] | (start[1] << 8); start += 2; onfjmp: // push_expr_1 onfjmp(label) push_expr_2 label: -> expr_2 && expr_2 decompileRange(start, start + aux); do_binary_op(start + aux, 0, false, " and "); start = start + aux; break; case JMP: aux = *start++; goto jmp; case JMPW: aux = start[0] | (start[1] << 8); start += 2; jmp: { Byte *dest = start + aux; if (dest == break_pos) { *os << indent_str << "break\n"; break; } // otherwise, must be the start of a while statement Byte *while_cond_end; for (while_cond_end = dest; end == NULL || while_cond_end < end; while_cond_end += get_instr_len(*while_cond_end)) if (*while_cond_end == IFTUPJMP || *while_cond_end == IFTUPJMPW) break; if (end != NULL && while_cond_end >= end) { *os << indent_str << "error: JMP not in break, while, if/else\n"; } // push the while condition onto the stack decompileRange(dest, while_cond_end); *os << indent_str << "while " << *stk->top() << " do\n"; delete stk->top(); stk->pop(); // decompile the while body Decompiler indented_dc = *this; indented_dc.indent_str += std::string(4, ' '); indented_dc.break_pos = while_cond_end + get_instr_len(*while_cond_end); indented_dc.decompileRange(start, dest); *os << indent_str << "end\n"; start = indented_dc.break_pos; } break; case IFFJMP: aux = *start++; goto iffjmp; case IFFJMPW: aux = start[0] | (start[1] << 8); start += 2; iffjmp: { // Output an if/end, if/else/end, if/elseif/else/end, ... statement Byte *if_part_end = start + aux; Decompiler indented_dc = *this; indented_dc.indent_str += std::string(4, ' '); *os << indent_str << "if " << *stk->top(); delete stk->top(); stk->pop(); *os << " then\n"; bool has_else; Byte *else_part_end; get_else_part(start, if_part_end, has_else, else_part_end); // Output the if part output_if: indented_dc.decompileRange(start, if_part_end); start = start + aux; if (has_else) { // Check whether the entire else part is a single // if or if/else statement Byte *instr_scan = start; while (is_expr_opc(*instr_scan) && (end == NULL || instr_scan < else_part_end)) instr_scan += get_instr_len(*instr_scan); if ((end == NULL || instr_scan < else_part_end) && (*instr_scan == IFFJMP || *instr_scan == IFFJMPW)) { // OK, first line will be if, check if it will go all // the way through Byte *new_start, *new_if_part_end, *new_else_part_end; bool new_has_else; if (*instr_scan == IFFJMP) { aux = instr_scan[1]; new_start = instr_scan + 2; } else { aux = instr_scan[1] | (instr_scan[2] << 8); new_start = instr_scan + 3; } new_if_part_end = new_start + aux; get_else_part(new_start, new_if_part_end, new_has_else, new_else_part_end); if (new_if_part_end == else_part_end || (new_has_else && new_else_part_end == else_part_end)) { // Yes, output an elseif decompileRange(start, instr_scan); // push condition *os << indent_str << "elseif " << *stk->top() << " then\n"; delete stk->top(); stk->pop(); start = new_start; if_part_end = new_if_part_end; has_else = new_has_else; else_part_end = new_else_part_end; goto output_if; } } *os << indent_str << "else\n"; indented_dc.decompileRange(start, else_part_end); start = else_part_end; } *os << indent_str << "end\n"; } break; case CLOSURE: aux = *start++; goto closure; case CLOSURE0: case CLOSURE1: aux = opc - CLOSURE0; closure: { FuncExpr *f = dynamic_cast<FuncExpr *>(stk->top()); if (f == NULL) { *os << indent_str << "error: closure requires a function\n"; } stk->pop(); f->num_upvals = aux; f->upvals = new Expression*[aux]; for (int i = aux - 1; i >= 0; i--) { f->upvals[i] = stk->top(); stk->pop(); } stk->push(f); } break; case CALLFUNC: aux = *start++; goto callfunc; case CALLFUNC0: case CALLFUNC1: aux = opc - CALLFUNC0; callfunc: { int num_args = *start++; FuncCallExpr *e = new FuncCallExpr(start); e->num_args = num_args; e->args = new Expression*[num_args]; for (int i = num_args - 1; i >= 0; i--) { e->args[i] = stk->top(); stk->pop(); } e->func = stk->top(); stk->pop(); if (aux == 0) { *os << indent_str << *e << std::endl; delete e; } else if (aux == 1 || aux == 255) // 255 for return f() stk->push(e); else { stk->push(e); for (int i = 1; i < aux; i++) stk->push(new VarExpr(start, "<extra result>")); } } break; case RETCODE: { int num_rets = stk->size() + tf->code[1] - *start++; ExprStack rets; for (int i = 0; i < num_rets; i++) { rets.push(stk->top()); stk->pop(); } *os << indent_str << "return"; for (int i = 0; i < num_rets; i++) { *os << " " << *rets.top(); delete rets.top(); rets.pop(); if (i + 1 < num_rets) *os << ","; } *os << std::endl; } break; case SETLINE: aux = *start++; goto setline; case SETLINEW: aux = start[0] | (start[1] << 8); start += 2; setline: break; // ignore line info case POP: aux = *start++; goto pop; case POP0: case POP1: aux = opc - POP0; pop: for (int i = 0; i <= aux; i++) { local_var_defs->insert(stk->top()->pos); delete stk->top(); stk->pop(); } break; //Nop default: break; } } }
void record_sim(int i) { std::deque<str_and_Bond>::iterator iter; double temp_x; double temp_y; double temp_r_sq; for(iter=growth.begin(); iter!=growth.end(); iter++) { temp_x = iter->second.second.first; temp_y = iter->second.second.second; temp_r_sq = temp_x*temp_x+temp_y*temp_y; r_squared_array.insert(temp_r_sq); } long int count = 0; std::multiset<long long int>::iterator iter2 = r_squared_array.begin(); for(int j=0; j<num_r_values; j++) { while(count<growth.size() && *iter2 < r[j]*r[j]) { count++; iter2++; } M_array[i][j] = count; } for(iter=removed.begin(); iter!=removed.end(); iter++) { temp_x = iter->second.second.first; temp_y = iter->second.second.second; temp_r_sq = temp_x*temp_x+temp_y*temp_y; r_squared_array.insert(temp_r_sq); } count = 0; iter2 = r_squared_array.begin(); for(int j=0; j<num_r_values; j++) { while(count<growth.size() + removed.size() && *iter2 < r[j]*r[j]) { count++; iter2++; } Both_array[i][j] = count; } r_squared_array.clear(); for(iter=removed.begin(); iter!=removed.end(); iter++) { temp_x = iter->second.second.first; temp_y = iter->second.second.second; temp_r_sq = temp_x*temp_x+temp_y*temp_y; r_squared_array.insert(temp_r_sq); } count = 0; iter2 = r_squared_array.begin(); for(int j=0; j<num_r_values; j++) { while(count<removed.size() && *iter2 < r[j]*r[j]) { count++; iter2++; } Removed_array[i][j] = count; } std::map<Site, int>::iterator iter3; for(iter3 = chem_level_list.begin(); iter3 != chem_level_list.end(); iter3++) { if(iter3->second < chem_level_cutoff) { chem_level_array[i][iter3->second]++; } } std::deque<boost::tuple<int, int, long int> >::iterator burst_iter = burst_list.begin(); std::deque<boost::tuple<int, int, long int> >::iterator burst_list_end = burst_list.end(); int burst_x; int burst_y; long int burst_size; while(burst_iter != burst_list_end) { burst_x = burst_iter->get<0>(); burst_y = burst_iter->get<1>(); burst_size = burst_iter->get<2>(); burst_array.push_back(boost::make_tuple(i, burst_x, burst_y, burst_size)); burst_iter++; } }
inline void converter<point_t>::knot_insertion(point_container_t& P, std::multiset<value_type>& knots, std::size_t order, value_type t) const { typedef typename point_t::value_type value_type; // copy knotvector for subscript [] access std::vector<value_type> kv_cpy(knots.begin(), knots.end()); // get parameter std::size_t p = order - 1; // degree std::size_t s = knots.count(t); // multiplicity std::size_t r = std::max(std::size_t(0), p - s); // number of insertions // get knotspan std::size_t k = std::distance(knots.begin(), knots.upper_bound(t)); std::size_t np = P.size(); // number of control points // start computation std::size_t nq = np + r; // helper arrays std::vector<point_t> Qw(nq); std::vector<point_t> Rw(p - s + 1); // copy unaffected points and transform into homogenous coords for (size_t i = 0; i <= k - p; ++i) { Qw[i] = P[i].as_homogenous(); } for (size_t i = k - s - 1; i <= np - 1; ++i) { Qw[i + r] = P[i].as_homogenous(); } // helper points for (size_t i = 0; i <= p - s; ++i) { Rw[i] = P[k - p + i - 1].as_homogenous(); } // do knot insertion itself std::size_t L = 0; for (std::size_t j = 1; j <= r; ++j) { L = k - p + j; for (std::size_t i = 0; i <= p - j - s; ++i) { value_type alpha = (t - kv_cpy[L + i - 1]) / (kv_cpy[i + k] - kv_cpy[L + i - 1]); Rw[i] = alpha * Rw[i + 1] + value_type(1.0 - alpha) * Rw[i]; } Qw[L - 1] = Rw[0]; Qw[k + r - j - s - 1] = Rw[p - j - s]; } // insert knots for (std::size_t i = 0; i < r; ++i) { knots.insert(t); } // copy new control points P.clear(); // transform back to euclidian space for (typename std::vector<point_t>::iterator i = Qw.begin(); i != Qw.end(); ++i) { P.push_back((*i).as_euclidian()); } }