Координаты круга в массив в Javascript

Как лучше всего добавить координаты круга в массив в JavaScript? Пока мне удалось сделать только полукруг, но мне нужна формула, которая возвращает весь круг в два разных массива: xValues и yValues. (Я пытаюсь получить координаты, чтобы анимировать объект вдоль пути.)

Вот что у меня есть на данный момент:

circle: function(radius, steps, centerX, centerY){
    var xValues = [centerX];
    var yValues = [centerY];
    for (var i = 1; i < steps; i++) {
        xValues[i] = (centerX + radius * Math.cos(Math.PI * i / steps-Math.PI/2));
        yValues[i] = (centerY + radius * Math.sin(Math.PI * i / steps-Math.PI/2));
   }
}

person VirtuosiMedia    schedule 30.09.2008    source источник
comment
Забавный факт: var π=Math.PI; — это синтаксически корректный JavaScript; затем вы можете обратиться к π с его фактическим символом, например, var x=radius*Math.cos(angle*180/π), y=radius*Math.sin(angle*180/π);   -  person ashleedawg    schedule 02.01.2020


Ответы (6)


Вместо этого ваш цикл должен быть настроен следующим образом:

for (var i = 0; i < steps; i++) {
    xValues[i] = (centerX + radius * Math.cos(2 * Math.PI * i / steps));
    yValues[i] = (centerY + radius * Math.sin(2 * Math.PI * i / steps));
}
  • Начните цикл с 0
  • Пройдитесь по всему диапазону 2 * PI, а не только по PI.
  • У вас не должно быть var xValues = [centerX]; var yValues = [centerY]; -- центр круга не является его частью.
person Ates Goral    schedule 01.10.2008
comment
Кроме того, я бы сначала сохранил вычисление фазы в локальной переменной: var phase = 2 * Math.PI * i / steps; - person Ates Goral; 04.06.2010
comment
как вы можете хранить фазу, если есть переменная «i»? - person Salvatore Di Fazio; 12.06.2019

Алгоритм Брезенхема намного быстрее. Вы слышали об этом в связи с рисованием прямых линий, но есть форма алгоритма для кругов.

Независимо от того, используете ли вы это или продолжаете расчеты триггеров (которые в наши дни невероятно быстры), вам нужно нарисовать только 1/8 круга. Поменяв местами x и y, вы можете получить еще 1/8, а затем отрицательное значение x, y и обоих — поменявших местами и не поменявших местами — дает вам очки для всего остального круга. Ускорение в 8 раз!

person DarenW    schedule 01.10.2008

Изменять:

Math.PI * i / steps

to:

2*Math.PI * i / steps

Полный круг составляет 2 пи радиан, и вы собираетесь только пи радиан.

person Greg Hewgill    schedule 01.10.2008

Если у вас уже есть половина круга, просто отразите точки, чтобы получить вторую половину
, убедитесь, что вы делаете это в правильном порядке.

более конкретно, для другой половины вы просто заменяете "+ sin(...)" на "- sin(...)"

person shoosh    schedule 30.09.2008

Вам нужно использовать частичную функцию для ввода радианов в cos и sin; поэтому возьмите значения, которые вы получаете для четверти или половины круга, и отразите их по оси центральных точек, чтобы получить полный круг.

Тем не менее, sin и cos JavaScript не так придирчивы, поэтому вы, должно быть, вдвое уменьшили свой радиан или что-то в этом роде; Я бы написал так:

function circle(radius, steps, centerX, centerY){
    var xValues = [centerX];
    var yValues = [centerY];
    var table="<tr><th>Step</th><th>X</th><th>Y</th></tr>";
    var ctx = document.getElementById("canvas").getContext("2d");
    ctx.fillStyle = "red"
    ctx.beginPath();
    for (var i = 0; i <= steps; i++) {
        var radian = (2*Math.PI) * (i/steps);
        xValues[i+1] = centerX + radius * Math.cos(radian);
        yValues[i+1] = centerY + radius * Math.sin(radian);
        if(0==i){ctx.moveTo(xValues[i+1],yValues[i+1]);}else{ctx.lineTo(xValues[i+1],yValues[i+1]);}
        table += "<tr><td>" + i + "</td><td>" + xValues[i+1] + "</td><td>" + yValues[i+1] + "</td></tr>";
    }
    ctx.fill();
    return table;
}
document.body.innerHTML="<canvas id=\"canvas\" width=\"300\" height=\"300\"></canvas><table id=\"table\"/>";
document.getElementById("table").innerHTML+=circle(150,15,150,150);

Я предположил, что по какой-то причине вы хотели, чтобы xValues[0] и yValues[0] были centerX и centerY. Я не могу понять, зачем вам это нужно, поскольку они уже являются значениями, переданными в функцию.

person dlamblin    schedule 01.10.2008

Я смог решить это самостоятельно, умножив количество шагов на 2:

circle: function(radius, steps, centerX, centerY){
    var xValues = [centerX];
    var yValues = [centerY];
    for (var i = 1; i < steps; i++) {
        xValues[i] = (centerX + radius * Math.cos(Math.PI * i / steps*2-Math.PI/2));
        yValues[i] = (centerY + radius * Math.sin(Math.PI * i / steps*2-Math.PI/2));
   }
}
person VirtuosiMedia    schedule 01.10.2008
comment
Обратите внимание, что это решение работает, но по другой причине, чем то, что вы указали. Вы сказали, что умножаете количество шагов на 2, но ваше выражение на самом деле означает: ((Math.PI * i)/steps)*2 из-за ассоциативности. - person Greg Hewgill; 01.10.2008