Mi5000氏の下記ツイートに触発されて遊んでみたのでメモ。
1. エラーを再現してみる
次のCabIlluminance要素を含むマップを作って実行すると、確かに運転台が明るくなった地点でエラーが出た。
50;
CabIlluminance.Interpolate(0.48);
57.5;
CabIlluminance.Interpolate(1);
次にMi5000氏のツイートに従って、57.5; CabIlluminance.Interpolate(0.9);
と変更してみるとエラーが出なくなった。
2. CabIlluminanceの内部値を取り出す
AtsExの力を借りて、距離程30m~100mでのCabIlluminanceの内部値(と言い切っていいのか?)を、距離程0.01m毎に外部ファイルに書き出すマッププラグインを作成した。コードは下記の通り。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Forms;
using BveTypes.ClassWrappers;
using AtsEx.PluginHost;
using AtsEx.PluginHost.Plugins;
namespace cabilluminance_test
{
[PluginType(PluginType.MapPlugin)]
public class Cabilluminance_test : AssemblyPluginBase
{
Route route;
InterpolatableMapObjectList cabIlluminanceObj;
public Cabilluminance_test(PluginBuilder builder) : base(builder)
{
BveHacker.ScenarioCreated += OnScenarioCreated;
}
public override void Dispose()
{
}
private void OnScenarioCreated(ScenarioCreatedEventArgs e)
{
route = e.Scenario.Route;
cabIlluminanceObj = route.CabIlluminanceObjects;
using(StreamWriter sw = new StreamWriter(@"cabillum.csv", false))
{
for(double dist = 30.0; dist <= 100.0; dist+=0.01)
{
sw.WriteLine(String.Format("{0:F},{1:F}", dist, cabIlluminanceObj.GetValueAt(dist)));
}
}
}
public override TickResult Tick(TimeSpan elapsed)
{
return new MapPluginTickResult();
}
}
}
3. 内部値の挙動をプロット
CabIlluminance: 0.48->1, 0.48->0.9の二通りの場合について、マッププラグインの出力データをプロットすると次図を得る。内部値は1.0からマップファイルで指定した値を引いた値になるようだ。
両者に対して、目標値(1 or 0.9)の直前でオーバーシュートが発生しており、特に目標値: 1の場合は一時的に値がマイナスに振れてしまっている。
Mi5000氏の指摘通り、オーバーシュートがこのエラーと関係している可能性は高そうだが、目標値: 0.9の場合にも同じ現象が起きているのは意外だった。