我最近了解了二进制空间分区树及其在三维图形和碰撞检测中的应用.我还简要地阅读了与四叉树和八叉树相关的材料.你什么时候在bsp树上使用四叉树,反之亦然?它们可以互换吗?如果我有足够的信息来填写这样的表格,我会感到满意:
| BSP | Quadtree | Octree
------------+----------------+-------
Situation A | X | |
Situation B | | X |
Situation C | | | X
Run Code Online (Sandbox Code Playgroud)
什么是A,B和C?
我有一个MDF文件,没有在MS SQL Server 2005中创建的数据库的LDF文件.当我尝试将MDF文件附加到其他SQL Server时,我收到以下错误消息.
The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.
我想完成以下任何一个选项:
我可以尝试使用哪些SQL命令来重新启动数据库?
我有两个模型,A和B,还有一个灯,L.我想模型A在模型B上投下阴影.我不想打扰阴影体积或适当的阴影,只是一个简单的圆形阴影就足够了.效果是模型A被视为用于阴影投射目的的球体.
以下是我设想的算法:
对于模型B中的每个三角形,绘制三角形.沿着从L到A的直线在三角形上投影圆,根据三角形的距离增加圆的大小.确保将圆圈剪切到三角形的边界(我想,以某种方式使用模板缓冲区).
我正在使用OpenGL和简单的C.
我可以阅读一些参考文档的指针吗?还是我的想法?
我以一种模糊的方式理解常规ACID事务的工作原理.您在数据库上执行一些工作,以便在设置某种提交标志之前不确认工作.提交部分基于一些基本假设(如单个磁盘块写入是原子的).如果发生灾难性错误,您可以在恢复阶段清除未提交的数据.
分布式事务如何工作?在一些MS文档中,我已经读过你可以以某种方式在数据库和文件系统之间执行事务(以及其他事情).
这种技术可能(并且可能)用于安装程序,您希望程序完全安装或完全不存在.您只需在安装程序开始时开始一个事务.接下来,您可以连接到注册表和文件系统,进行定义安装的更改.作业完成后,如果由于某种原因安装失败,只需提交或回滚.这个神奇的分布式事务协调器会自动为您清理注册表和文件系统.
如何以这种方式处理两个不同的系统?在我看来,总是可以让系统处于不一致状态,文件系统已经提交了更改而注册表没有.我认为在MSDTC中甚至可以通过网络执行事务.
我已经阅读了http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但感觉只是解释的开头,而且第4步应该大大扩展.
编辑:从我在http://en.wikipedia.org/wiki/Distributed_transaction上收集的内容中,可以通过两阶段提交(http://en.wikipedia.org/wiki/Two-phase_commit)来完成.看完之后,我仍然没有理解100%的方法,似乎步骤之间有很多错误的余地.
我有一些代码利用参数化查询来防止注入,但我还需要能够动态构造查询,而不管表的结构如何.这样做的正确方法是什么?
这是一个例子,说我有一个表名列,地址,电话.我有一个网页,我在其中运行显示列并使用它们作为选项填充选择下拉列表.
接下来,我有一个名为Search的文本框.此文本框用作参数.
目前我的代码看起来像这样:
result = pquery('SELECT * FROM contacts WHERE `' + escape(column) + '`=?', search);
不过,我从中得到了一种icky的感觉.我使用参数化查询的原因是为了避免使用转义.此外,转义可能不是为逃避列名而设计的.
我怎样才能确保这个按照我的意图运作?
编辑: 我需要动态查询的原因是架构是用户可配置的,我不会修复任何硬编码的东西.
我一直在修补BSP树一段时间,我也玩线程.当向BSP树添加三角形时,出现了为并行处理数据而创建新线程的机会.
insert(triangle, bspnode)
{
....
else if(triangle spans bspnode)
{
(frontpiece, backpiece) = plane_split(triangle, bspnode)
insert(frontpiece, bspnode.front)
insert(backpiece, bspnode.back)
}
....
}
上面的两个插入操作可以由两个线程执行,并且由于它们不修改相同的数据,因此可以使用廉价的同步.
insert(triangle, bspnode)
{
....
else if(triangle spans bspnode)
{
(frontpiece, backpiece) = split(triangle, bspnode)
handle = beginthread(insert(backpiece, bspnode.front))
insert(frontpiece, bspnode.back)
if(handle)
{
waitforthread(handle)
}
else
{
insert(backpiece, bspnode.front)
}
}
....
}
这个新方法尝试创建一个并行完成操作的线程,但是如果无法创建线程则不应该失败(它将简单地恢复为原始算法).
这是一个合理的编程习惯,还是我不正确地使用线程?我还没有找到关于这种技术的任何文献.我喜欢它倾向于使用我的CPU(2核),理论上可以扩展到任何数量的可用处理器.我不喜欢它在CPU和内存上可能会非常浪费.
PDF规范定义了一个名为'(撇号)的文本运算符.定义是它写出一些文本,并根据当前的前导状态移动到下一行.可以使用TL运算符设置当前的前导状态.如果您知道它们应该垂直间隔开多少,这样可以很容易地编写文本行:
16 TL /F1 12 Tf (Line 1) ' (Line 2) ' (Line 3) ' (Line 4) '
我没有使用任何库,因为这是一个学习练习.我编写了一些代码来直接解析TTF文件并提取字符宽度,以及PDF FontDescriptor字典所需的其他项目.
我一直在阅读TTF文件格式规范,以便试图找出行高位置或计算方式,但我没有运气.
假设我有以下几点:
如何计算从TTF领先的PDF?
编辑
看来TTF文件中的线间隙值有助于计算PDF前导,但某些字体不能为它提供合理的值(例如,Windows上的Courier New).
我想创建一个用于以类似事务的方式操作发票的界面.
该数据库包含一个发票表和一个invoice_lines表,发票表中包含结算信息,invoice_lines表包含发票的行项目.该网站是一组脚本,允许添加,修改和删除发票及其相应的行.
我遇到的问题是,我希望数据库的ACID属性能够反映在Web应用程序中.
如果我正在编写桌面应用程序,它将始终保持与MySQL数据库的连接,允许我在编辑的开头和结尾简单地使用BEGIN TRANSACTION和COMMIT.
根据我的理解,你不能在一个PHP页面上进行BACIN TRANSACTION而在另一个页面上进行COMMIT,因为页面之间的连接是关闭的.
有没有办法在没有扩展的情况下实现这一目标?根据我的发现,只有SQL Relay这样做(但它是一个扩展).
为什么IClassFactory :: LockServer在我看来IClassFactory :: AddRef/IClassFactory :: Release可以实现相同的目标?
在GCC中将int赋值给size_t(或在malloc中使用它)会产生以下警告:
警告:从'int'转换为'size_t'可能会更改结果的符号[-Wsign-conversion]
为了解决这个问题,我想将转换包装在一个函数中,该函数首先检查转换是否有效,然后进行转换.
这是我到目前为止:
/* Convert int src to size_t dst. */
/* Assumes dst points to valid size_t address. */
int safe_size_t_from_int(size_t *dst, int src) {
if(src < 0) return SAFE_ERROR_NEGATIVE;
if(SIZE_MAX < INT_MAX) {
if(src > (int)SIZE_MAX) return SAFE_ERROR_OVERFLOW;
}
*dst = (size_t)src;
return SAFE_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?是否存在已安装转换的库?
我能找到的最接近的东西是Microsoft Intsafe.h,但它似乎只适用于Win32类型.
编辑修改按照chux'评论.