我想知道这里是否有人知道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等事物的有效方法的任何程序性解释,那将是非常棒的.我的数学背景还可以,但是高级公式和传统的数学符号对我来说很难翻译成代码.
我想这是一个简单的问题,但是我现在的代码得到了一些奇怪的结果,我没有数学背景来完全理解为什么.我的目标很简单,正如标题中所述:我只想找到距离中心点一定距离和角度的点.
我目前的代码:
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的角度的错误.我以为我已经检查得那么好,但显然没有.感谢大家的时间,希望上面的工作代码对其他人有用.
好的,这应该是一个简单的矩阵问题,但我对矩阵的理解有些局限.这是场景:我有一个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++专业知识.我是一名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++端必须非常简单,我只是不知道它的语法.
这篇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设置的东西,以防万一应用程序以非优雅的方式关闭(我不希望在这些情况下永久更改用户的设置) .
有什么想法吗?
在一个充满D3DX Sprite对象的Direct3D应用程序中,我希望能够全局调整亮度和对比度.如果可能的话,对比很重要.
我在这里看到了关于OpenGL的这个问题:在OpenGL中 调整整个场景的亮度/伽玛
但这并没有给我在DirectX环境中需要的东西.我知道这也是我可能用像素着色器做的事情,但这似乎就像用火箭筒射击飞行而我担心向后兼容旧版GPU,这些GPU必须在软件中进行任何着色.看起来这应该是可能的,我记得甚至很多老游戏,比如原版的半条命,在着色器的日子之前就有这样的设置.
编辑:此外,请注意,这不是一个全屏应用程序,所以这将需要是一个只会影响一个Direct3D设备,而不是整个监视器的全局设置.