让电脑实现360度=0度,旋转炮塔

2024-05-28

我正在制作一个游戏,其中有一个计算机控制的炮塔。 炮塔可360度旋转。

它使用 trig 找出枪瞄准所需的角度 (obj deg),并将枪的当前角度存储在 (gun deg)

下面的代码以设定的速度旋转枪

if (objdeg > gundeg)
{
    gundeg++;
}
if (objdeg < gundeg)
{
    gundeg--;
}

问题是,如果10度处有一个物体,枪会旋转,射击并摧毁它,如果320度处出现另一个目标,枪会逆时针旋转310度,而不是顺时针旋转60度来击中它。

我怎样才能修复我的代码,使其不会做出愚蠢的行为?


如果您用“BAMS”(二进制角度测量系统)来表示角度,则可以完全避免除法(和模)。这个想法是,如果将角度存储在 N 位整数中,则可以使用该整数的整个范围来表示角度。这样,就无需担心超过 360 度的溢出,因为表示的自然 modulo-2^N 属性会为您处理它。

例如,假设您使用 8 位。这会将您的圆切割成 256 个可能的方向。 (您可以选择更多位,但就示例而言,8 位比较方便)。 0x00代表0度,0x40代表90度,0x80代表180度,0xC0代表270度。不用担心“符号”位,BAMS 是角度的天然选择。如果您将 0xC0 解释为“无符号”并缩放为每次计数 360/256 度,则您的角度为 (+192)(360/256) = +270;但如果你将 0xC0 解释为“有符号”,那么你的角度是(-64)(360/256)=-90。请注意,-90 和 +270 在角度方面含义相同。

如果您想将三角函数应用于 BAMS 角度,您可以预先计算表格。有一些技巧可以缩小表格,但您可以看到表格并没有那么大。为 8 位 BAMS 存储双精度值的整个正弦和余弦表不需要超过 4K 的内存,这在当今的环境中是鸡饲料。

既然您提到在游戏中使用它,您可能可以使用 8 位或 10 位表示。任何时候添加或减去角度,都可以使用逻辑 AND 运算将结果强制转换为 N 位,例如,angle &= 0x00FF 表示 8 位。

忘记了最好的部分 (edit)

右转与左转问题可以在 BAMS 系统中轻松解决。只需取差值,并确保只保留 N 个有意义的位。将 MSB 解释为符号位指示您应该转向的方向。如果差值为负,则通过差值的abs()向相反方向转。

这个丑陋的小 C 程序演示了。首先尝试输入 20 10 和 20 30 等。然后尝试通过绕零点来欺骗它。给它 20 -10,它就会向左转。给它 20 350,它仍然左转。请注意,由于它是用 8 位完成的,因此 181 与 180 无法区分,因此如果您输入 20 201 并且它向右转而不是向左转,请不要感到惊讶 - 在 8 位提供的分辨率中,左转和右转这个情况是一样的。输入 20 205,它会走得更短。

#include <stdio.h>
#include <math.h>

#define TOBAMS(x)    (((x)/360.0) * 256)
#define TODEGS(b)    (((b)/256.0) * 360)

