Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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 - Fatal编程技术网

C# 球对球碰撞-对象粘在一起

C# 球对球碰撞-对象粘在一起,c#,wpf,C#,Wpf,我在c#中遇到了麻烦,我正在尝试制作一个碰撞模拟器,用户在其中键入质量、速度和方向的值,但是当它们碰撞时,它们彼此粘着,不会反弹。我认为这是因为程序认为物体的动量为零 您正在构造函数中设置动量向量: momentum.x = velocity.x * mass; momentum.y = velocity.y * mass; 我怀疑这是你唯一设置的地方?随着速度的变化,需要重新设置动量向量 这将是一种非常糟糕的做法,因为编码人员有责任在他更改另一个时记住更改其中一个。由于动量是一种依赖于速度的

我在c#中遇到了麻烦,我正在尝试制作一个碰撞模拟器,用户在其中键入质量、速度和方向的值,但是当它们碰撞时,它们彼此粘着,不会反弹。我认为这是因为程序认为物体的动量为零

您正在构造函数中设置动量向量:

momentum.x = velocity.x * mass;
momentum.y = velocity.y * mass;
我怀疑这是你唯一设置的地方?随着速度的变化,需要重新设置动量向量

这将是一种非常糟糕的做法,因为编码人员有责任在他更改另一个时记住更改其中一个。由于动量是一种依赖于速度的计算,因此最好使用“Getter”,如下所示:

public Vector GetMomentum()
{
    return new Vector(Velocity.x*mass, Velocity.y*mass);
}
或者,如果希望将其用作属性,请使用c#中内置的getter和setter:


你可以像以前使用动量,X一样使用它,每次它都会生成一个新的向量。这可能不太好,但它符合您已有的代码。最好使用GetXMomentum()和GetYMomentum()进行计算。

您正在构造函数中设置动量向量:

momentum.x = velocity.x * mass;
momentum.y = velocity.y * mass;
我怀疑这是你唯一设置的地方?随着速度的变化,需要重新设置动量向量

这将是一种非常糟糕的做法,因为编码人员有责任在他更改另一个时记住更改其中一个。由于动量是一种依赖于速度的计算,因此最好使用“Getter”,如下所示:

public Vector GetMomentum()
{
    return new Vector(Velocity.x*mass, Velocity.y*mass);
}
或者,如果希望将其用作属性,请使用c#中内置的getter和setter:


你可以像以前使用动量,X一样使用它,每次它都会生成一个新的向量。这可能不太好,但它符合您已有的代码。最好使用GetXMomentum()和GetYMomentum()进行计算。

尽管您应该从学习如何调试小程序开始——请参见原始问题的注释——但您的问题不仅仅是不知道错误在哪里。这里的问题是这个类的设计很糟糕,设计缺陷使得它非常容易出现bug

具体来说,设计缺陷是类的大量状态是冗余的。您遇到的错误是数据不一致,这是冗余数据的典型问题。当数据冗余时,对其中一个数据的任何更新都会使其与其余数据不一致。然后,您必须编写代码来修复不一致性,而该代码很容易出错

要消除冗余,请找出系统中最基本的部分,然后只跟踪这些属性。按需计算其余部分,而不是存储它们

在你的例子中,你有速度,速度,方向,质量,动量和位置。对于如何表示它们,您的看法不一致:位置是一个矢量,但表示为单独的坐标,速度和动量表示为矢量。动量对于质量和速度来说是多余的。速度和方向与速度无关。所以任何时候你改变速度,你必须改变速度,方向和动量;如果不这样做,系统就会不一致,从而出现问题

别那么做。创建质量、速度和位置的读写属性。为速度、方向和动量设置只读属性。只读属性根据基本原理计算其值

或者,如果你愿意的话,把质量、速度、方向和位置作为基础,然后从中计算速度和动量。无论什么没关系。重要的是,您没有存储可能变得不一致的信息


类似地,如果将力和加速度作为特性添加到此系统,请从另一个计算其中一个。将力添加为向量属性,然后根据力和质量计算加速度。

尽管您应该从学习如何调试小程序开始——请参见对原始问题的评论——您的问题不仅仅是不知道错误在哪里。这里的问题是这个类的设计很糟糕,设计缺陷使得它非常容易出现bug

具体来说,设计缺陷是类的大量状态是冗余的。您遇到的错误是数据不一致,这是冗余数据的典型问题。当数据冗余时,对其中一个数据的任何更新都会使其与其余数据不一致。然后,您必须编写代码来修复不一致性,而该代码很容易出错

要消除冗余,请找出系统中最基本的部分,然后只跟踪这些属性。按需计算其余部分,而不是存储它们

在你的例子中,你有速度,速度,方向,质量,动量和位置。对于如何表示它们,您的看法不一致:位置是一个矢量,但表示为单独的坐标,速度和动量表示为矢量。动量对于质量和速度来说是多余的。速度和方向与速度无关。所以任何时候你改变速度,你必须改变速度,方向和动量;如果不这样做,系统就会不一致,从而出现问题

别那么做。创建质量、速度和位置的读写属性。为速度、方向和动量设置只读属性。只读属性根据基本原理计算其值

或者,如果你愿意的话,把质量、速度、方向和位置作为基础,然后从中计算速度和动量。无论什么没关系。重要的是,您没有存储可能变得不一致的信息

类似地,如果将力和加速度作为特性添加到此系统,请从另一个计算其中一个。将力添加为矢量特性,然后计算acceler