Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于我绘图项目的建议_C++_Math_Scripting_Lua_Graphing - Fatal编程技术网

C++ 关于我绘图项目的建议

C++ 关于我绘图项目的建议,c++,math,scripting,lua,graphing,C++,Math,Scripting,Lua,Graphing,我正在开发一个程序,该程序每(.1)秒更新一次对象列表。在程序完成更新列表后,程序将知道是否有任何对象与任何其他对象存在一定距离。每个对象在图形上都有一个X,Y位置。每个对象都有一个称为“范围”的值。每勾选一次(.1s),程序将使用距离公式计算是否有任何其他对象小于或等于正在处理的对象的范围 例如,如果点A的范围为4且位于(1,1),而点B位于(1,2),则距离公式将返回~1,这意味着点B在点A的范围内。计算结果与此类似: objects = { A = {X = 1,Y = 1,Range =

我正在开发一个程序,该程序每(.1)秒更新一次对象列表。在程序完成更新列表后,程序将知道是否有任何对象与任何其他对象存在一定距离。每个对象在图形上都有一个X,Y位置。每个对象都有一个称为“范围”的值。每勾选一次(.1s),程序将使用距离公式计算是否有任何其他对象小于或等于正在处理的对象的范围

例如,如果点A的范围为4且位于(1,1),而点B位于(1,2),则距离公式将返回~1,这意味着点B在点A的范围内。计算结果与此类似:

objects = { A = {X = 1,Y = 1,Range = 4}, B = {X = 1,Y = 2,Range = 3}, C = {X = 4,Y = 7,Range = 9} }

while(true) do
 for i,v in pairs(objects) do
   v:CheckDistance()
 end
wait()
end

-- Point:CheckDistance() calculates the distance of all other points from Point "self".
-- Returns true if a point is within range of the Point "self", otherwise false.
--
问题: 图形可能包含200多个点,每个点都会对存在的其他点应用数学。这将在每个点每.1s发生一次。我想这可能会在我使用的3D环境中减慢速度或造成延迟

问题: 这听起来像是最好的方法吗?
关于如何更高效/快速地完成这项工作,您有什么想法?

我不知道在您给定的环境中是否可行,但我肯定会使用事件而不是循环。这意味着当一个点改变它的位置时,跟踪它并对其作出反应。这是更有效的,因为它需要更少的处理和刷新位置的速度比每1秒。如果您的点四处浮动,您可能应该在每个时间上限中加入一些函数调用,因为这些事件将被经常调用。

如前所述:看起来您正在制作自己的碰撞检测器,尽管它是一个原始的碰撞检测器

但是,我不确定在二维或三维平面上是否有点。你说每个对象“在图形上都有一个X,Y位置”,然后进一步谈论“我使用的3D环境中的滞后”

嗯,2D和3D物理以及Lua都是发展良好的领域,因此不缺乏优化

空间树 A(或用于3D)是一种数据结构,它将整个2个世界表示为一个正方形,分为四个正方形,每个正方形又分为四个正方形,依此类推。

您可以自己尝试一个交互式示例

空间树通常为局部点提供非常快速的访问。

这些圆表示特定粒子的相互作用半径。如您所见,很容易找到需要遍历的分支

在处理点云时,您需要确保两个点不共享同一位置,或确保树具有最大分割深度;否则,它将尝试内部划分分支

我不知道Lua中有任何八叉树的实现,但是制作一个八叉树非常容易。如果需要示例,请寻找Python或C实现;不要使用C++,除非你能处理模板疯狂。 或者,您可以通过LuaAPI绑定或FFI库(建议,见绑定部分)使用C或C++实现。 卢阿吉特 是一个定制的Lua 5.1解释器和即时编译器,提供了显著的速度和存储优化,以及一个FFI库,允许轻松高效地使用C函数和类型,如整数

使用C类型表示点和空间树将显著提高性能

本地ffi=需要“ffi”
外国金融机构[[
//gp=绘图项目
结构总成点{
双x,y;
双量程;
};
结构gp四叉树根{
//这将是广泛的
};
结构gp四叉树节点{
// 
};
]]
gp_点_mt={
__加法=函数(a,b)
返回gp_点(a.x+b.x,a.y+b.y)
完,,
__tostring=函数(自)
返回self.x…“,”self.y
结束
__索引={
--我想不出你在这里需要什么!
something=函数(self)返回self.range^27结束,
},
}
gp\u point=ffi.metatype(“结构gp\u point\s”,gp\u point\u mt)
--现在随意使用gp_点
局部p=gp_点(22.5,5.4,6)
印刷品(p)
打印(p+gp_点(1,1,0))
打印(p:something())
LuaJIT将编译任何运行时使用的gp_指向本机程序集,这在某些情况下意味着类似C的速度

luaapi vs FFI 这是一个棘手的问题

无法正确优化通过Lua API的调用,因为它们在Lua状态下具有权限。 而通过LuaJIT的FFI对C函数的原始调用可以完全优化

由您决定代码应如何互操作:

  • 直接在脚本中(Lua,限制因素:动态语言只能在一定程度上得到优化)
  • 脚本->应用程序绑定(Lua->C/C++,限制因素:luaapi)
  • 脚本->外部库(Lua->C,限制因素:无,FFI调用是JIT编译的)
增量时间 不是真正的优化,但这很重要

如果你正在制作一个为用户交互而设计的应用程序,那么你不应该;也就是说,您不能假设每次迭代只需要0.1秒。相反,必须将所有依赖时间的操作乘以时间

pos=pos+vel*delta
标高=标高+加速度*增量
加速度=加速度+急动*增量
--等等!
然而,这是一个物理模拟;正如格伦·费德勒(Glenn Fiedler)所讨论的那样,物理学中的固定时间步和可变时间步都存在不同的问题:

修正你的时间步长或爆炸 。。。如果你在汽车模拟中对减震器有一系列非常硬的弹簧约束,那么dt的微小变化实际上会使模拟爆炸

如果使用固定的时间步长,则理论上每次模拟都应以相同的方式运行。如果使用可变时间步长,它将非常平滑但不可预测。我建议问问你的教授。(这是我