JavaScript与三角/椭圆

JavaScript与三角/椭圆,javascript,math,trigonometry,Javascript,Math,Trigonometry,我一直在使用这个椭圆函数(我在维基百科上找到的)在布局中绘制点。我一直在用两到五个点围绕一个椭圆形进行布局,没有任何问题。该函数有一个名为“steps”的参数;“步长”参数设置要围绕椭圆绘制的点的数量 这里有一个主要问题:如果“步骤”(要绘制的点数)等于数字7、11、13或14,它将中断。我学三角学已经有几年了,所以基本上我被卡住了 第二个小问题:我让代码打印出所有的点,但是当我复制/粘贴并删除多余的代码发布到这里时,它只打印出最后一个打印点(不确定为什么) var elipticalLayo

我一直在使用这个椭圆函数(我在维基百科上找到的)在布局中绘制点。我一直在用两到五个点围绕一个椭圆形进行布局,没有任何问题。该函数有一个名为“steps”的参数;“步长”参数设置要围绕椭圆绘制的点的数量

这里有一个主要问题:如果“步骤”(要绘制的点数)等于数字7、11、13或14,它将中断。我学三角学已经有几年了,所以基本上我被卡住了

第二个小问题:我让代码打印出所有的点,但是当我复制/粘贴并删除多余的代码发布到这里时,它只打印出最后一个打印点(不确定为什么)


var elipticalLayout=新数组();

对于(i=0;i而言,您只需填写ElitalLayout中的
步骤
元素数。 但是试着输出其中的36个

elipticalLayout[i/(360/步)][0]=X;
是错误的,因为由于
float
int
舍入,将导致序列中出现“孔”

你应该有这样的东西:

var n = 0;
for(...)
   elipticalLayout[n][0]=X;
   elipticalLayout[n][1]=Y;
   ++n;

您只需填写ElitalLayout中的
步骤
元素数。 但是试着输出其中的36个

elipticalLayout[i/(360/步)][0]=X;
是错误的,因为由于
float
int
舍入,将导致序列中出现“孔”

你应该有这样的东西:

var n = 0;
for(...)
   elipticalLayout[n][0]=X;
   elipticalLayout[n][1]=Y;
   ++n;

我会在函数中声明
elopticallayout
,并返回它。下面是我编写函数的方法

请注意,javascript中没有“双精度”甚至整数,变量的类型由其值定义。数字只是数字,可以是原语或数字对象(几乎从不需要)

如果您使用返回值以像素为单位绘制位置,您可能希望首先将它们舍入为整数。我使用了一种简单的截断方法将它们转换为整数

var elipticalLayout = [];

/*
* This functions returns an array containing the specified 
*    number of 'steps' (points) to draw an ellipse.
*
* @param x     - X coordinate
* @param y     - Y coordinate
* @param a     - Semimajor axis
* @param b     - Semiminor axis
* @param angle - Angle of the ellipse
*
* Attribution: This function is from http://en.wikipedia.org/wiki/Ellipse
*/
function calculateEllipticalLayout(x, y, a, b, angle, steps) {

  var points = [];
  var step = 360 / steps;
  var k = Math.PI/180;    // Convert deg to rad
  var cos = Math.cos;
  var sin = Math.sin;
  var i = 0;

  // Convert angle to radians
  var beta = -angle * k;
  var sinbeta = sin(beta);
  var cosbeta = cos(beta);

  while (i < 360) {

    var alpha = i * k;
    var sinalpha = sin(alpha);
    var cosalpha = cos(alpha);

    var X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
    var Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);

    // Truncate numbers to integer and put into array
    elipticalLayout.push([X|0, Y|0]);

    // Keep X,Y as floats
    // elipticalLayout.push([X, Y]);

    i += step;
  }
}
var elipticalLayout=[];
/*
*此函数返回一个包含指定
*绘制椭圆的“步数”(点)。
*
*@param x-x坐标
*@param y-y坐标
*@param a-半长轴
*@param b-半短轴
*@param angle-椭圆的角度
*
*属性:此函数来自http://en.wikipedia.org/wiki/Ellipse
*/
函数计算椭圆布局(x、y、a、b、角度、步长){
var点=[];
var步长=360/步;
var k=Math.PI/180;//将deg转换为rad
var cos=Math.cos;
var sin=Math.sin;
var i=0;
//将角度转换为弧度
varβ=-角度*k;
var sinbeta=sin(beta);
var cosbeta=cos(beta);
而(i<360){
varα=i*k;
var sinalpha=sin(alpha);
var cosapha=cos(alpha);
var X=X+(a*cosalpha*cosbeta-b*sinalpha*sinbeta);
变量Y=Y+(a*cosalpha*sinbeta+b*sinalpha*cosbeta);
//将数字截断为整数并放入数组
ElopticalLayout.push([X | 0,Y | 0]);
//保持X,Y为浮动
//ElopticalLayout.push([X,Y]);
i+=阶跃;
}
}

