假设我有一个向量v,其中包含m个元素,以及一个名为i的向量的随机访问索引.
当我增加索引时,如果它超出范围,我想索引第一个(第零个)元素.类似地,当我递减索引时,如果索引<0,我想索引到最后一个元素.目前我只是在容器中移动一个元素,所以想出了这个函数:
unsigned int GetIndexModM(int index,unsigned int m) {return (index + m) % m;}
Run Code Online (Sandbox Code Playgroud)
呼叫站点可能如下所示:
std::vector<Whatever> v = ... // initialise with 5 elements
unsigned int i = 0;
unsigned int j = GetIndexModM(static_cast<int>(i) - 1,v.size()); // get preceeding index
Run Code Online (Sandbox Code Playgroud)
如果从索引中减去> m的值,则此函数将失败:
unsigned int j = GetIndexModM(static_cast<int>(i) - 17,v.size()); // oops: returns -2
Run Code Online (Sandbox Code Playgroud)
我的问题:什么是一个函数最优雅的实现,它接受任何整数并将其作为索引返回?
我在场景中有一些物体,有些可能遮挡其他物体.当我单击鼠标或拖动选择以获得选择矩形时,我想从这个角度选择/选择我能看到的对象.应用程序当前使用GL_SELECT渲染模式,但正如我们所知,它也选择了被遮挡的对象.另外,我读到这在OpenGL 3中已被弃用.
目前有两种方法对我很有吸引力.首先是使用Back Buffer进行对象选择(红皮书,第14章):将每个对象的颜色设置为它的对象id,并从后帧缓冲区读取像素的颜色.第二个是遮挡查询(superbible,4th ed,chap 13).
我已经排除的其他方法是查看选择缓冲区中的最小/最大z值并在GL之外进行自定义光线/对象检测.
我有一些问题:1)如果最近的OpenGL中不推荐使用GL_SELECT,开发人员应该使用哪些替代方案?2)我只读过有关用于加速渲染的遮挡查询.它们可以用于选择/拣选,有缺点吗?3)现有的应用程序有一些glColorXXX调用.如果我使用后缓冲路由,并使用了glColorMask(FALSE,FALSE,FALSE,FALSE),这会有效地将glColourXXX调用转换为无效的调用,从而让我在选择模式下渲染时可以在一个地方控制颜色?4)哪条路线最好/规范?
我创建了一个基于Maven2的GWT应用程序,将其导入Eclipse,当我调试为GWT Web应用程序时,Eclipse调试会话暂停FileNotFoundException.它显示一个窗口:源附件不包含文件URLClassPath.class的源.
我已经彻底清除了Eclipse工作区(和.metadata子目录),创建/导入了一个空白项目,同样的事情发生了.如果我运行作为 GWT Web应用程序,它工作正常(有几个警告).我需要调整什么来使其在调试模式下工作?
1)创建应用程序
webAppCreator -noant -maven -XnoEclipse -out MyApp com.example.MyApp
2)导入和更改设置
将应用程序导入Eclipse工作区,在"使用Google Web Toolkit"复选框的设置中勾选.
"选中此项目有一个WAR目录".WAR目录设置为src/main/webapp.未选中"从此目录启动和部署".
3)调试为
现在按下调试工具栏按钮,选择"GWT Web Application",然后选择target/www作为WAR目录.你应该看到同样的问题."调试"窗格中的调用堆栈包含以下内容:
MyApp.html [Web应用程序]
com.google.gwt.dev.DevMode at localhost:51620 Thread [main](Suspended(exception FileNotFoundException))
URLClassPath $ JarLoader.getJarFile(URL)行:644
URLClassPath $ JarLoader.access $ 600(URLClassPath $ JarLoader,URL)行:540
URLClassPath $ JarLoader $ 1.run()行:607
AccessController.doPrivileged(PrivilegedExceptionAction)行:不可用[native method]
URLClassPath $ JarLoader.ensureOpen()行:599
URLClassPath $ JarLoader.(URL, URLStreamHandler,HashMap)行:583
URLClassPath $ JarLoader $ 3.run()行:810
AccessController.doPrivileged(PrivilegedExceptionAction)行:不可用[native method]
URLClassPath $ JarLoader.getResource(String,boolean,Set)行:806
URLClassPath $ JarLoader.getResource(String,boolean)line:765
URLClassPath.getResource(String,boolean)行:169
URLClassLoader $ 1.run()行:194
AccessController. doPrivileged(PrivilegedExceptionAction,AccessControlContext)行:不可用[native method]
Launcher $ AppClassLoader(URLClassLoader).findClass(String)行:190
Launcher …
我正在将一些代码转换boost::filesystem为std::filesystem.使用的先前代码boost::filesystem::last_write_time()返回time_t与time_t我已经持有的对象如此直接的比较是微不足道的.顺便说一下,这个time_t我持有的文件内容很久以前就已经存在了,所以我坚持使用这个"自unix epoch以来的时间"类型.
std::filesystem::last_write_time返回一个std::filesystem::file_time_type.是否有可移植的方式将a转换file_time_type为a time_t或以其他方式可比较两个对象?
#include <ctime>
#include <filesystem>
std::time_t GetATimeInSecondsSince1970Epoch()
{
return 1207609200; // Some time in April 2008 (just an example!)
}
int main()
{
const std::time_t time = GetATimeInSecondsSince1970Epoch();
const auto lastWriteTime = std::filesystem::last_write_time("c:\\file.txt");
// How to portably compare time and lastWriteTime?
}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意cppreference.comlast_write_time上的示例代码表示它假设时钟是std::chrono::system_clock实现该to_time_t功能的状态.这个假设并不总是如此,并不在我的平台上(VS2017).
我已经基于“ 关于建立用于射线跟踪的快速kd树”的论文,以及 Wald和Havran 在O(N log N)中进行的研究,实现了SAH kd树。请注意,最后我还没有完成他们的拼接和合并建议,只是为了加快树的构建速度,只是SAH部分。
我正在使用轴对齐的多维数据集测试该算法,其中每个面都分成两个三角形,所以我N = 12总共有三角形。左下角的顶点(即最靠近轴的顶点)实际上位于原点。
Face Triangle
----------------
Front: 0, 1
Left: 6, 7
Right: 2, 3
Top: 4, 5
Bottom: 10, 11
Back: 8, 9
Run Code Online (Sandbox Code Playgroud)
假设节点遍历成本Ct = 1.0和交叉成本Ci = 10.0。我们首先发现不分裂的成本为Cns = N * Ci = 12 * 10.0 = 120.0。
现在,我们依次遍历每个轴,并逐步遍历候选拆分平面,以查看拆分成本是否更便宜。第一个分割平面是p = <x,0>。我们有Nl = 0,Np = 2而且Nr = 10(也就是三角形的上左边的数字,在飞机上,并以平面的右侧)。平面中的两个三角形分别是数字6和7(左侧)。其他所有人都在右边。
SAH(p,V,Nl,Nr,Np)现在执行该功能。这需要分割平面,V要分割的体素以及左/右/平面三角形的数量。它计算出命中左(平坦)体素Pl = …