private float CalculateEffort(ulong id, Efforts effort) { List <JointType> joints = effortJoints[effort]; Dictionary <JointType, Transform> JointTransforms = BodyJoints[id]; Dictionary <JointType, Vector3> velocity = BodyJoints_Velocity[id]; Dictionary <JointType, Vector3> acceleration = BodyJoints_Acceleration[id]; Dictionary <JointType, Vector3> jerk = BodyJoints_Jerk[id]; //Dictionary<JointType, Vector3> JointPrevPos = BodyJoints_PrevPos[id]; float weight = 0; switch (effort) { case Efforts.Weight: foreach (JointType joint in joints) { weight += velocity[joint].sqrMagnitude; weight /= joints.Count; } break; case Efforts.Space: // TODO: Try a different root joint, try different coroutine intervals // Inner product of root velocity and the normal vector of the trangle formed by the head and both shoulders. faceLeft = JointTransforms[JointType.Head].position - JointTransforms[JointType.ShoulderLeft].position; faceRight = JointTransforms[JointType.Head].position - JointTransforms[JointType.ShoulderRight].position; faceNormal = Vector3.Cross(faceRight, faceLeft); root = velocity[JointType.SpineBase]; weight = Mathf.Abs(Vector3.Dot(faceNormal, root)); break; case Efforts.Time: foreach (JointType joint in joints) { weight += Mathf.Sqrt(acceleration[joint].sqrMagnitude); weight /= joints.Count; } break; case Efforts.Flow: foreach (JointType joint in joints) { weight += Mathf.Sqrt(jerk[joint].sqrMagnitude); weight /= joints.Count; } break; default: break; } return(weight); }
public override string ToString() { var builder = new StringBuilder(); builder.AppendFormat("\nsegment: [{0}]\n", Segment != null ? Segment.ToString() : string.Empty); builder.Append("efforts: ["); if (Efforts != null) { Efforts.Each(effort => builder.AppendFormat("effort: [{0}]", effort)); } builder.Append("]\n"); return(builder.ToString()); }
public RideEffortsV2 ToRideEfforts() { var rideEffort = new RideEffortsV2 { RideId = ConvertWrapper.ToInt32(Id), Version = Version, Efforts = new List <EffortSegmentV2>() }; if (Efforts != null) { Efforts.Each(effort => rideEffort.Efforts.Add(effort.ToEffortSegment())); } return(rideEffort); }
public override string ToString() { var builder = new StringBuilder(); builder.AppendFormat("\nRideId: {0}\n", RideId); builder.Append("EffortSegments: ["); if (Efforts != null) { Efforts.Each((coord, index) => { builder.Append(coord); if (index < (Efforts.Count - 1)) { builder.Append(", "); } }); } builder.Append("]\n"); builder.AppendFormat("Version: {0}\n", Version ?? string.Empty); return(builder.ToString()); }
IEnumerator CalculateFinalEffort(ulong id, List <float> list, float seconds, Efforts effort) { effortCalculationsRunning[effort] = true; yield return(new WaitForSeconds(seconds)); float[] array; effortCalculationsRunning[effort] = false; switch (effort) { case Efforts.Weight: array = list.ToArray(); float max = Mathf.Max(array); list.Clear(); BodyWeightEffort[id] = max; WeightEffort = BodyWeightEffort[id]; break; case Efforts.Space: // TODO: fix me??? array = list.ToArray(); float cumSum = 0; for (int i = 0; i < array.Length; i++) { cumSum += array[i]; } cumSum /= array.Length; list.Clear(); yield return(BodySpaceEffort[id] = cumSum); break; case Efforts.Time: array = list.ToArray(); float cumulativeSum = 0; for (int i = 0; i < array.Length; i++) { cumulativeSum += array[i]; } cumulativeSum /= array.Length; list.Clear(); BodyTimeEffort[id] = cumulativeSum; TimeEffort = BodyTimeEffort[id]; break; case Efforts.Flow: array = list.ToArray(); float sum = 0; for (int i = 0; i < array.Length; i++) { sum += array[i]; } sum /= array.Length; list.Clear(); BodyFlowEffort[id] = sum; FlowEffort = BodyFlowEffort[id]; break; default: break; } }