我将在函数中声明并返回它。下面是我编写函数的方法

请注意,javascript中没有“双精度”甚至整数,变量的类型由其值定义。数字只是数字,可以是原语或数字对象(几乎从不需要)

如果您使用返回值以像素为单位绘制位置,您可能希望首先将它们舍入为整数。我使用了一种简单的截断方法将它们转换为整数

var elipticalLayout = [];

/*
* This functions returns an array containing the specified 
*    number of 'steps' (points) to draw an ellipse.
*
* @param x     - X coordinate
* @param y     - Y coordinate
* @param a     - Semimajor axis
* @param b     - Semiminor axis
* @param angle - Angle of the ellipse
*
* Attribution: This function is from http://en.wikipedia.org/wiki/Ellipse
*/
function calculateEllipticalLayout(x, y, a, b, angle, steps) {

  var points = [];
  var step = 360 / steps;
  var k = Math.PI/180;    // Convert deg to rad
  var cos = Math.cos;
  var sin = Math.sin;
  var i = 0;

  // Convert angle to radians
  var beta = -angle * k;
  var sinbeta = sin(beta);
  var cosbeta = cos(beta);

  while (i < 360) {

    var alpha = i * k;
    var sinalpha = sin(alpha);
    var cosalpha = cos(alpha);

    var X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
    var Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);

    // Truncate numbers to integer and put into array
    elipticalLayout.push([X|0, Y|0]);

    // Keep X,Y as floats
    // elipticalLayout.push([X, Y]);

    i += step;
  }
}
var elipticalLayout=[];
/*
*此函数返回一个包含指定
*绘制椭圆的“步数”(点)。
*
*@param x-x坐标
*@param y-y坐标
*@param a-半长轴
*@param b-半短轴
*@param angle-椭圆的角度
*
*属性:此函数来自http://en.wikipedia.org/wiki/Ellipse
*/
函数计算椭圆布局(x、y、a、b、角度、步长){
var点=[];
var步长=360/步;
var k=Math.PI/180;//将deg转换为rad
var cos=Math.cos;
var sin=Math.sin;
var i=0;
//将角度转换为弧度
varβ=-角度*k;
var sinbeta=sin(beta);
var cosbeta=cos(beta);
而(i<360){
varα=i*k;
var sinalpha=sin(alpha);
var cosapha=cos(alpha);
var X=X+(a*cosalpha*cosbeta-b*sinalpha*sinbeta);
变量Y=Y+(a*cosalpha*sinbeta+b*sinalpha*cosbeta);
//将数字截断为整数并放入数组
ElopticalLayout.push([X | 0,Y | 0]);
//保持X,Y为浮动
//ElopticalLayout.push([X,Y]);
i+=阶跃;
}
}

我会考虑的;谢谢。关于阵列,阵列被反复用于布置不同数量的点的不同椭圆。我一直在跟踪步数(点),因此阵列大于实际点数这一事实不是问题(虽然我意识到这不是一个简单的解决方案,但我不认为数组的大小是一个问题)。我会考虑这个问题;谢谢。关于数组,数组被反复用于布置不同数量的点的不同椭圆。我一直在跟踪步数(点),因此阵列大于实际点的数量这一事实并不是问题(尽管我意识到这不是一个简单的解决方案,但我不认为阵列的大小是一个问题)。