public Event(int _id, float _duration, float _area, Enums.HerdState _type) { id = _id; duration = _duration; area = _area; type = _type; }
public void Reset() { string dir = "DataAnalysis\\" + GM.sheepBehaviour + "\\Event\\"; if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } // name fileName = dir + GM.iterationCount + "_" + GM.nOfSheep + ".csv"; using (StreamWriter sw = File.CreateText(fileName)) { sw.WriteLine("id,duration,area,event"); } // init first state and event state = Enums.HerdState.Packing; dispersingEvent = new Event(0, -float.MaxValue, .0f, Enums.HerdState.Dispersing); packingEvent = new Event(0, Time.time, .0f, Enums.HerdState.Packing); }
void Update() { // get state state = CalculateState(); // track dispersing event if (state == Enums.HerdState.Dispersing) { if (dispersingEvent.area != .0f) { // area and timestamp when packing ended packingEvent.area = ConvexHull.GetArea(GM.sheepList); float requiredChange = dispersingEvent.area * areaThreshold; float areaChange = dispersingEvent.area - packingEvent.area; // check if packing was strong enough float dispersingDuration = packingEvent.duration - dispersingEvent.duration; // valid packing event if (areaChange > requiredChange && dispersingDuration > dispersingTimeThreshold) { // set timers dispersingEvent.duration = dispersingDuration; packingEvent.duration = Time.time - packingEvent.duration; // save previous dispersing and current packing if (dispersingEvent.id != 0 && dispersingEvent.id <= 50) { using (StreamWriter sw = File.AppendText(fileName)) { dispersingEvent.duration *= GM.speedup; packingEvent.duration *= GM.speedup; sw.WriteLine(dispersingEvent.ToString()); sw.WriteLine(packingEvent.ToString()); } } if (dispersingEvent.id >= eventsLimit) { GM.Reset(); if (GM.iterationCount > GM.iterations) { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } else { Reset(); } } else { dispersingEvent = new Event(packingEvent.id + 1, Time.time, .0f, Enums.HerdState.Dispersing); packingEvent = new Event(dispersingEvent.id + 1, .0f, .0f, Enums.HerdState.Packing); } } // false event else { dispersingEvent.area = .0f; } } } // track packing event else { // area and timestamp when packing triggered if (dispersingEvent.area == .0f) { packingEvent.duration = Time.time; dispersingEvent.area = ConvexHull.GetArea(GM.sheepList); } } }