通过编码是否有任何(非微优化)性能增益
float f1 = 200f / 2
Run Code Online (Sandbox Code Playgroud)
在比较中
float f2 = 200f * 0.5
Run Code Online (Sandbox Code Playgroud)
几年前我的一位教授告诉我,浮点除法比浮点乘法慢,但没有详细说明原因.
这句话适用于现代PC架构吗?
UPDATE1
关于评论,请同时考虑这个案例:
float f1;
float f2 = 2
float f3 = 3;
for( i =0 ; i < 1e8; i++)
{
f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively
}
Run Code Online (Sandbox Code Playgroud)
更新2 从评论中引用:
[我想]知道什么是算法/架构要求导致>除法在硬件上比复制要复杂得多
我正在寻找一种数据结构,这使我能够快速(优先O(1) - 快速)确定给定的GUID是否是GUID集合的成员.
我目前的方法是使用带有0作为值的TDictionary.
虽然这很快就能起作用,但使用Hashmap来重新定义GUID似乎是一种浪费,GUID通过定义被认为是唯一的,并且使Dictionary处理不需要的值.
必须有一个更好的解决方案,但我找不到一个.你能?
我想使用内置的排序方法对我的通用tobjectlist进行排序.
这是我做的:
//create the list object
myList := TObjectList<MyType>.Create(false);
[...] //populate the list with unsorted entries
//sort the list
myList.sort(@Comparer);
[...]//store sorted results back to array
myList.Destroy;
Run Code Online (Sandbox Code Playgroud)
我的Comparer函数如下所示:
function Comparer(Item1, Item2 : pointer):integer;
begin
result := myCompare(item1, item2);
end;
Run Code Online (Sandbox Code Playgroud)
根据规格,它应该像这样工作.
我得到一个编译器错误E2250 没有这些参数存在'Sort'的重载版本(确切的措辞不同,我使用非英文版的RAD Studio)
我不知道为什么这不应该是有效的Pascal - 你们中的任何人都有洞察力分享这个吗?
我正在调试分布在许多单元上的大型应用程序.我在低级单元中遇到了编译错误,并且对于引用此单元的应用程序的哪个部分没有任何想法.有没有办法使用RAD studio 2010的IDE来创建某种包含图?
由于大多数使用的单位不是项目的一部分并且分布在相当多的分支源树上,我不能简单地使用"在文件中查找"选项.
我目前正在使用search-in-files-utility遍历我的树,但这很麻烦.
你知道更优雅的方式吗?开发在Embercadero RAD studio 2010,Windows XP 32.
我必须扩展一个OpenGL-Rendering系统来支持国际字符(特别是希伯来语,阿拉伯语和西里尔语).
开发平台是Windows(XP | Vista | 7),唉使用Embercardero Delphi 2010.
我目前使用wglOutLineFont(...)来构建我的字体的显示列表并glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text) )呈现我的字符串.
虽然这对于Latin-1字符是可行的,但事先构建完整的Unicode字符集非常耗时(在我的机器上大约8.5分钟),所以我正在寻找更有效的解决方案.我考虑过限制范围从u + 0020 - u + 077f(拉丁语,希腊语,西里尔语,阿拉伯语和希伯来语)到仅包括我需要的字形,但这只是我当前需求的解决方案,并且一旦变得不够需要其他编码.
从好的方面来说,我不必担心从左到右或从右到左的方向,因为我们的应用程序已经可以处理这个问题.
我希望这是一个众所周知的问题,所以我想问一下网上是否有任何参考资料,或者您是否可以分享一些有关此问题的见解?
编辑
澄清:我使用多边形字体表示.每个Font预先以单位大小(1.0)构造,并glScalef(...)在渲染之前使用适当缩放.我确实决定不进行预栅格化,因为用户可能会非常接近地放大(应用程序用于CAD),因此光栅工件将变得可见.
另外,由于场景很少超过几百个字符(主要是标签和测量),因此预光栅化的速度增益可以忽略不计.
我想将我的多边形沿着矢量投影到3d空间中的平面.我最好使用单个转换矩阵来做到这一点,但我不知道如何构建这种矩阵.
特定
goal -a 4x4转换矩阵,执行所需的投影,
要么
UPDATE
谢谢你的答案,它按预期工作.
发现这一点的人要注意:如果投影平面的平面与投影矢量平行,分母D将变为(几乎)0,所以为了避免发生奇怪的事情,对这种特殊情况进行某种处理需要.我通过检查D <1e-5来解决它,如果是这样,只需沿着挤压矢量转换我的多边形.
我正在两个库(Opencascade和DWF Toolkit)之上构建一个CAD文件转换器.
但是,我的问题是与平台无关:
鉴于:
我已经生成了一个网格作为三角形面的列表,形成了通过我的应用程序构建的模型.每个三角形由三个顶点定义,这三个顶点由三个浮点(x,y和z坐标)组成.由于三角形形成网格,因此大多数顶点由多于一个三角形共享.
目标:
我需要找到唯一顶点的列表,并生成一个由这个列表中的三个索引元组组成的面数组.
我想要做的是:
//step 1: build a list of unique vertices
for each triangle
for each vertex in triangle
if not vertex in listOfVertices
Add vertex to listOfVertices
//step 2: build a list of faces
for each triangle
for each vertex in triangle
Get Vertex Index From listOfvertices
AddToMap(vertex Index, triangle)
Run Code Online (Sandbox Code Playgroud)
虽然我有一个执行此操作的实现,但是步骤1(唯一顶点列表的生成)按O(n!)的顺序非常慢,因为每个顶点都与列表中已有的所有顶点进行比较.我想"嘿,让我们使用std :: map构建我的顶点组件的哈希映射,这应该加快速度!",只是发现从三个浮点值生成一个唯一键不是一项简单的任务.
在这里,stackoverflow的专家发挥作用:我需要某种哈希函数,它可以在3个浮点数上运行,或者从3d顶点位置生成唯一值的任何其他函数.
我想我需要在正确的方向上轻推:
我有两个相同数据类型的Tobjectlists,我想将这些连接到一个新列表中,list1将被复制(未修改),然后是list2(反向)
type
TMyListType = TobjectList<MyClass>
var
list1, list2, resList : TMyListtype
begin
FillListWithObjects(list1);
FillListWithOtherObjects(list2);
list2.reverse
//Now, I tried to use resList.Assign(list1, list2, laOr),
//but Tobjectlist has no Assign-Method. I would rather not want to
//iterate over all objects in my lists to fill the resList
end;
Run Code Online (Sandbox Code Playgroud)
delphi是否有任何内置函数将两个Tobjectlists合并为一个?
我有一个由线段和圆弧组成的折线轮廓,我想将其挤出为棱柱。
由于我的挤压函数只支持直边多边形,我需要使用线段来近似弧。
圆弧通过起点、中心点和扫掠角 (CCW) 定义。
我需要显示的扫角范围从 <10° 到 179.9°,半径范围从 0.3 毫米到 300 毫米。
我目前计算了一些弧顶点来计算并以原始方式将它们添加到我的多边形中:我只是在给定弧长的每一毫米上放置一个顶点。虽然这有效,但对于大半径和小扫掠角的弧似乎效率很低。
必须有一种算法可以为所有类型的弧生成良好的近似值。如果有的话,我想知道一些关键字来缩小我的谷歌搜索范围。
我希望为我工作的 CAD 应用程序实现缩放到鼠标位置和滚轮算法。
已经问过类似的问题(例如这个问题),但我发现的所有解决方案都使用了
方法。虽然这在原理上是有效的,但它会导致对象在高缩放级别上被剪掉,因为它们变得比观看量更大。更优雅的解决方案是修改缩放的投影矩阵。
我试图实现这一点,但只能缩放到工作窗口的中心。
glGetIntegerv(GL_VIEWPORT, @fViewport);
//convert window coordinates of the mouse to gl's coordinates
zoomtoxgl := mouse.zoomtox;
zoomtoygl := (fviewport[3] - (mouse.zoomtoy));
//set up projection matrix
glMatrixMode(GL_PROJECTION);
glLoadidentiy;
left := -width / 2 * scale;
right := width / 2 * scale;
top := height / 2 * scale;
bottom := -height / 2 * scale;
glOrtho(left, right, bottom, top, near, far);
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以在正交视图中单独使用投影矩阵对任意点执行缩放,如果可以,如何将缩放目标位置纳入投影矩阵?
更新 我将代码更改为
zoomtoxgl := camera.zoomtox;
zoomtoygl := (fviewport[3] - …Run Code Online (Sandbox Code Playgroud)