我一直在搞一些 3D 的东西(更具体地说是 LibGdx,但这对这个问题无关紧要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。
我生成的三角形网格具有以下顶点(也显示在下面的链接中):
v0 = [3 , 0 , 0] //X, Y, Z
v1 = [1.49 , 0.86 , 0] //X, Y, Z
v2 = [3 , 0 , -1] //X, Y, Z
为了计算三角形网格的面法线,我使用了一个可以在许多教程/示例网站中找到的函数(稍作修改):
private Vector3 calculateNormal(float vX1, float vY1, float vZ1,
浮动 vX2,浮动 vY2,浮动 vZ2,
浮动 vX3,浮动 vY3,浮动 vZ3) {
Vector3 edge1 = new Vector3(vX1, vY1, vZ1).sub(vX2, vY2, vZ2);
Vector3 edge2 = new Vector3(vX2, vY2, vZ2).sub(vX3, vY3, vZ3);
Vector3 crsProd = edge1.crs(edge2); // edge1 和 edge2 的叉积 … 所以我一直在尝试在JS中实现一个集合类型的类(类似于在C#中找到的List),它具有一些自定义功能.我也希望它有所优化(我已经阅读了一些关于如何正确使用JS Arrays的文章).所以我想我自己"如果我们没有为数组定义一个初始大小,我们不断向它添加对象,在内部它必须为每个插入分配一个新的大小,这必须很慢.我可以通过分配来避免这种情况我自己的新尺寸(改变阵列长度),有点类似于在CSharp中完成的尺寸,每当达到最大容量时尺寸加倍(我知道这不是微不足道但它是一个开始)"
我试图实现这个想法,发现它慢了(慢10倍):
//This simplified approach of my implementation is faster...
var array = [];
var counter = 0;
function addItem(newItem) {
array[++counter] = newItem;
}
//..than this version that resizes the array when a limit is reached
var array = [];
array.length = INITIAL_SIZE;
/*
Alternatively
var array = new Array(INITIAL_SIZE);
*/
var counter = 0;
function addItem(newItem) {
if( CheckCapacity(counter + 1) ) { //Function that checks if the maximum size is reached and if it is, change …Run Code Online (Sandbox Code Playgroud)