首页 > 解决方案 > 意外的空数组

问题描述

对于冗长的代码感到抱歉,但我没有设法制作一个重现问题的最小示例。正如预期的那样,以下函数返回的两个数组的每个单元格都包含一个数字:

function VNtorus(R, r, nx, ny) {
    var Vertices = new Array(nx);
    var Normals = new Array(nx);
    for (var i = 0; i < nx; i++) {
        Vertices[i] = new Array(ny);
        Normals[i] = new Array(ny);
        var u = i / nx * 2 * Math.PI;
        var cos_u = Math.cos(u);
        var sin_u = Math.sin(u);
        var cx = R * cos_u;
        var cy = R * sin_u;
        for (var j = 0; j < ny; j++) {
            var v = j / ny * 2 * Math.PI;
            var rcos_v = r * Math.cos(v);
            var rsin_v = r * Math.sin(v);
            Vertices[i][j] = new THREE.Vector3(
                cx + rcos_v * cos_u,
                cy + rcos_v * sin_u,
                rsin_v
            );
            Normals[i][j] = new THREE.Vector3(
                rcos_v * cos_u,
                rcos_v * sin_u,
                rsin_v
            );
        }
    }
    return {
        vertices : Vertices,
        normals : Normals
    }
}

如果你愿意,这段代码的上下文在这里:Cannot render a mesh with THREE js

但是,当我如下调用此函数时,对于两个结果数组,第一个数组为空:

var a = 3; var c = 0.7; var mu = 1.7;
var b = Math.sqrt(a * a - c * c);
var bb = b * Math.sqrt(mu * mu - c * c);
var omega = (a * mu + bb) / c;
var Omega = new THREE.Vector3(omega, 0, 0)
var inversion = function (M) {
    var OmegaM = Omega.sub(M);
    var k = OmegaM.dot(OmegaM);
    return Omega.addScaledVector(OmegaM, k);
}
var d = (a - c) * (mu - c) + bb;
var r = c * c * (mu - c) / ((a + c) * (mu - c) + bb) / d;
var R = c * c * (a - c) / ((a - c) * (mu + c) + bb) / d;
var omegaT = omega - (b * b * (omega - c)) /
    ((a - c) * (mu + omega) - b * b) / ((a + c) * (omega - c) + b * b);
var tmesh = VNtorus(10, 3, 64, 32);
var tvertices = tmesh.vertices;
var tnormals = tmesh.normals;
console.log(tvertices)
// ...

0: Array(32)
length: 32
__proto__: Array(0)
1: Array(32)
0: p {x: 0.008700136926854488, y: 0.0008568886953253847, z: 0}
1: p {x: 0.008532966235351477, y: 0.0008404238193190658, z: 0.0017055250840917766}
....

我真的迷路了。我不是 Javascript 方面的专家,我可能在某个地方犯了一个新手错误。

标签: javascriptthree.js

解决方案


我使用 jquery.mon.js 和 three.js 为您创建了一个代码片段,单击按钮时我正在调用您的代码,它正在为我生成包含 64 个元素的数组。

您可能想要验证您的 three.js CDN。

(64) [Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32), Array(32)]

function myFunction(elmnt, clr) {
            var a = 3; var c = 0.7; var mu = 1.7;
            var b = Math.sqrt(a * a - c * c);
            var bb = b * Math.sqrt(mu * mu - c * c);
            var omega = (a * mu + bb) / c;
            var Omega = new THREE.Vector3(omega, 0, 0)
            var inversion = function (M) {
                var OmegaM = Omega.sub(M);
                var k = OmegaM.dot(OmegaM);
                return Omega.addScaledVector(OmegaM, k);
            }
            var d = (a - c) * (mu - c) + bb;
            var r = c * c * (mu - c) / ((a + c) * (mu - c) + bb) / d;
            var R = c * c * (a - c) / ((a - c) * (mu + c) + bb) / d;
            var omegaT = omega - (b * b * (omega - c)) /
                ((a - c) * (mu + omega) - b * b) / ((a + c) * (omega - c) + b * b);
            var tmesh = VNtorus(10, 3, 64, 32);
            var tvertices = tmesh.vertices;
            var tnormals = tmesh.normals;
            console.log(tvertices)
        }

        function VNtorus(R, r, nx, ny) {
            var Vertices = new Array(nx);
            var Normals = new Array(nx);
            for (var i = 0; i < nx; i++) {
                Vertices[i] = new Array(ny);
                Normals[i] = new Array(ny);
                var u = i / nx * 2 * Math.PI;
                var cos_u = Math.cos(u);
                var sin_u = Math.sin(u);
                var cx = R * cos_u;
                var cy = R * sin_u;
                for (var j = 0; j < ny; j++) {
                    var v = j / ny * 2 * Math.PI;
                    var rcos_v = r * Math.cos(v);
                    var rsin_v = r * Math.sin(v);
                    Vertices[i][j] = new THREE.Vector3(
                        cx + rcos_v * cos_u,
                        cy + rcos_v * sin_u,
                        rsin_v
                    );
                    Normals[i][j] = new THREE.Vector3(
                        rcos_v * cos_u,
                        rcos_v * sin_u,
                        rsin_v
                    );
                }
            }
            return {
                vertices: Vertices,
                normals: Normals
            }
        }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
 <script src="https://threejs.org/build/three.js"></script>
 <button onclick="myFunction()">Click me</button </body> </body> </html>


推荐阅读