小编x40*_*000的帖子

c#中的定点数学?

我想知道这里是否有人知道c#中定点数学的任何好资源?我见过这样的事情(http://2ddev.72dpiarmy.com/viewtopic.php?id=156)和这个(定点数学的最佳方法是什么?),以及关于是否十进制的一些讨论实际上是固定点或实际浮点(更新:响应者已经确认它肯定是浮点数),但是我还没有看到一个可靠的C#库来计算余弦和正弦.

我的需求很简单 - 我需要基本的操作符,加上余弦,正弦,arctan2,PI ...我认为这就是它.也许sqrt.我正在编写一个2D RTS游戏,我已经在很大程度上工作了,但是使用浮点数学(双精度)时的单位运动在多台机器上随着时间的推移(10-30分钟)有很小的不准确性,从而导致了desyncs.目前这只是在32位操作系统和64位操作系统之间,所有32位机器似乎保持同步没有问题,这使我认为这是一个浮点问题.

我从一开始就意识到这是一个可能的问题,所以尽可能地限制了我对非整数位置数学的使用,但是为了在不同的速度下平滑对角线移动,我正在以弧度计算点之间的角度,然后用sin和cos得到运动的x和y分量.这是主要问题.我还对线段交叉点,线圆交叉点,圆矩交点等进行了一些计算,这些计算也可能需要从浮点移动到定点以避免跨机器问题.

如果在Java或VB或其他类似语言中有开源的话,我可能会将代码转换为我的用途.我的主要优先考虑的是准确性,尽管我希望尽可能减少速度损失而不是现在的性能.这整个定点数学对我来说是非常新的,我很惊讶谷歌上的实用信息很少 - 大多数东西似乎是理论或密集的C++头文件.

你可以做的任何事情都指向我正确的方向非常感谢; 如果我可以使这个工作,我计划开源我放在一起的数学函数,以便有其他C#程序员的资源.

更新:我绝对可以使余弦/正弦查找表适用于我的目的,但我认为这不适用于arctan2,因为我需要生成一个包含大约64,000x64,000个条目(yikes)的表.如果您知道有关计算arctan2等事物的有效方法的任何程序性解释,那将是非常棒的.我的数学背景还可以,但是高级公式和传统的数学符号对我来说很难翻译成代码.

c# math fixed-point

49
推荐指数
3
解决办法
3万
查看次数

从C#中的角度计算圆周长上的点?

我想这是一个简单的问题,但是我现在的代码得到了一些奇怪的结果,我没有数学背景来完全理解为什么.我的目标很简单,正如标题中所述:我只想找到距离中心点一定距离和角度的点.

我目前的代码:

Point centerPoint = new Point ( 0, 0 );
Point result      = new Point ( 0, 0 );
double angle      = 0.5; //between 0 and 2 * PI, angle is in radians
int distance      = 1000;

result.Y = centerPoint.Y + (int)Math.Round( distance * Math.Sin( angle ) );
result.X = centerPoint.X + (int)Math.Round( distance * Math.Cos( angle ) );
Run Code Online (Sandbox Code Playgroud)

一般来说,这似乎相当合理,但我在各个点都遇到问题,最明显的是当角度对应于负x轴和y轴的点时.显然我做错了什么 - 想一想是什么?

更新:这是我的错误,这段代码工作正常 - 少数不起作用的异常值实际上是由于如何计算1.5PI的角度的错误.我以为我已经检查得那么好,但显然没有.感谢大家的时间,希望上面的工作代码对其他人有用.

c# math geometry angle

40
推荐指数
2
解决办法
4万
查看次数

如何在C#中一次旋转,缩放和转换矩阵?

好的,这应该是一个简单的矩阵问题,但我对矩阵的理解有些局限.这是场景:我有一个1px乘1px的精灵,我希望按比例缩放x和y(每边不同的数量),然后我想将该精灵旋转一定角度,然后我希望能够精确定位整个事物(从左上角或中心,对我没有任何影响).

到目前为止,我的代码模糊地接近,但是根据我传入的角度,它往往会偏离一些随机数量.

我认为这样做会:

        Point center = new Point( 50, 50 );
        float width = 60;
        float height = 100;
        float angle = 0.5;
        Vector3 axis = new Vector3( center.X, center.Y, 0 );
        axis.Normalize();
        Matrix m = Matrix.Scaling( width, height, 0 ) *
            Matrix.RotationAxis( axis, angle ) *
            Matrix.Translation( center.X, center.Y, 0 );
