计算撞击倾斜墙壁后的角度变化

2024-04-28

我正在用 javascript 制作一个游戏,其中一个物体应该从墙上反弹。我真的尝试让它自己工作,但它从来没有正常工作。

假设有一个球在笼子内弹跳(蓝色 = 30°,棕色 = 60°);

球的坐标是已知的。运动角度是已知的。碰撞点 (P) 坐标已知。墙的角度是已知的。球的位置正在使用以下函数在 setInterval 函数内更新其坐标:

function findNewPoint(x, y, angle, distance) {
var result = {};

result.x =(Math.cos(angle * Math.PI / 180) * distance + x);
result.y = (Math.sin(angle * Math.PI / 180) * distance + y);

return result;

因此,在碰撞时,应该有一个函数可以适当地改变球的角度。这看起来是一个非常复杂的问题,因为即使我知道墙是 30°,了解球从哪一侧撞到墙上也很重要。我尝试使用“平面中直线的反射”公式和一些向量,但它对我来说从来没有成功。我并不期望用代码得到完整的答案,如果有人可以建议应该以什么方式对其进行编程,它也会有所帮助。

编辑: 谢谢你们的提示,我意识到是什么造成了最混乱;如果我用鼠标在画布上选择一个角度,起始坐标(0,0)位于左下角。但由于画布的起始坐标位于左上角,因此必须考虑这一点。

基本上使用这个公式来计算角度:

function angle(cx, cy, ex, ey) {
var dy = ey - cy;
var dx = ex - cx;
var theta = Math.atan2(dy, dx);
theta *= 180 / Math.PI; 
return theta;

}

如果球从 (50,50) 移动到 (100,100),则角度将为 -45。

Now, this angle changes in the following way when hitting walls: angle bounces

老实说,我是通过反复试验得出这些结果的,但我并不真正理解为什么是 60 和 120。


使用角度来移动球并反复计算 Cos/Sin 是不明智的。相反,使用带有分量的单位速度方向向量vx, vy像这样:

new_x = old_x + vx * Velocity_Magnitude * Time_Interval

注意vx = Cos(angle), vy = Sin(angle),但使用方向方法时,您很少需要使用三角函数。

具有角度 Fi 的倾斜墙具有法线

nx = -Sin(Fi)
ny = Cos(Fi)

要找到反射,您需要计算速度和法线的点积

dot = vx * nx + vy * ny

反射变换后的速度:

vnewx = v.x - 2 * dot * n.x 
vnewy = v.y - 2 * dot * n.y 

使用这些值进行进一步移动

(请注意,您可以使用内部法线方向和外部法线方向,因为方向翻转会更改两个分量和符号2 * dot * n.x保持不变)

例子:

horizontal moving right
vx=1, vy=0   
30 degrees wall has normal 
nx=-1/2, ny=Sqrt(3)/2  
dot = -1/2
vnewx = 1 - 2 * (-1/2) * (-1/2) = 1/2
vnewy = 0 - 2 * (-1/2) * Sqrt(3)/2 = Sqrt(3)/2
(velocity direction angle becomes 60 degrees)

horizontal moving left
vx=-1, vy=0   
330 degrees wall (left bottom corner) has normal 
nx=1/2, ny=Sqrt(3)/2  
dot = -1/2
vnewx = -1 - 2 * (-1/2) * (1/2) = -1/2
vnewy = 0 - 2 * (-1/2) * (Sqrt(3)/2) = Sqrt(3)/2
(velocity direction angle becomes 120 degrees)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算撞击倾斜墙壁后的角度变化 的相关文章

  • iPad - 无法在框架内滚动

    我无法滚动 iPad Safari 中框架内调用的 pdf 我已经尝试过两件事 2 指滚动 使用对象 嵌入代替框架 但这是行不通的 事实上我已经尝试了很多东西 溢出 高度等等 请帮我 先感谢您 根据这篇文章http support appl
  • 如何按多个项目搜索/过滤列表?

    我正在寻找一个示例 或者可能是一个关于通过在文本框中输入的多个项目来过滤 搜索项目列表的方法的一点提示 假设我有一个列表 ul li Coffee li li Tea li li Milk li li Water li li Juice l
  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • 我可以动态创建/销毁 Vue 组件吗?

    因此 我正在创建一个相当复杂的 Vue 应用程序 它从后端 API 获取数据并将其显示在前端 具体取决于用户选择的过滤器 它的默认设置是立即显示所有内容 然后一旦用户选择过滤器 它就会拉出不具有这些属性的 卡片 组件 直到今天 一切都很顺利
  • 如何使用 JavaScript 选择预节点/块中的文本?

    我了解不允许 JS 将任意文本复制到剪贴板背后的安全原因 但是是否有一种方法可以通过单击按钮来选择预节点中的文本 类似于 select 函数在输入中的工作方式 我不是在寻找复制到剪贴板的 jQuery 插件 我只想突出显示预块中的文本 以便
  • Sonar 中的 javascript 代码覆盖率

    我是使用 Sonar 和插件进行 javascript 代码覆盖的新手 使用 Sonar 分析时 有哪些可能性可以找出 javascript 代码的质量 包括代码覆盖率 目前我正在使用 karma runner 它提供代码覆盖率报告 可以在
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • 在多个动态添加的表单上初始化 jQuery validate() 函数

    有人建议最好初始化一个 form validate 在页面加载而不是点击事件上运行 jquery form validate 插件仅允许在输入更改时提交 https stackoverflow com questions 10984196
  • Angularjs 完整日历不显示事件

    我正在用那个https github com angular ui ui calendar https github com angular ui ui calendar在 Angularjs 中使用 FullCalendar 它显示日历并
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • “|”是什么意思(单管道)在 JavaScript 中做什么?

    console log 0 5 0 0 console log 1 0 1 console log 1 0 1 为什么0 5 0返回零 但任何整数 包括负数 都返回输入整数 单管道 有什么作用 这是一个按位或 https developer
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • Aurelia - 仅 HTML 自定义元素的内联定义

    我的 Aurelia 视图模型中有一个递归对象 如下所示 Class BottomlessPit Name string MorePits BottomlessPit null 因此 我想在 Aurelia 视图中使用递归模板 它只会在一个
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu

随机推荐

  • 如何以 OO 风格打开管道?

    我用新风格重写了旧代码 如下所示 old style open FD file new style fh IO File gt new file r 文件没问题 但我不知道如何打开管道 read from pipes open PIPE s
  • dotnet 技术中的类库和安全性

    假设我已经开发了类库 并且我希望我只能在我的项目中使用这个库 但是如果有人尝试复制 dll 文件并想在他的项目中使用它 那么他将无法这样做 所以我只是想知道如何在 dll 文件中嵌入这种类型的安全性 请告诉我所有方法 谢谢 您可以在程序集中
  • Hibernate NoCacheRegionFactoryAvailableException

    我遇到了一个奇怪的 Hibernate 异常 我无法解释 它告诉我我正在使用二级缓存 但没有在哪里hibernate cfg xml我是否指定二级缓存 这是例外情况 org hibernate cache NoCacheRegionFact
  • Redux Toolkit RTK Query 发送查询参数

    如何使用 Redux Toolkit RTK 查询将查询参数传递到 api import createApi fetchBaseQuery from reduxjs toolkit query react const baseUrl xxx
  • 仅对 Visual Studio 团队服务强制执行拉取请求

    有一种方法可以强制某些人只能通过拉取请求为一个分支做出贡献 我希望他们能够接受拉取请求 但不能直接推送更改 这将很有用 因为我们有一些分支策略 对于接受拉取请求的人来说 例如构建必须通过 问题是 如果我们允许某人接受拉取请求 我们将允许他们
  • Enterprise Java Bean 到底是什么?

    Tomcat FAQ 上说 Tomcat 不是 EJB 服务器 Tomcat 不是完整的 J2EE 服务器 但如果我 使用 Spring 提供应用程序上下文 使用 JPA 注释我的实体 注释 并使用 Hibernate 作为 JPA 提供商
  • 在 SSIS 中插入新记录之前如何清空目标表?

    我使用 SSIS 生成和转换新数据 以便以后在新系统中使用 每次运行 SSIS 包时我都会遇到问题 它不断将新记录插入到我的目标表中 如何先清空目标表 OLE DB Destination 然后插入新生成的记录 目前此问题的解决方法是执行d
  • 访问Firebase规则中的电子邮件地址[重复]

    这个问题在这里已经有答案了 我正在使用 Firebase 3 编写 firebase 规则时 auth 对象仅包含 uid 和提供程序 有什么方法可以增强此功能以提供电子邮件地址吗 我试图解决的问题是 我正在处理的网站的所有者希望根据用户的
  • HTML 语义:将链接(锚元素)放在标题中是个好主意吗?

    以这种方式建立新闻列表是错误的吗 h1 a href article 1 html That happened a h1 div class short Just like planned div 我应该更喜欢这个吗 h1 That hap
  • 现代 CNN(卷积神经网络)作为 DetectNet 旋转不变吗?

    众所周知 用于目标检测的 nVidia DetectNet CNN 卷积神经网络 基于 Yolo DenseBox 的方法 https devblogs nvidia com parallelforall deep learning obj
  • MSTest 命令行设置

    我们需要能够将服务器地址传递到 MSTest 命令行中 以便由 TeamCity 持续集成 CI 软件调用我们的测试套件 之前我们在 C 单元测试中创建了 if 常量 这在 MSBuild 中进行了更改 有没有更好的办法 这种方式看起来很h
  • Azure WebApp - 无法自动检测应用程序的运行时堆栈

    我正在尝试创建只有静态 HTML 的 Web 应用程序 我正在关注这个链接https learn microsoft com en us azure app service app service web get started html
  • Flutter firebase_message 插件设置错误

    我想在我的 Flutter 应用程序中尝试云消息传递 但我总是遇到错误 而且我还没有找到解决方案 我按照此处所述的步骤进行操作 firebase 消息传递 https github com FirebaseExtended flutterf
  • 如何创建 heat.exe 收集的文件的快捷方式?

    使用 WiX Toolset 3 10 并尝试创建已使用 WiX Toolset 收获的某些文件的快捷方式heat exe效用 如 WIX bin heat exe dir SourceDir nologo platform x64 ke
  • 单击 img border = #color - 多个图像 - 一次只需要突出显示 1 个图像

    基本上我想要完成的是创建一个图像列表 比方说 10 个 然后单击这些图像中的任何一个 它们的边框会更改为特定颜色 目前通过 JS 的简单 onClick 事件来完成此操作 那不是问题 当点击第二个 第三个或第四个图像时 就会出现麻烦 当然
  • NSArrayController:removeAllObjects 不会刷新 TableView

    在我的应用程序中 我将对象直接添加到 ArrayController 当我想清洁所有物品时 我会这样做 downloadItemsController content removeAllObjects 但是 此命令不会刷新 arraycon
  • Flutter TextButton splashColor 属性

    我正在使用FlatButton并传递了属性 FlatButton splashColor Colors transparent highlightColor Colors transparent child The 文档称 FlatButt
  • Haskell - 无法将类型“PersistEntityBackend record0”与“SqlBackend”匹配

    我正在尝试通过 Yesod 中的 id 获取记录 我的代码是 getEditActorR Handler Html getEditActorR do actorId lt runInputGet ireq intField id actor
  • 比较 Observable 的前一个值与 Angular 中的下一个值

    我一直在开发一个应用程序 它允许几个不同的组件更新BehaviorSubject在角度 在每个组件中 我存储前一个组件的本地副本BehaviorSubject价值 为了知道组件是否生成了被推出的新值 我计划使用 LoDash 来比较两个对象
  • 计算撞击倾斜墙壁后的角度变化

    我正在用 javascript 制作一个游戏 其中一个物体应该从墙上反弹 我真的尝试让它自己工作 但它从来没有正常工作 假设有一个球在笼子内弹跳 蓝色 30 棕色 60 球的坐标是已知的 运动角度是已知的 碰撞点 P 坐标已知 墙的角度是已