Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在分离视图时将世界坐标映射到屏幕坐标&;模型_C#_Wpf_Model View Controller - Fatal编程技术网

C# 如何在分离视图时将世界坐标映射到屏幕坐标&;模型

C# 如何在分离视图时将世界坐标映射到屏幕坐标&;模型,c#,wpf,model-view-controller,C#,Wpf,Model View Controller,我正在用WPF编写一个n体模拟,作为C#中的一个练习,我在显示程序结果时遇到了一个基本的设计问题 我有一个实体类,它存储位置、速度、质量等基本信息。然后是PhysicsEngine类,它有一个可观察的实体集合,并完成所有的数学运算。当我必须将实体的位置绑定到一些图形元素以在屏幕上显示它们的移动时,问题就出现了。空间中的距离非常大,所以我显然需要以某种方式处理位置信息,并将其转换为屏幕坐标。作为一种快速攻击,我在Entity类中添加了以下内容: public Vector3屏幕位置 { 得到 {

我正在用WPF编写一个n体模拟,作为C#中的一个练习,我在显示程序结果时遇到了一个基本的设计问题

我有一个实体类,它存储位置、速度、质量等基本信息。然后是PhysicsEngine类,它有一个可观察的实体集合,并完成所有的数学运算。当我必须将实体的位置绑定到一些图形元素以在屏幕上显示它们的移动时,问题就出现了。空间中的距离非常大,所以我显然需要以某种方式处理位置信息,并将其转换为屏幕坐标。作为一种快速攻击,我在Entity类中添加了以下内容:

public Vector3屏幕位置
{
得到
{
返回新矢量3(
(位置X/刻度)-(直径/2),
(位置Y/刻度)-(直径/2),
(位置Z/刻度)-(直径/2)
//其中“比例”是一个任意数,具体取决于模拟的大小
);
}
}
它只是返回位置,并进行一些数学运算,以适应屏幕上的所有内容。当“相机”是静态的时候,它工作的很好,但是现在我想让它可以移动——可能是把相机放在某个行星的中心,或者放大缩小

继续使用这种技术看起来很难看——我必须将相机位置和缩放级别的各种细节暴露给底层实体,而底层实体实际上不应该关心视图,也不应该知道它是如何显示的

我试着做了第二个DisplayEntities的ObservableCollection,它保存了显示每个实体所需的所有数据,在每个模拟中,它会循环遍历实体列表,然后更新DisplayEntities中各自的兄弟,在视图的代码隐藏中,我以编程方式向每个DisplayEntity添加并绑定几何图形,但结果证明这非常缓慢且不切实际-我需要遍历所有实体,检查它们是否已经有DisplayEntity,如果有更新,如果没有,则添加新的DisplayEntity,更不用说删除实体时会发生什么

我还尝试将实体类包装到另一个类中,该类包含显示它所需的所有信息,这消除了两个集合的问题,但似乎出现了与之前相同的抽象问题-EntityVM必须知道相机位置、角度、缩放级别,我必须在每一个刻度上循环并更新它们的值——同样是缓慢且不灵活的

从WinForms中的即时图形来看,这种情况似乎非常令人沮丧——在WinForms中,我可以在代码中创建一个函数,当调用该函数时,它可以在这样或那样的坐标上绘制圆,做任何我想做的数学,因为我不需要考虑绑定。每当我想画任何东西时,我只需要给它传递一个坐标列表,它根本不关心我的实际对象,具有讽刺意味的是,这似乎比我用WPF做的意大利面更好地将视图与模型分开

我如何处理这个设计,以产生一个优雅的和非集群的解决方案

(提前谢谢你,如果我的帖子在某些方面有所欠缺,请告诉我,这是我第一次发帖:)


编辑:为清晰起见,以下是我观点背后代码的重要部分:

public void addenties to canvas()
{
PhysicsEngine=(PhysicsEngine)this.DataContext;
对于(int i=0;i
XML文件只包含一个空画布


编辑2:这是我更新视图的重要部分



编辑3:我尝试使用绑定转换器;但是,转换器还需要访问PhysicsEngine类中的相机信息才能执行计算。我想让转换器成为PhysicsEngine类的一个属性,这样它就可以访问所有私有信息,然后这样做,这显然是行不通的:



绑定转换器是工作的正确工具吗?如果是,我如何将相机信息传递给它?

我最终使用了多重绑定和IMultiValueConverter:



<代码>不能直接绑定到您的原始实体对象,而是使用绑定转换器来执行视图CALCS?作为注释,您应该认真考虑使用ItEsM控件来显示实体。使用画布作为其ItemsPanel,并在项目中声明椭圆及其绑定