该项目基于Eye Tracker。让我简要介绍一下项目背后的想法,以便更好地理解我的问题。
我有Tobii C眼动仪的硬件。该眼动仪将能够给出我正在查看的位置的X,Y坐标。但是这个设备非常敏感。当我看着1点时,眼动仪会发送许多不同的坐标数据,但它们在我发现的± 100
范围内。即使您凝视1点,您的眼睛仍会移动,因此会发出许多数据。然后将这么多数据(浮点数)保存在文本文件中。现在,我只需要1个数据(X坐标)即可表示我正在凝视的1点,而不是± 100
范围内的许多数据并将其移至新的文本文件。
我不知道该如何编码。
这些是文本文件中的float
数字。
200
201
198
202
250
278
310
315
360
389
500
568
579
590
当我凝视点1时,数据为200-300
,在± 100
范围内。我想将200
设置为参考点,然后将其与下一个数字相减,然后检查100
内的结果值是否正确,将其删除。参考点应继续对以下数字进行操作,直到达到± 100
范围之外。一旦超出100
范围,则数字为310
,然后此数字为下一个参考点,并执行相同操作,并在下面减去以下数字,并检查结果值是否在{{1 }}。一旦超出100
范围,下一个数字就是100
,现在,这是新的参考点,并执行相同的操作。那是我的目标。简单来说,参考点应移到新文件中。
到目前为止,这是我的代码,该代码获取凝视坐标并将其存储在文本文件中。
500
现在我的问题是如何编写代码以读取文本文件并设置 参考编号,并减去下一个编号并检查 如果结果值在
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Tobii.Interaction; namespace ConsoleApp1 { class Program { private static void programintro() { Console.WriteLine("Press Any Keys To Start"); } public static void Main(string[] args) { programintro(); Console.ReadKey(); double currentX = 0.0; double currentY = 0.0; double timeStampCurrent = 0.0; double diffX = 0.0; double diffY = 0.0; int counter = 0; var host = new Host(); host.EnableConnection(); var gazePointDataStream = host.Streams.CreateGazePointDataStream(); gazePointDataStream.GazePoint((gazePointX, gazePointY, timestamp) => { diffX = gazePointX - currentX; diffY = gazePointY - currentY; currentX = gazePointX; currentY = gazePointY; timeStampCurrent = timestamp; if (diffX > 100 || diffX <= -100 || diffY >= 100 || diffY <= -100) { counter++; using (StreamWriter writer = new StreamWriter("C: \\Users\\Student\\Desktop\\FYP 2019\\ConsoleApp1\\ConsoleApp1\\Data\\TextFile1.txt", true)) { writer.WriteLine("Recorded Data " + counter + "\n=================================================================================================================\nX: {0} Y:{1}\nData collected at {2}", currentX, currentY, timeStampCurrent); writer.WriteLine("================================================================================================================="); } Console.WriteLine("Recorded Data " + counter + "\n=================================================================================================================\nX: {0} Y:{1}\nData collected at {2}", currentX, currentY, timeStampCurrent); Console.WriteLine("================================================================================================================="); } }); //host.DisableConnection(); while (true) { if (counter < 10) { continue; } else { Environment.Exit(0); } }
之内,并且具有新的参考号,如果 超出100
范围。这些参考号然后存储在 一个新的文本文件。
如果有代码示例,我将创建一个新程序并将其存储在其中并首先对其进行测试。
答案 0 :(得分:0)
假设列表中包含初始数据,则获取所有参考点的逻辑如下:
var initialData = new List<float> { 200,201,198,202,250,278,310,315,360,389,500,568,579,590 };
var lstReferencePoints = new List<float>();
var referencePoint = default(float);
foreach(var num in initialData)
{
if(referencePoint == default(float))
{
referencePoint = num;
}
if(Math.Abs(referencePoint - num) > 100)
{
lstReferencePoints.Add(referencePoint);
referencePoint = num;
}
}
lstReferencePoints.Add(referencePoint);
lstReferencePoints
包含referencePoints列表。
编辑:将浮点数从文本文件读取到列表
var pointsArray = File.ReadAllLines(your_file_path);
var initialData = new List<float>(pointsArray.Select(float.Parse));
将lstReferencePoints
存储到新的文本文件中:
using(TextWriter tw = new StreamWriter("newFile_Path"))
{
foreach (var item in lstReferencePoints)
tw.WriteLine(item);
}