Обведите координаты массива в Javascript - PullRequest
12 голосов
/ 01 октября 2008

Какой лучший способ добавить координаты круга в массив в 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));
   }
}

Ответы [ 6 ]

21 голосов
/ 01 октября 2008

Ваш цикл должен быть настроен так:

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

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

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

5 голосов
/ 01 октября 2008

Изменение:

Math.PI * i / steps

до:

2*Math.PI * i / steps

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

1 голос
/ 01 октября 2008

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

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

1 голос
/ 01 октября 2008

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

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

0 голосов
/ 01 октября 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));
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...