public MotionSequence GenerateSynchronousSingleSequence(int dimention) { var uniform = new ContinuousUniform(0, 1, _randomGenerator); var ValueRangeRatio = (float)uniform.Sample(); var InitialForce = (float)uniform.Sample(); if (_numControlPoints != InitialTimes.Length) { throw new ArgumentException("コントロールポイント数が不一致"); } // 位相にノイズを入れる var offset = Mathf.PI * (uniform.Sample() > 0.5 ? 1 : 0); var sequence = new MotionTarget[InitialTimes.Length]; for (var i = 0; i < InitialTimes.Length; i++) { var values = new float[dimention]; values[0] = InitialForce; for (var d = 1; d < dimention; d++) { // control point value var radian = InitialTimes[i] * 2f * Mathf.PI + offset; values[d] = 0.5f + ValueRangeRatio * Mathf.Sin(radian) / 2f; // [0,1]に正規化; } sequence[i] = new MotionTarget(InitialTimes[i] * _timeRange, values); } return(new MotionSequence(sequence)); }
public void MotionSequenceのシリアライズ() { var a = new MotionTarget(0.0f, new List <float> { 0.0f, 1.0f, 2.0f }); var b = new MotionTarget(1.0f, new List <float> { 0.0f, 2.0f, 4.0f }); var src = new MotionSequence(new List <MotionTarget> { a, b }); var dst = new MotionSequence(MotionGeneratorSerialization.DeepClone(src.Save())); Assert.AreEqual(src.Sequences.Length, dst.Sequences.Length); for (int n = 0; n < src.Sequences.Length; ++n) { var s = src[n]; var d = dst[n]; Assert.AreEqual(s.Time, d.Time); Assert.AreEqual(s.Values.Length, d.Values.Length); for (int m = 0; m < s.Values.Length; ++m) { Assert.AreEqual(s.Values[m], d.Values[m]); } } }
public MotionTarget(MotionTarget origin) { Time = origin.Time; Values = origin.Values.ToArray(); }