围绕圆周旋转一个点
我正在试图为一个“游戏”制作一种类似于“旋转小地图”的东西,我有两个玩家的坐标,一个是玩家,一个是目标,以及玩家相对于平面所面朝的方向。 它们位于一个二维平面上,每个都有它们的坐标(例如A(56.25,23.44),B(50.17,33.57))。
所以,我想要将一个静态的“小地图”变成一个旋转的地图,希望玩家(A)成为中心,成为B围绕其旋转的锚点,其旋转方向取决于玩家所面朝的方向。
以数学(?)术语来说,这意味着我想将点B绕点A旋转一个角度形成一个圆。 (我绝不是专家,甚至不精通这两个领域,我学到的一切都是自学的,因此请带着怀疑的心态接受我的定义和术语)
基本想法; A是玩家或起点,B是目标或要移动的点,B'是它将要移动到的点。穿过B'的线将是给定角度alpha时玩家面对的方向。
已经在这些论坛上讨论过这个问题了,而且我猜已经解决了,我看到了这些问题,但我并没有完全理解它们,也没有解决我的问题。
有些帖子说B'(X,Y)的公式应该是X = hyp * cos(a)(其中a是角度,hyp是斜边),Y = hyp * sin(a),但由于_未知的_原因,这使我的B'变得疯狂,并且如果A和B在同一轴上,则不适用(我不理解它是如何工作的,也不知道为什么它不工作)。
另一个帖子说公式应该是X = Ax * cos(a) - Ay * sin(a)和Y = Ay * cos(a) - Ax * sin(a);不幸的是,这也不起作用,因此最终我不明白为什么或如何这两个都起作用,以及为什么它们都不起作用,角度已经以度和弧度的形式给出。
这是我用于测试(在实现想法之前)的代码:
local pX,pY,fX,fY = 10,20,10,40
local playerA = 45
local X,Y = fX-pX,fY-pY
local hyp = math.sqrt((X^2)+(Y^2))
local X2,Y2 = hyp * math.cos(playerA),hyp * math.sin(playerA)
print(X2,Y2,hyp)
(其中玩家的坐标将是pX和pY,目标的fX和fY,半径或斜边hyp和角度playerA)。只需使用预期角度绘制结果坐标,结果大多数情况下都不正确。
希望我已经充分解释了问题和我的工作,谢谢你们至此阅读并考虑这个问题!
编辑:我通过将目标的坐标对极坐标进行转换,添加我想要移动的角度,然后再转换成直角坐标已经解决了问题,现在看来好像是很有前途的,但上面的问题仍然令我感到不安;对于有兴趣或寻找类似答案的人,这个“解决方案”是这样测试的:
local x,y = 20,20
local hyp = math.sqrt((x^2)+(y^2))
local a = math.atan(y / x)
print(hyp,math.deg(a))
a = a + math.rad(135)
local x2 = hyp * math.cos(a)
local y2 = hyp * math.sin(a)
print("("..x2..","..y2..")")
local hyp = math.sqrt((x2^2)+(y2^2))
local a = math.atan(y2 / x2)
print(hyp,math.deg(a))
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你的代码大部分正确,但是需要进行一些校正:lua中的三角函数使用的是弧度作为参数,所以你需要将45度转换为弧度(我提供了两种方式)。而且你计算出的位置是相对于玩家的,所以为了得到绝对坐标,你需要加上玩家的坐标:
local pX, pY, fX, fY = 10, 20, 10, 40 local playerA = 45 * math.Pi / 180 或者 local playerA = math.rad(45) local X, Y = fX - pX, fY - pY local hyp = math.sqrt((X ^ 2) + (Y ^ 2)) local X2, Y2 = pX + hyp * math.cos(playerA), pY + hyp * math.sin(playerA) print(X2, Y2, hyp)