数据的格式选择,和同源数据

本文探讨了游戏系统设计中的Sprite和Game组件交互原理,强调了数据格式选择的重要性,并介绍了同源数据的概念及其应用场景。
数据的格式选择,和同源数据。

如果我们正在设计一个游戏系统,其中两个重要的部分 Sprite & Game,Game 负责整体逻辑,为了刷新每个 Sprite 的状态(位置,速度,加速度),Game 向 Sprite 发送 tick message。

// examples 1

public class Game {
    private long lastTime;
    private List<Sprite> spriteList;
    public void start (); // lost code
    public void run () {
        long currTime = System.currentTime();
    long tick = currTime - lastTime;
    for (Sprite s : spriteList) {
            s.tick(tick);
        }
        lastTime = currTime;
        paint();
    }
    public void paint();
    public void finish (); // lost code
};

public class Sprite {
    public void tick (long t); // lost code
};

Sprite 接受的消息 tick 的参数可以是 current time(当前时间)或者是 difference time(间隔时间)。上面的例子采用了 difference time 的做法,这是一个设计上的选择,无论给出的是哪种参数都可以算出另一种参数,从游戏逻辑方面选择哪个都没有区别,但考虑到大多数的 Sprite 并不与绝对时间相关联,直接传递相对时间可以减少计算(and code)。或者说选择最利于处理的格式。

程序中经常有这种数据表达的问题,或者说同样的 Data 不同的 Representation,在分析阶段我们所关心的仅仅是 Data,而不是其 Representation。当然有时候为了说明问题会在设计中引入一个具体的 Representation,但这仅仅是临时性质的。在设计 Sprite 时我们所关心的仅仅是其“责任”、“接口”,Sprite 接受 tick message,The tick message 以时间为参数(not care about absolute or relative)。

在设计中需要将数据的格式确定下来,这时只要选择最利于处理的格式(而不是最利于产生的格式)。但是在具体实现中可能发现在某些条件下所选择的格式不适合,需要转换,如下中的 IntegerProgressPrint :

// example 2

public interface ProgressMonitor {
    void updateProgress (float f);
};

public class IntegerProgressPrint implements ProgressMonitor {
    void updateProgress (float f) {
        System.out.println((int) (f * MAX_VALUE));
    }
};

void run () {
    int m;
    for (m=0; m<MAX_VALUE; m+=processed()) {
        progress.updateProgress((float) m / MAX_VALUE));
    }
};



引起我们思考的是在某些时候,特别是以浮点数作为消息参数时候,有可能在参数转换过程中出现误差,为了避免这种情况出现,有必要同时传递同一个数据的多种Representation,例如:

// example 3, recode example 2

public interface ProgessMonitor {
    void updateProgess (ProgressParam p);
};

public class ProgressParam {
    public final int curValue;
    public final int maxValue;
    public final float procentage;
};

public class IntegerProgressPrint implements ProgressMonitor {
    void updateProgress (ProgressParam p) {
        System.out.println(p.curValue);
    }
};

public class PercentProgressPrint implements ProgressMonitor {
    void updateProgress (ProgressParam p) {
        System.out.println(p.procentage);
    }
};


我们称之为:同源数据。

结论:
    1. 在设计过程中应该将精力集中在对象的责任上,不需要关心具体的数据表现形式。可使用常用/简单格式临时替代。
    2. 在实现过程中如有必要使用同源数据。
### 持久同源性与拓扑数据分析的介绍 持久同源性是拓扑数据分析(TDA)中的核心工具之一。拓扑数据分析是一种结合拓扑学数据分析的方法,旨在从数据中提取拓扑特征。拓扑特征描述了数据的形状、连通性孔洞等全局性质,这些性质在数据发生连续变形时保持不变。持久同源性通过追踪在不同尺度下数据的拓扑结构变化,量化这些拓扑特征的稳定性持久性。例如,在一个点云数据集中,持久同源性可以检测出不同尺度下的连通分量、孔洞等拓扑结构,并记录它们出现消失的尺度,形成持久图(Persistence Diagram)或条形码图(Barcode Diagram),这些图直观地展示了拓扑特征的持久性信息 [^1]。 ### 持久同源性与拓扑数据分析的应用 - **生物学领域**:在蛋白质结构分析中,拓扑数据分析可以用于研究蛋白质的折叠模式结构变化。通过将蛋白质的原子坐标数据转换为拓扑空间,利用持久同源性提取的拓扑特征可以区分不同的蛋白质结构,帮助理解蛋白质的功能进化关系。 - **计算机视觉领域**:在图像识别任务中,拓扑数据分析可以提取图像的拓扑特征,这些特征可以作为传统特征的补充,提高图像分类识别的准确率。例如,在手写数字识别中,如引用中提到的将持久同源性应用于手写数字的MNIST数据集,通过提取拓扑特征来区分不同的手写数字图像 [^1]。 - **材料科学领域**:在研究材料的微观结构时,拓扑数据分析可以揭示材料内部的孔洞、连通性等拓扑性质,有助于理解材料的物理性能,如导电性、透气性等。 ### 相关知识 - **单纯复形**:是拓扑数据分析中的基本概念,它是由点、线段、三角形及其高维类似物组成的抽象结构。在数据分析中,通常会将数据点云构建成单纯复形,以便应用拓扑学的方法进行分析。 - **过滤(Filtration)**:是持久同源性中的关键概念,它是指一系列嵌套的单纯复形,随着尺度参数的增加,单纯复形逐渐包含更多的元素。通过对过滤中的每个单纯复形计算同源群,可以得到拓扑特征的出现消失信息。 - **同源群**:是拓扑学中的概念,用于描述拓扑空间的连通性孔洞等性质。在持久同源性中,通过计算不同尺度下单纯复形的同源群,来追踪拓扑特征的变化。 以下是一个使用Python的`gudhi`库计算点云数据持久同源性的简单示例代码: ```python import gudhi # 生成一个简单的点云数据 point_cloud = [[0, 0], [1, 0], [0, 1], [1, 1]] # 创建Rips复形 rips_complex = gudhi.RipsComplex(points=point_cloud, max_edge_length=2.0) # 构建单纯复形 simplex_tree = rips_complex.create_simplex_tree(max_dimension=2) # 计算持久同源性 diag = simplex_tree.persistence() # 绘制持久图 gudhi.plot_persistence_diagram(diag) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值