射线

C\\C++代码优化的27个建议

喜你入骨 提交于 2020-04-06 11:52:34
1. 记住 阿姆达尔定律 : funccost 是函数func运行时间百分比, funcspeedup 是你优化函数的运行的系数。 所以,如果你优化了函数 TriangleIntersect 执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。 这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。 这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。 2. 代码先保证正确,然后再考虑优化 这并不意味着用8周时间写一个全功能的射线追踪算法,然后用8周时间去优化它。 分多步来做性能优化。 先写正确的代码,当你意识到这个函数可能会被经常调用,进行明显的优化。 然后再寻找算法的瓶颈,并解决(通过优化或者改进算法)。通常,改进算法能显著地改进瓶颈——也许是采用一个你还没有预想到的方法。所有频繁调用的函数,都需要优化。 3. 我所了解的那些写出非常高效代码的人说,他们优化代码的时间,是写代码时间的两倍。 4.跳转和分支执行代价高,如果可能,尽量少用。 函数调用需要两次跳转,外加栈内存操作。 优先使用迭代而不是递归。 使用内联函数处理短小的函数来消除函数调用开销。 将循环内的函数调用移动到循环外(例如,将 for(i=0;i <100;i++) DoSomething(); 改为 DoSomething() { for(i=0;i <100;i++)

C\\C++代码优化的27个建议

这一生的挚爱 提交于 2020-04-06 10:35:18
1. 记住 阿姆达尔定律 : func cost 是函数func运行时间百分比, func speedup 是你优化函数的运行的系数。 所以,如果你优化了函数 TriangleIntersect 执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。 这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。 这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。 2. 代码先保证正确,然后再考虑优化 这并不意味着用8周时间写一个全功能的射线追踪算法,然后用8周时间去优化它。 分多步来做性能优化。 先写正确的代码,当你意识到这个函数可能会被经常调用,进行明显的优化。 然后再寻找算法的瓶颈,并解决(通过优化或者改进算法)。通常,改进算法能显著地改进瓶颈——也许是采用一个你还没有预想到的方法。所有频繁调用的函数,都需要优化。 3. 我所了解的那些写出非常高效代码的人说,他们优化代码的时间,是写代码时间的两倍。 4.跳转和分支执行代价高,如果可能,尽量少用。 函数调用需要两次跳转,外加栈内存操作。 优先使用迭代而不是递归。 使用内联函数处理短小的函数来消除函数调用开销。 将循环内的函数调用移动到循环外(例如,将 for(i=0;i <100;i++) DoSomething(); 改为 DoSomething() { for(i=0;i <100;i+

判断圆与射线是否相交

风流意气都作罢 提交于 2020-02-29 21:02:42
给定2个点的坐标A和B,代表有一条射线AB。 再给定一个点的坐标O点和一个半径R,代表以O为圆心以R为半径的一个圆。 问射线与圆是否有公共点,即存在某个点既在射线上又在圆上。 输入一共7个数,均为不超过100的非负整数。 输出一行,存在这个点就输出Y,否则输出N。 测试举例: 测试输入:2 3 2 100 2 1 1 预期输出:N 测试输入:1 0 1 100 2 1 1 预期输出:Y 向量乘法: a∗b=∣a∣∗∣b∣∗cosxa * b = |a| * |b| * cosx a∗b=∣a∣∗∣b∣∗cosx向量的坐标相乘: (x1,y1)∗(x2,y2)=x1∗x2+y1∗y2(x1,y1)*(x2,y2)=x1 * x2+y1 * y2(x1,y1)∗(x2,y2)=x1∗x2+y1∗y2提示: 比较∠OAB和∠OAP的大小,如果∠OAB不大于∠OAP,则圆与射线相交。 可以通过比较sin值判断大小。 # include <iostream> # include <cmath> using namespace std ; int main ( ) { int x1 , y1 , x2 , y2 , xo , yo ; double r , l , k = 0 ; cin >> x1 >> y1 >> x2 >> y2 >> xo >> yo >> r ; k = ( y2 -

共享v2射线局域网http代理方法

我只是一个虾纸丫 提交于 2020-02-21 18:58:36
问题描述 默认v节点大部分是socks代理,实际使用过程中存在以下问题: 部分浏览器无法支持socks需要走http代理。 局域网内其他设备(手机、PS4等)需要配置代理。 解决方法 1.在PC托盘图标右键餐袋中先勾选http代理并在【参数设置】-【其他设置】中允许来自局域网连接 2.此时http代理已经开启,端口号为socks+1,例如socks=1080则http=1081 3.在移动设备或浏览器中开启指向该IP:1081的代理即可 亲测iOS可用 来源: https://www.cnblogs.com/azureology/p/12342494.html

UE4 网络同步,数据同步失败

依然范特西╮ 提交于 2020-02-07 02:16:26
在做网络同步的时候,射线检测发射的射线虽然能同步但是射线的方向却没有同步 检测线是第三个窗口(客户端2)发射的,在第一个窗口中(服务器)是同步成功的,但是在第二个窗口(客户端1)中是同步失败的,并不是没有发射而是射线的Y轴的数值没有同步成功,射线重叠了。 上图是发射检测射线的节点(同步失败的)。 修改方法 修改的方法是创建两个Vector变量设置为可复制的,用tick事件 把射线发射的开始位置和结束位置设置给两个变量,这样射线的位置和朝向就能同步了。 这只是一种思路,遇到数据同步失败的情况都可以按照这个思路解决。 假如射线用来射击的,解决射线不同步的方法还有一种,可以不同步射线,只同步检测的结果。 射线在本地发射,如果检测到击中敌人则将调用同步的伤害事件,让场景内的人都可以看到这个人被击中了。 虽然写的啰嗦点但是对于像我这样的其他新手来说更友好,更有助于理解,如果有看不懂的地方、写错的地方或是大佬们有什么指导性意见可以评论留言。 来源: CSDN 作者: 隔壁家的石头 链接: https://blog.csdn.net/zbcjdsb/article/details/104197315

ThreeJS中的点击与交互——Raycaster的用法

℡╲_俬逩灬. 提交于 2020-01-31 01:10:11
基础概念 坐标系 我们的手机屏幕是二维的,但是我们展示物体的世界是三维的,当我们在构建一个物体的时候我们是以一个三维世界既是世界坐标来构建,而转化为屏幕坐标展示在我们眼前,则需要经历多道矩阵变化,中间webGL替我们操作了许多事情。 世界坐标系: 在webGL中,世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定:窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角 坐标为(1,1)。 屏幕坐标系: webGL的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。 视点坐标系: 是以视点(照相机)为原点,以视线的方向为Z+轴正方向的坐标系中的方向。webGL会将世界坐标先变换到视点坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。 Raycaster Raycaster threeJs官方文档 这个类设计用于鼠标去获取在3D世界被鼠标选中的一些物体 Raycaster( origin, direction, near, far ) origin — 射线的起点向量。 direction — 射线的方向向量,应该归一标准化。

UGUI的事件系统

烈酒焚心 提交于 2020-01-24 02:59:14
当我们在场景中创建任一UI对象后,Hierarchy面板中都可以看到系统自动创建了EventSystem对象,EventSystem对象负责管理所有事件相关对象,该对象下挂载了EventSystem组件和StandaloneInputModule组件,前者为管理脚本,后者为输入模块。Canvas对象下挂载了GraphicRaycaster负责处理射线相关运算,用户的操作都会通过射线检测来映射到UGUI组件上,InputModule将用户的操作转化为射线检测,Raycaster则找到目标对象并通知EventSystem,最后EventSystem发送事件让目标对象进行响应。 总结来说就是:EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象,目标对象负责接收事件并处理,然后一个完整的事件系统就有了 一:EventSystem事件系统 一个场景中只能有一个EventSystem组件 ——First Selected:第一次默认选择的物体 ——Send Navigation Events:是否可以使用导航事件(键盘上下左右)控制 ——Drag Threshold:视为拖拽操作的最小距离 二:EventInterface事件接口 (实现Tooltip) ——IPointerEnterHandler 鼠标进入时响应 —

室内定位系列(二)——仿真获取RSS数据

限于喜欢 提交于 2020-01-23 16:33:58
很多情况下大家都采用实际测量的数据进行定位算法的性能分析和验证,但是实际测量的工作量太大、数据不全面、灵活性较小,采用仿真的方法获取RSS数据是另一种可供选择的方式。本文介绍射线跟踪技术的基本原理,以及如何得到用于定位仿真的RSS数据。在此基础上得到位置指纹库与一组测试数据,用于以后定位算法的验证。(本文的原理介绍并不严谨,但求快速理解) 对数距离损耗模型 在自由空间中,没有任何障碍物,信号从发射源向四面八方呈球面形状发射出去,各个方向上没有任何区别,因此信号的功率和距离的平方呈反比: \(P \propto \frac{1}{d^2}\) 。 RSS就是功率,但是衰减的单位一般用dB来表示,那么就很容易理解RSS与距离的关系了,RSS衰减与距离的对数呈正比,假设已知一个参考距离 \(d_0\) 以及这个距离上的RSS为 \(RSS(d_0)\) ,那么, \(RSS(d) = RSS(d_0) - 10n\log(\frac{d}{d_0})\) 。自由空间中 \(n=2\) ,这就是最常见的对数距离损耗模型(针对室内的传播模型还有分隔损耗、楼层间分隔损耗、Ericsson多重断点模型等)。下图中的黑线是一组在走廊中测量的实际数据,红线是对数距离损耗模型的拟合结果,可以看出模型可以反映总体趋势,但和真实室内环境下的情况还是有较大区别,注意黑线的波动不是因为噪声

Unity事件系统EventSystem简析

不羁的心 提交于 2020-01-20 00:24:20
相关组件和类 EventSystem 1.负责InputModule的切换(因为现在游戏大部分都只有一个StanaloneInputModule,所以切换这部分可以先不考虑)。 2.负责InputModule的激活与反激活。 3.负责Tick整个事件系统。 4.更新InputModule,处理失焦和记录鼠标位置。 5.记录一个Selected对象。 StandaloneInputModule 1.处理输入的鼠标或触摸事件,进行事件的分发。 2.激活和反激活时负责初始化(选择对象,鼠标位置)和清理无效数据(选择对象、pointerData)。 3.不直接使用Input获取数据,而使用一个MonoBehaviour进行封装,提供切换Input的能力(例如游戏进入了反转模式,点左下角时希望右上角有反应。那么重写一个对应的脚本,在进入这个模式时切换Input脚本就可以)。 Raycaster 1.找到所有被射线检测成功的对象,选排序后第一个对象进行事件分发。 Input类 1.负责获取和封装外部的输入信息,如点击、重力感应等。 2.BaseInput提供和Input类一样的能力,是对Input对象的封装,接口名字都一样,方便输入系统的切换。 Touch类 1.Touch类是一个Touch行为(在屏幕上按下,抬起的过程算一个Touch行为)某一时刻的数据。 2.Touch类包含的信息。

射线检测

做~自己de王妃 提交于 2020-01-17 19:24:53
射线检测单个游戏对象 //射线检测一个游戏对象 Ray ray = Camera . main . ScreenPointToRay ( Input . mousePosition ) ; RaycastHit hit ; bool isRaycast = Physics . Raycast ( ray , out hit ) ; if ( isRaycast ) { Debug . DrawLine ( ray . origin , hit . point , Color . green ) ; print ( "坐标" + hit . transform . position ) ; print ( "碰撞到点的坐标" + hit . point ) ; print ( "重心坐标" + hit . barycentricCoordinate ) ; print ( "碰撞盒" + hit . collider ) ; print ( "距离" + hit . distance ) ; print ( "光线地图坐标" + hit . lightmapCoord ) ; print ( "法线" + hit . normal ) ; print ( "刚体" + hit . rigidbody ) ; print ( "纹理坐标" + hit . textureCoord )