Javascript 为什么我的台词不是';不匹配?

Javascript 为什么我的台词不是';不匹配?,javascript,trigonometry,isometric,Javascript,Trigonometry,Isometric,编辑:显然,PI在JavaScript中是有限的(这很有意义)。但这给我留下了一个大问题。计算所需角度的下一个最佳方法是什么? 好的,首先,我的代码: 我在画一个120度角的立方体。 所以坐标是根据(h)8和θ(120)计算的 在第46行,我有一个for循环,其中包含一个用于创建行/列的嵌套for循环 这有点微妙,但我注意到线条并不完全匹配。计算每个立方体位置的代码在第49行。多维数据集原点的第一个参数(my x值)中的一个项处于禁用状态。有人能帮我弄清楚是什么吗 var cube = new

编辑:显然,PI在JavaScript中是有限的(这很有意义)。但这给我留下了一个大问题。计算所需角度的下一个最佳方法是什么?

好的,首先,我的代码:

我在画一个120度角的立方体。 所以坐标是根据(h)8和θ(120)计算的

在第46行,我有一个for循环,其中包含一个用于创建行/列的嵌套for循环

这有点微妙,但我注意到线条并不完全匹配。计算每个立方体位置的代码在第49行。多维数据集原点的第一个参数(my x值)中的一个项处于禁用状态。有人能帮我弄清楚是什么吗

var cube = new Cube(
            origin.x + (j * -w * (Math.PI)) +
            (i * w * (Math.PI))
            , origin.y + j * (h / 2) +
            i * (h / 2) +
            (-k*h), h);
对不起,如果这让人困惑的话。一、 j和k表示由for循环递增的变量。所以基本上是一个三维的for循环

我认为问题在于数学。 宽度不是问题,至少我相信是这样。我最初使用的是3.2(我不知怎么猜到了,它似乎排得很好。但我不知道这个神奇的数字是什么)。我猜这与角度转换成弧度有关,但我不明白为什么Math.PI/180不是解决方案。我尝试了很多东西。60(以度为单位)*Math.PI/180不起作用。这是干什么用的


编辑:这可能只是一个与JavaScript相关的数学问题。这个数学理论上是正确的,但无法正确计算。我会接受这个缺陷,以免自己以非正统的方式重新编写代码。我可以告诉你,要想避免使用三角数学要花很多时间。

有两个问题

  • 将第35行更改为
    var w=h*Math.sin(30)。此处的
    30
    多维数据集中的
    this.theta/4
    方法相匹配,因为
    this.theta
    等于120

  • 使用以下代码生成新多维数据集的位置。您不需要
    Math.Pi
    。您需要在计算中同时使用立方体的宽度和高度

    var cube = new Cube(
        origin.x+ -j*w - i*h,
        origin.y + -j*w/2 + i*h/2,
        h);
    

  • 好吧,我找到了解决办法! 这真的很简单——我用的是度而不是弧度

    function Cube(x, y, h) {
    this.x = x
    this.y = y
    this.h = h;
    this.theta = 120*Math.PI/180;
    
    this.getWidth = function () {
        return (this.h * Math.sin(this.theta / 2));
    };
    this.width = this.getWidth();
    
    this.getCorner = function () {
        return  (this.h / 2);
    };
    this.corner = this.getCorner();
    
    }

    显然Javascript trig函数使用弧度,这是一个问题。 我做的下一个修正是立方体中每个点的偏移量。它不需要一个!(o.o idk为什么。但不管它如何工作。我留下了旧代码,以防以后发现原因)

    函数绘图(){
    var canvas=document.getElementById(“canvas”);
    var ctx=canvas.getContext(“2d”);
    ctx.fillStyle=“#000”;
    ctx.fillRect(0,0,canvas.width,canvas.height);//绘制一个黑色画布
    var h=32;
    变量宽度=Math.sin(60*Math.PI/180);
    var w=h*宽度;
    var row=9;//列和行将始终相同(以生成多维数据集)
    var列=行;
    var区域=行*列;
    var高度=1;
    行--;
    列--;
    高度--;
    变量原点={
    x:canvas.width/2,
    y:(canvas.height/2)-(h*列/2)+高度*h
    };
    var偏移=数学sqrt(3)/2;
    偏移量=1;
    
    对于(var i=0;我尝试了你的建议,但它们似乎不太管用。此外,我添加了一个新的因素-整个立方体平台的高度。(不要与立方体的高度混淆)。更新代码:1。刚刚记住,那里的宽度实际上是对角线的一半。整个对角线宽度(因此立方体的宽度)是h*sin(60).2.我这样做了,它做了一个奇怪的楼梯外观的东西。它真的很酷,虽然XD
     function draw() {
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.fillStyle = "#000";
    ctx.fillRect(0, 0, canvas.width, canvas.height); // Draw a black canvas
    
    var h = 32;
    
    var width = Math.sin(60*Math.PI/180);
    var w = h*width;
    
    var row = 9; // column and row will always be same (to make cube)
    
    var column = row;
    var area = row * column;
    var height = 1;
    
    row--;
    column--;
    height--;
    
    var origin = {
        x: canvas.width / 2,
        y: (canvas.height / 2) - (h * column/2) + height*h
    };
    
    var offset = Math.sqrt(3)/2;
    offset = 1;
    
    for (var i = 0; i <= row; i++) {
        for (var j = 0; j <= column; j++) {
            for (var k = 0; k <= height; k++) {
    
            var cube = new Cube(
                origin.x + (j * -w * offset) +
                (i * w * offset)
                , origin.y + (j * (h / 2) * offset) +
                (i * (h / 2) * offset) +
                (-k*h*offset), h);
                var cubes = {};  
            cubes[i+j+k] = cube; // Store to array
    
            if (j == column) {
                drawCube(2, cube);
            }
    
            if (i == row) {
                drawCube(1, cube);
            }
    
            if (k == height) {
            drawCube(0,cube);
            }
    
            }
        }
    }