【问题标题】:Reference numbers, and using them to compare numbers in text file参考编号,并使用它们来比较文本文件中的数字
【发布时间】:2019-10-31 14:45:05
【问题描述】:

该项目基于眼动仪。让我简要介绍一下项目背后的想法,以更好地理解我的问题。

我有 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,那么现在这个数字是下一个参考点,做同样的事情并用下面的数字减去,检查结果值是否在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 内的结果值并且有一个新的参考号 if 它在± 100 范围之外。然后将这些参考编号存储在 一个新的文本文件。

如果有代码示例,我将创建一个新程序并存储在其中并首先对其进行测试。

【问题讨论】:

  • 给出一个使用set a reference number and subtracts itself with the next number and check if the resultant value within 100的示例场景
  • 那是我提到的我不知道该怎么做
  • 你可以这样尝试 - 使用 StreamReader.ReadLine() 循环从文件中获取数字并修剪并解析它们以执行操作。
  • 怎么做trim和parse来执行操作,我是新手。
  • 如果该文件将包含跟踪数据,您可以随时间盯着不同的点,您可能需要一些统计工具,如 K-means 聚类分析。如果每个文件只有 1 个参考点,那么简单的平均工作不是很好吗?可能再次使用一些统计方法,例如去除异常值等。

标签: c#


【解决方案1】:

假设初始数据存在于一个列表中,获取所有参考点的逻辑如下:

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 包含参考点列表。

编辑:将浮点数从文本文件读取到列表

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);
}

【讨论】:

  • 感谢您的帮助,但我不想列出代码中的所有数字,因为实际上有超过 100 个数字。相反,我想从文本文件中读取这些数字并进行操作。
  • @user11612402 添加了将文本文件条目转换为List&lt;float&gt; 的代码,然后将参考点写入新文件。请查看编辑。
  • 好吧,我会尽力回复你
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
相关资源
最近更新 更多