Run Code Online (Sandbox Code Playgroud)

但它倾向于缩小旋转线的缩小比例,尽管我认为它的定位是正确的.

我也试过这个:

  Matrix m = Matrix.Transformation2D( new Vector2( center.X, center.Y ), 0f,
      new Vector2( width, height ), new Vector2( center.X, center.Y ),
      angle, Vector2.Zero );
Run Code Online (Sandbox Code Playgroud)

线看起来完全正确,具有完全正确的尺寸和形状,但我根本无法正确定位.如果我在上面的调用结束时使用翻译向量,或者如果我使用Sprite.Draw设置位置,则无法正常工作.

这一切都在SlimDX中.我究竟做错了什么?

c# translation matrix slimdx

8
推荐指数
1
解决办法
3万
查看次数

如何设置C++函数以便p/invoke可以使用它?

希望这是一个无脑的简单问题,但它表明我缺乏C++专业知识.我是一名C#程序员,过去我和其他人的C++/C dll一起完成了P/Invoke的大量工作.但是,这次我决定自己编写一个包装器C++ DLL(非托管),然后从C#调用我的包装器dll.

我遇到的问题是我无法定义可以通过p/invoke找到的C++函数.我不知道这是什么语法,但这是我到目前为止所做的:

extern bool __cdecl TestFunc()
{
  return true;
}
Run Code Online (Sandbox Code Playgroud)

最初我只是这个,但它也没有用:

bool TestFunc()
{
  return true;
}
Run Code Online (Sandbox Code Playgroud)

然后在C#方面,我有:

    public const string InterfaceLibrary = @"Plugins\TestDLL.dll";

    [DllImport( InterfaceLibrary, CallingConvention = CallingConvention.Cdecl,
        EntryPoint = "TestFunc" ), SuppressUnmanagedCodeSecurity]
    internal static extern bool TestFunc();
Run Code Online (Sandbox Code Playgroud)

所有东西都编译,但是当我执行这个C#p/invoke调用时,我得到一个System.EntryPointNotFoundException:无法在DLL'Plugins\TestDLL.dll'中找到名为'TestFunc'的入口点.

当然,这在C++端必须非常简单,我只是不知道它的语法.

c# c++ pinvoke dllimport extern

8
推荐指数
2
解决办法
3919
查看次数

在.NET应用程序中禁用辅助功能快捷方式?

这篇msdn文章 - http://msdn.microsoft.com/en-us/library/bb219746(VS.85).aspx#Disabling_Accessibility_Shortcut_Keys - 为C++程序员提供了有关如何暂时禁用可访问性的Windows快捷方式的信息(如按住Shift键8秒钟,或快速连续按下Shift键5次以上.

当然在C#中有一些简单的方法可以做到这一点,但是我找不到任何资源.我在非全屏应用程序中使用DirectInput.

我想做的就是没有烦人的弹出窗口出现; 我更喜欢不需要使用Windows设置的东西,以防万一应用程序以非优雅的方式关闭(我不希望在这些情况下永久更改用户的设置) .

有什么想法吗?

c# windows shortcuts pinvoke accessibility

7
推荐指数
3
解决办法
3205
查看次数

在DirectX中调整场景的亮度/对比度/灰度系数?

在一个充满D3DX Sprite对象的Direct3D应用程序中,我希望能够全局调整亮度和对比度.如果可能的话,对比很重要.

我在这里看到了关于OpenGL的这个问题:在OpenGL中 调整整个场景的亮度/伽玛

但这并没有给我在DirectX环境中需要的东西.我知道这也是我可能用像素着色器做的事情,但这似乎就像用火箭筒射击飞行而我担心向后兼容旧版GPU,这些GPU必须在软件中进行任何着色.看起来这应该是可能的,我记得甚至很多老游戏,比如原版的半条命,在着色器的日子之前就有这样的设置.

编辑:此外,请注意,这不是一个全屏应用程序,所以这将需要是一个只会影响一个Direct3D设备,而不是整个监视器的全局设置.

directx direct3d

1
推荐指数
1
解决办法
5589
查看次数