// call this to run my forces, then retrieve results & update/add character locomotiontargets to queue public static void recalculate() // finish { recalc = true; //cleanupxys(); if (g.characters != null && ((g.characters.Count + g.humans.Count) > 1)) { Debug.Log("RECALCULATING"); for (int cj = 0; cj < g.characters.Count; cj++) { Debug.Log(g.characters[cj].Data.name + ":" + g.characters[cj].Data.pos.x + "," + g.characters[cj].Data.pos.y); } //printAll(); Debug.Log("READY"); for (int i = 1; i < numiterations; i++) // do 100 iterations? // calculate repulsive forces { if (g.characters != null) // initialize { for (int vchar = 0; vchar < g.characters.Count; vchar++) { if (g.characters[vchar].Data.ismoveable) //} && characters[vchar].onstage) { { g.characters[vchar].Data.upddisp(0, 0); } // characters[vchar].disp.x = 0; // characters[vchar].disp.y = 0; } // calculate repulsive forces //console.log("repulsive"); if (g.EdgeCount > 0) { //console.log("edges not null"); for (int e = 0; e < g.EdgeCount; e++) { //if(i < 2) {console.log("--");} Vector2 delta = vectdiff(g.GetEdge(e).FromVertex.Data.pos, g.GetEdge(e).ToVertex.Data.pos); //[vchar].pos, characters[uchar].pos); if (delta.x == 0 && delta.y == 0) { // do nothing } else { //if(i < 2) {console.log(delta);} Vector2 temp1 = new Vector2( delta.x / vectsize(delta) * fr(vectsize(delta), g.GetEdge(e).GetType(), g.GetEdge(e)), delta.y / vectsize(delta) * fr(vectsize(delta), g.GetEdge(e).GetType(), g.GetEdge(e)) ); //if(i < 2) {console.log(temp1);} if (g.GetEdge(e).ToVertex.Data.ismoveable) //}&& edges[e].point2.onstage) { { g.GetEdge(e).ToVertex.Data.upddisp(vectdiff(g.GetEdge(e).ToVertex.Data.disp, temp1)); } //if(i < 2) {console.log(edges[e].point2);} if (g.GetEdge(e).FromVertex.Data.ismoveable) // && edges[e].point1.onstage) { { g.GetEdge(e).FromVertex.Data.upddisp(vectsum(g.GetEdge(e).FromVertex.Data.disp, temp1)); } //if(i < 2) {console.log(edges[e].point1);} } } } //console.log("attractive"); // calculate attractive forces if (g.EdgeCount > 0) { //console.log("edges not null"); for (int e = 0; e < g.EdgeCount; e++) { //if(i < 2) {console.log("--");} Vector2 delta = vectdiff(g.GetEdge(e).FromVertex.Data.pos, g.GetEdge(e).ToVertex.Data.pos); //if(i < 2) {console.log(delta);} if (delta.x == 0 && delta.y == 0) { // do nothing } else { Vector2 temp2 = new Vector2( delta.x / vectsize(delta) * fa(vectsize(delta), g.GetEdge(e).GetType(), g.GetEdge(e)), delta.y / vectsize(delta) * fa(vectsize(delta), g.GetEdge(e).GetType(), g.GetEdge(e)) ); //if(i < 2) {console.log(temp2);} if (g.GetEdge(e).ToVertex.Data.ismoveable) //&& edges[e].point2.onstage) { { g.GetEdge(e).ToVertex.Data.upddisp(vectsum(g.GetEdge(e).ToVertex.Data.disp, temp2)); } //if(i < 2) {console.log(edges[e].point2);} if (g.GetEdge(e).FromVertex.Data.ismoveable) //&& edges[e].point1.onstage) { { g.GetEdge(e).FromVertex.Data.upddisp(vectdiff(g.GetEdge(e).FromVertex.Data.disp, temp2)); } //if(i < 2) {console.log(edges[e].point1);} } } } // {console.log("====");} // limit max displacement to temperature and prevent placement offstage for (int v = 0; v < g.characters.Count; v++) { Vector2 temp3 = new Vector2( g.characters[v].Data.disp.x / vectsize(g.characters[v].Data.disp), g.characters[v].Data.disp.y / vectsize(g.characters[v].Data.disp) ); //if(i<2) {console.log(temp3);} float temp4 = Mathf.Min(vectsize(g.characters[v].Data.disp), t); //if(i<2) {console.log(temp4);} Vector2 temp5 = vectsum(g.characters[v].Data.pos, new Vector2( temp3.x * temp4, temp3.y * temp4 )); //if(i<2) {console.log(temp5);} if (vectsize(temp5) < (avgdist)) { // do nothing } else //if (characters[v].onstage) { { if (!float.IsNaN(temp5.x) && !float.IsNaN(temp5.y)) { g.characters[v].Data.updpos(Mathf.Min(W, Mathf.Max(0, temp5.x)), Mathf.Min(L, Mathf.Max(0, temp5.y))); } //} else { // do nothing } } t = numiterations - i; for (int cj = 0; cj < g.characters.Count; cj++) { //Debug.Log("FORCES POSITION UPDATED!! "+g.characters[cj].Data.name + ":" + g.characters[cj].Data.pos.x + "," + g.characters[cj].Data.pos.y); } //Debug.Log("FORCES POSITION UPDATED-new CENTER=("+g.center.Data.x+", "+g.center.Data.y+"), pos=("+g.center.Data.pos.x+", "+g.center.Data.pos.y+")"); } } // reset everything to defaults t = numiterations; for (int a = 0; a < g.characters.Count; a++) { g.characters[a].Data.x = g.characters[a].Data.pos.x; g.characters[a].Data.y = g.characters[a].Data.pos.y; if (g.characters[a].Data.ismoveable) //&& characters[a].onstage) { { g.characters[a].Data.upddisp(0, 0); // = { } // x : 0, // y : 0 // }; } posrecalcCenter(); Debug.Log("===================AFTER RECALCULATING==========="); for (int a = 0; a < g.Size; a++) { Debug.Log(g.GetVertex(a).Data.type + ": " + g.GetVertex(a).Data.name + " at (" + g.GetVertex(a).Data.x + "," + g.GetVertex(a).Data.y + ")"); } } /*for (var b = 0; b < edges.length; b++) { * console.log(edges[b].type+" EDGE: "+edges[b].point1.name + "-" + edges[b].point2.name + ", dist=" + getLength(edges[b].point1, edges[b].point2)); * }*/ recalc = false; //reversexys(); }