コード例 #1
0
    // 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();
    }