小编sum*_*ame的帖子

浮点除法与浮点乘法

通过编码是否有任何(非微优化)性能增益

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 从评论中引用:

[我想]知道什么是算法/架构要求导致>除法在硬件上比复制要复杂得多

c++ floating-point micro-optimization

67
推荐指数
5
解决办法
5万
查看次数

GUID的高效数据结构

我正在寻找一种数据结构,这使我能够快速(优先O(1) - 快速)确定给定的GUID是否是GUID集合的成员.

我目前的方法是使用带有0作为值的TDictionary.

虽然这很快就能起作用,但使用Hashmap来重新定义GUID似乎是一种浪费,GUID通过定义被认为是唯一的,并且使Dictionary处理不需要的值.

必须有一个更好的解决方案,但我找不到一个.你能?

delphi guid unique delphi-2010 data-structures

12
推荐指数
2
解决办法
1130
查看次数

Delphi麻烦:排序Tobjectlist <>

我想使用内置的排序方法对我的通用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 - 你们中的任何人都有洞察力分享这个吗?

delphi sorting generics tobjectlist delphi-2010

8
推荐指数
2
解决办法
8359
查看次数

Delphi - Reverse Lookup'包括这个单位'

我正在调试分布在许多单元上的大型应用程序.我在低级单元中遇到了编译错误,并且对于引用此单元的应用程序的哪个部分没有任何想法.有没有办法使用RAD studio 2010的IDE来创建某种包含图?

由于大多数使用的单位不是项目的一部分并且分布在相当多的分支源树上,我不能简单地使用"在文件中查找"选项.

我目前正在使用search-in-files-utility遍历我的树,但这很麻烦.

你知道更优雅的方式吗?开发在Embercadero RAD studio 2010,Windows XP 32.

delphi

7
推荐指数
2
解决办法
1171
查看次数

opengl中的多语言Unicode渲染

我必须扩展一个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),因此光栅工件将变得可见.

另外,由于场景很少超过几百个字符(主要是标签和测量),因此预光栅化的速度增益可以忽略不计.

delphi opengl unicode winapi

7
推荐指数
1
解决办法
1505
查看次数

如何在三维空间中的平面上投影平面多边形

我想将我的多边形沿着矢量投影到3d空间中的平面.我最好使用单个转换矩阵来做到这一点,但我不知道如何构建这种矩阵.

特定

  • 飞机的参数(ax + by + cz + d),
  • 我的Polygon的世界坐标.如标题中所述,我的多边形的所有顶点都位于另一个平面中.
  • 投影我的多边形的方向向量(当前是多边形平面的法线向量)

goal -a 4x4转换矩阵,执行所需的投影,

要么

  • 关于如何自己构建一个的一些见解

UPDATE

谢谢你的答案,它按预期工作.

发现这一点的人要注意:如果投影平面的平面与投影矢量平行,分母D将变为(几乎)0,所以为了避免发生奇怪的事情,对这种特殊情况进行某种处理需要.我通过检查D <1e-5来解决它,如果是这样,只需沿着挤压矢量转换我的多边形.

math 3d geometry projection projective-geometry

7
推荐指数
1
解决办法
4954
查看次数

从'三角汤'中找到独特的顶点

我正在两个库(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顶点位置生成唯一值的任何其他函数.

c++ algorithm geometry

6
推荐指数
1
解决办法
3611
查看次数

关于加入TObjectlists

我想我需要在正确的方向上轻推:

我有两个相同数据类型的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合并为一个?

delphi generics concatenation tobjectlist delphi-2010

5
推荐指数
1
解决办法
1502
查看次数

如何使用线段创建二维弧的近似值?

我有一个由线段和圆弧组成的折线轮廓,我想将其挤出为棱柱。

由于我的挤压函数只支持直边多边形,我需要使用线段来近似弧。

圆弧通过起点、中心点和扫掠角 (CCW) 定义。

我需要显示的扫角范围从 <10° 到 179.9°,半径范围从 0.3 毫米到 300 毫米。

我目前计算了一些弧顶点来计算并以原始方式将它们添加到我的多边形中:我只是在给定弧长的每一毫米上放置一个顶点。虽然这有效,但对于大半径和小扫掠角的弧似乎效率很低。

必须有一种算法可以为所有类型的弧生成良好的近似值。如果有的话,我想知道一些关键字来缩小我的谷歌搜索范围。

delphi geometry 2d approximation delphi-2010

5
推荐指数
1
解决办法
1163
查看次数

在 OpenGL 中放大鼠标位置

我希望为我工作的 CAD 应用程序实现缩放到鼠标位置和滚轮算法。

已经问过类似的问题(例如这个问题),但我发现的所有解决方案都使用了

  1. 翻译成原点
  2. 按比例缩放
  3. 翻译回来

方法。虽然这在原理上是有效的,但它会导致对象在高缩放级别上被剪掉,因为它们变得比观看量更大。更优雅的解决方案是修改缩放的投影矩阵。

我试图实现这一点,但只能缩放到工作窗口的中心。

 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)

opengl math zooming

5
推荐指数
1
解决办法
1万
查看次数