Окружать координаты массива в 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));
   }
}

Ответ 1

Вместо этого вместо этого нужно настроить этот цикл:

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]; - центр круга не является его частью.

Ответ 2

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

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

Ответ 3

Изменить:

Math.PI * i / steps

в

2*Math.PI * i / steps

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

Ответ 4

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

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

Ответ 5

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

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

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] были центром X и центром Y. Я не могу понять, зачем вам это нужно, поскольку они уже переданы в функцию.

Ответ 6

Я смог решить это самостоятельно, умножив количество шагов на 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));
   }
}