int main(void)
{
    double a1, a2;     // "real" angles
    int b1, b2, b3;    // BAMS angles


    // get some input
    printf("Start Angle ? ");
    scanf("%lf", &a1);

    printf("Goal Angle ? ");
    scanf("%lf", &a2);

    b1 = TOBAMS(a1);
    b2 = TOBAMS(a2);

    // difference increases with increasing goal angle
    // difference decreases with increasing start angle
    b3 = b2 - b1;
    b3 &= 0xff;

    printf("Start at %7.2lf deg and go to %7.2lf deg\n", a1, a2);
    printf("BAMS   are 0x%02X and 0x%02X\n", b1, b2);
    printf("BAMS diff is 0x%02X\n", b3);

    // check what would be the 'sign bit' of the difference
    // negative (msb set) means turn one way, positive the other
    if( b3 & 0x80 )
    {
        // difference is negative; negate to recover the
        // DISTANCE to move, since the negative-ness just
        // indicates direction.

        // cheap 2's complement on an N-bit value:
        // invert, increment, trim
        b3 ^= -1;       // XOR -1 inverts all the bits
        b3 += 1;        // "add 1 to x" :P
        b3 &= 0xFF;     // retain only N bits

        // difference is already positive, can just use it
        printf("Turn left %lf degrees\n", TODEGS(b3));
        printf("Turn left %d counts\n", b3);
    }
    else
    {
        printf("Turn right %lf degrees\n", TODEGS(b3));
        printf("Turn right %d counts\n", b3);
    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让电脑实现360度=0度,旋转炮塔 的相关文章

  • 滑动窗口最小算法

    这是一个家庭作业问题 设 A 是一个整数数组和整数 K 窗口大小 当窗口滑过 A 时 生成在窗口中看到的最小值的数组 M 我发现一篇文章 http home tiac net cri 2001 slidingmin html有这个问题的解决
  • ASM 中从小端到大端的快速转换

    我在 C 中有一个 uint 类型数组 在检查程序是否在小端机器上运行后 我想将数据转换为大端类型 因为数据量可能会变得非常大 但总是均匀的 所以我想考虑将两个 uint 类型作为 ulong 类型 以获得更好的性能并在 ASM 中对其进行
  • Lamport 的 Paxos 中的矛盾做了简单的论文

    阶段 2 a 如果提议者收到大多数接受者对其准备请求 编号为 n 的响应 则它向每个接受者发送一个接受请求 以获取编号为 n 且值为 v 的提案 其中 v 是响应中编号最高的提案的值 或者如果响应未报告任何提案 则为任意值 正如论文中提到的
  • 运动结构,根据 2D 图像点对应关系重建 3D 点云

    Use case 物体绕其中心以不同的速度旋转 固定摄像机正在观察物体 给定 2D 图像点对应关系重建 3D 点云 当物体旋转时 相机可以看到它的不同部分 从而检测到不同的点和对应关系 Scene A N 张图片b N 1 图像对C N 1
  • 计算排列中“反转”的数量

    设 A 为一个大小的数组N 我们称之为几个索引 i j 一个 逆 如果i lt j and A i gt A j 我需要找到一种接收大小数组的算法N 具有唯一的数字 并返回时间的倒数数O n log n 您可以使用归并排序 http en
  • 将平面表解析为树的最有效/优雅的方法是什么?

    假设您有一个存储有序树层次结构的平面表 Id Name ParentId Order 1 Node 1 0 10 2 Node 1 1 1 10 3 Node 2 0 20 4 Node 1 1 1 2 10 5 Node 2 1 3 10
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • 计算序列 1,3,8,22,60,164,448,1224... 的第 n 项? [复制]

    这个问题在这里已经有答案了 可能的重复 我想以 Order 1 或 nlogn 的顺序生成序列 1 3 8 22 60 164 的第 n 项 https stackoverflow com questions 11301992 i want
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 多线程归并排序,添加额外的线程

    我在java中的多线程合并排序算法中面临一个问题 我应该将代码修改为 3 4 5 6 7 8 线程合并排序 将原始数组划分为subArrays 目前它有2subArrays 如何将原始数组拆分为 3 4 5 6 7 8subArray是为了
  • 如何找到权重为 1、0、-1 且成本精确为 0 的多维路径

    我得到了一个有向图 其中有 n 个节点和边 向量的权重 每个向量的长度为 m 为数字 1 0 1 我想找到从一个节点到另一个节点 我们可以多次访问节点 的任何路径 或者说这样的路径不存在 使其权重之和等于仅由零组成的向量 我正在考虑暴力回溯
  • 查找预排序数组中给定值的最低索引

    嘿 我在采访中遇到了这个问题 想知道解决它的最佳方法是什么 假设给定一个已经排序的数组 并且您想要找到某个值 x 的最低索引 这是我想出的 python 伪代码 我只是想知道是否有更好的方法来实现它 def findLowestIndex
  • STL 哈希函数

    STL 是否有公开公开的可用哈希函数 我知道有一些使用哈希值的非标准实现 例如boost hash map 并且MSVC8实现了hash map hash set 等的版本 但有没有哈希函数C 98 STL 中定义的 如果不是 可靠哈希函数
  • 带提示的二分查找

    我有一个简单的std vector包含一些已排序的数字 按升序 我想查找一个元素 到目前为止我使用 return std lower bound vec begin vec end needle Where needle是我寻找的元素 然而
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li
  • 下面代码的时间复杂度怎么是O(n)?

    I was solving a time complexity question on Interview Bit which is given below in the image 这个问题的正确答案是O N 但根据我的说法 答案应该是
  • 基于百分比的路由算法

    四处浏览基于百分比的路由 偶然发现这个线程 https stackoverflow com a 52044571 3154233 根据建议的算法如下 对于给定模型如下 public class Host private String nam
  • 如何获取字母数组的每种可能模式[重复]

    这个问题在这里已经有答案了 可能的重复 有没有更好的方法来进行字符串排列 https stackoverflow com questions 1995328 are there any better methods to do permut
  • 德尔福 LZMA

    我在 7 zip 网站上找到了一个 LZMA 库 但是没有用 我不使用文件 只使用流 出于某些原因 7 zip 站点上的库只将标头写入流而不压缩流 有人遇到了一些问题吗 有例子吗 知道 Delphi 的其他 LZMA 库吗 Tks 我自己没
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel

随机推荐

  • 在 WHERE 子句中使用可选参数

    我有一个SP ALTER PROCEDURE dbo sp Compare lst varchar 100 frst varchar 100 NULL passportNo varchar 50 NULL AS SELECT FROM db
  • Concourse CI 找不到 kubernetes 秘密

    当运行程序尝试检索资源时 我收到以下错误 checking failed Expected to find variables git 我的资源看起来类似于 name resource repo type git source uri ht
  • 使用Python批量重命名文件

    下面是我的代码来批量重命名给定目录中的图片 def multi filename change i 0 files askstring Select your folder Paste your directory path where y
  • 增加 sigmoid 预测输出值?

    我创建了一个用于文本分类的 Conv1D 模型 当在最后一个密集处使用 softmax sigmoid 时 它产生的结果为 softmax gt 0 98502016 0 0149798 sigmoid gt 0 03902826 0 00
  • 大小为 n 的数组,其中一个元素 n/2 次

    给定一个由 n 个整数组成的数组 其中一个元素出现超过 n 2 次 我们需要在线性时间和恒定的额外空间中找到该元素 YAAQ 又一个数组问题 我有一种偷偷的怀疑 这类似于 在 C 中 We don t need an array publi
  • xcode 错误:...此类与键 ibShadowedLargeTitleTextAttributes 的键值编码不兼容

    我不断收到此错误 在我使用颜色集之前 该应用程序就可以运行 该错误说明了一些有关ibShadowedLargeTitleTextAttributes 我没有为大标题阴影设置任何颜色 我使用默认值 透明 我重新启动了 Xcode 使用了阴影颜
  • Linux/Ubuntu 目录位置 ~/.vim/syntax/

    文件夹的默认位置在哪里 vim syntax 在Linux系统上 我正在尝试添加一个 Python 插件 您正在寻找 runtimepath 选项 该文档非常详细 使用 help runtimepath 但我会尝试在这里总结一下 The 运
  • 如何选择一个元素但排除其子元素

    我明白 div hover not class 作品 但是 如何实现 LI 元素的 悬停 效果 但排除鼠标悬停在LI内的某个 DIV 上时的悬停效果 E G li Hello div Bye div li 我想获得 li 的悬停效果 li
  • 我可以在 CodeIgniter 中使用 MySQLi 和 PHP5 语法吗?

    我正在开始一个新的网络项目 我想我应该尝试使用一个框架 我知道 CodeIgniter 是用 PHP4 编码的 但是在使用 CodeIgniter 编码时 我是否能够使用 MySQL 的 MySQLi 函数以及 PHP5 语法 特别是涉及
  • 查找张量流运算所依赖的所有变量

    有没有办法找到给定操作 通常是损失 所依赖的所有变量 我想用它来将该集合传递到optimizer minimize or tf gradients 使用各种set intersection 组合 到目前为止我已经找到了op op input
  • 更新/编辑数据库中输入的数据 - servlet

    我准备了一个用于插入 查看和删除数据的表单 现在我想添加选项来编辑该数据 但要么我遵循错误的方法 要么我不知道如何做到这一点 那么任何人都可以帮助我继续编辑输入的数据吗 我应该参考旧的 html 页面进行编辑还是新页面或 我知道我没有遵循
  • 我怎样才能实现CoverFlow视图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想用点线布局实现溢出视图 目前我正在使用 polidea 封面流库 URL github https
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • 如何访问带有美元符号的 PHP 对象属性?

    我有一个 PHP 对象 其属性中有一个美元 符号 如何访问该属性的内容 例子 echo object gt variable Ok echo object gt variable WithDollar Syntax error With 变
  • 如何根据本地存储中的另一个数据响应推迟 XMLHttpRequest [重复]

    这个问题在这里已经有答案了 function to download pps compress txt from cloud server for global parameter set PPs function get pps para
  • 张量流 - 向量中的前 k 个值到二进制向量

    假设我有一个带有值的向量 0 4 1 2 8 7 0 2 如何获得前 k 个值的二进制向量 k 3 0 1 0 0 1 1 0 0 in 张量流 TensorFlow 的tf math top k https www tensorflow
  • Disqus:使用 jQuery 成功后更改标题

    Disqus 根据请求自动放置定义的标题 例如 添加新评论 我尝试在ready 上使用jquery更改它的值 dsq new post h3 text Paticipa con tu cuenta favorita 没有成功 我如何知道 d
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun