Javascript 为什么我的台词不是';不匹配?
编辑:显然,PI在JavaScript中是有限的(这很有意义)。但这给我留下了一个大问题。计算所需角度的下一个最佳方法是什么? 好的,首先,我的代码: 我在画一个120度角的立方体。 所以坐标是根据(h)8和θ(120)计算的 在第46行,我有一个for循环,其中包含一个用于创建行/列的嵌套for循环 这有点微妙,但我注意到线条并不完全匹配。计算每个立方体位置的代码在第49行。多维数据集原点的第一个参数(my x值)中的一个项处于禁用状态。有人能帮我弄清楚是什么吗Javascript 为什么我的台词不是';不匹配?,javascript,trigonometry,isometric,Javascript,Trigonometry,Isometric,编辑:显然,PI在JavaScript中是有限的(这很有意义)。但这给我留下了一个大问题。计算所需角度的下一个最佳方法是什么? 好的,首先,我的代码: 我在画一个120度角的立方体。 所以坐标是根据(h)8和θ(120)计算的 在第46行,我有一个for循环,其中包含一个用于创建行/列的嵌套for循环 这有点微妙,但我注意到线条并不完全匹配。计算每个立方体位置的代码在第49行。多维数据集原点的第一个参数(my x值)中的一个项处于禁用状态。有人能帮我弄清楚是什么吗 var cube = new
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相关的数学问题。这个数学理论上是正确的,但无法正确计算。我会接受这个缺陷,以免自己以非正统的方式重新编写代码。我可以告诉你,要想避免使用三角数学要花很多时间。有两个问题
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);
}
}
}
}