canvas и метод arc
не совсем пойму как работает метод arc обьекта CanvasRenderingContext2D
как я понял исходя из статьи https://developer.mozilla.org/ru/doc...B3%D1%83%D1%80 и еще нескольких других ctx.arc(x, y , radius ,startAngle,endAngle);
<!DOCTYPE HTML>
<html>
<head>
<style>
canvas {
border:1px solid black;
}
</style>
</head>
<body>
<canvas width="500" height="500" id="canvas"></canvas>
<script>
var canva = document.getElementById("canvas");
var ctx = canva.getContext("2d");
ctx.arc(170,170, 50, 0 , 180);
ctx.fill();
</script>
</body>
</html>
проблема именно с параметрами startAngle и endAngle , если startAngle = 0 , а endAngle = 360 - то это будет круг , а если endAngle = 180 - то это полу-круг . Но как бы я не менял параметр endAngle все равно рисует круг. Где я туплю? |
cyber,
углы в радианах а не в градусах радианы = (Math.PI/180)*градусы |
dmitriymar,
черт точно, за втыкал, спасибо. |
хм.. , еще не совсем понятно, почему рисует именно с правого края?
<!DOCTYPE HTML>
<html>
<head>
<style>
canvas {
border:1px solid black;
}
</style>
</head>
<body>
<canvas width="500" height="500" id="canvas"></canvas>
<script>
var canva = document.getElementById("canvas");
var ctx = canva.getContext("2d");
ctx.width = 500;
ctx.height = 500;
var up = 360/60, angle = 0;
!function timer() {
if(angle == 360) return;
angle += up;
ctx.fillStyle = "red";
ctx.arc(100,100, 40, 0,(Math.PI/180)* angle);
ctx.fill();
ctx.beginPath();
setTimeout(timer,60);
}();
</script>
</body>
</html>
|
Цитата:
|
melky, 0,0 находиться по центру.
|
melky,
<!DOCTYPE HTML>
<html>
<head>
<style>
canvas {
border:1px solid black;
}
</style>
</head>
<body>
<canvas width="500" height="500" id="canvas"></canvas>
<script>
var canva = document.getElementById("canvas");
var ctx = canva.getContext("2d");
ctx.width = 500;
ctx.height = 500;
var radius = 40;
ctx.arc(100,0,radius,0 , (Math.PI/180)* 360);
ctx.fill();
ctx.beginPath();
ctx.arc(200,radius,radius,0 , (Math.PI/180)* 360);
ctx.fill();
ctx.beginPath();
</script>
</body>
</html>
если бы он был с лева в верху то мне можно было смело идти переписывать 70% логики моего арканоида) |
cyber,
Сделай мячик спрайтом и не ипи себе мозг. =) BTW, указывай параметр anticlockwise, пожалуйста, а то не везде без него работает. |
Цитата:
|
Дзен-трансгуманист, да с мячиком проблема нет, просто хотел сделать анимацию загрузки таким вот извращенным способом но почему она видет себя так понять не могу.
А насчет параметра anticlockwise - яего указываю просто тестовый пример по быстрому писался ,как всегда.) |
Цитата:
надеюсь, картинка прояснит : ![]() немного поменял твой код - рисуется окружность в (0;0) Цитата:
Цитата:
Цитата:
|
melky, почитай спецификацию;)
|
melky,это не спецификация но все же https://developer.mozilla.org/ru/doc...B3%D1%83%D1%80
Цитата:
|
Цитата:
Цитата:
что почитать то? Цитата:
|
melky, для обычных дом элементов да, но не для круга на canvas , метод arc:
Цитата:
|
Цитата:
|
melky, и в посте 11 той код прикрасно доказывает что координаты задаются от центра круга.
|
Цитата:
<!DOCTYPE HTML>
<html>
<head>
<style>
canvas { border: 1px solid black; }
</style>
<script>
onload = function () {
var canva = document.getElementById("canvas");
var ctx = canva.getContext("2d");
*!*
ctx.translate(canva.width / 2, canva.height / 2);
*/!*
ctx.arc(0, 0, 40, 0, (Math.PI / 180) * 360, true);
ctx.fill();
}
</script>
</head>
<body>
<canvas width="500" height="500" id="canvas"></canvas>
</body>
</html>
melky, cyber пытается сказать тебе, что точка (0, 0) в arc будет в фокусе дуги, а не слева сверху от нее.) Вам надо поработать над взаимопониманием.) |
Цитата:
Окей, не уверен, какого ты хотел достичь эффекта, но например вот:
<!DOCTYPE HTML>
<html>
<head>
<style>
canvas { border: 1px solid black; }
</style>
<script>
function progressFn ( canvas ) {
var ctx = canvas.getContext( "2d" );
var cx = canvas.width / 2;
var cy = canvas.height / 2;
var radius = 50;
var clearX = Math.floor( cx - radius );
var clearY = Math.floor( cy - radius );
var clearW = Math.ceil( cx + radius ) - clearX;
var clearH = Math.ceil( cy + radius ) - clearY;
return function ( progress ) {
ctx.clearRect( clearX, clearY, clearW, clearH );
ctx.save();
ctx.globalCompositeOperation = "source-over";
ctx.fillStyle = "hsl(120, 80%, 25%)";
ctx.moveTo( cx, cy );
ctx.arc( cx, cy, radius, 0, Math.PI * 2 * progress, false );
ctx.fill();
ctx.globalCompositeOperation = "xor";
ctx.font = "bold 20px sans-serif";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText( ( progress * 100 ).toFixed( 0 ) + "%", cx, cy );
ctx.restore();
}
}
window.onload = function () {
var progress = 0;
var progressMax = 100;
var showProgress = progressFn( document.getElementById( "canvas" ) );
var interval = setInterval( function () {
showProgress( progress / progressMax );
if ( ++progress > progressMax ) {
clearInterval( interval );
}
}, 50);
}
</script>
</head>
<body>
<canvas width="200" height="200" id="canvas"></canvas>
</body>
</html>
|
Дзен-трансгуманист,тут суть не в том что я не могу анимацию сделать, мне просто интересно почему именно от туда начинаеться и как можно поменять точку начала рисования..
|
Цитата:
А спецификацию? Неужели ни то, ни другое? |
Цитата:
Цитата:
Будь добр, когда спрашиваешь о чем-то - не игнорируй ссылки, которые тебе дают. |
Дзен-трансгуманист, сори, весь день седня на тормозе...
|
cyber,
Спеку по Canvas 2D Context реально осилить за 3 дня, если все прочитываемое пробовать сразу же на практике. То есть, это конечно не значит, что за 3 дня ты всё это впечатаешь себе в мозг как азбуку, но по крайней мере будешь понимать, что к чему и почему. Ну и, извини конечно, но даже школьнику должно быть известно, что 0° - это вперед по оси X, 90° - вперед по оси Y, и т.д. Везде и всегда так было, а не только в канвасе. :) |
Дзен-трансгуманист, я знаю говорю же на тормозе был, седня буду в спеке дальше разбираться.
|
ответ попроще на самом деле . сектор круга это не 0 - 2PI , а -PI - +PI как и во всех тригонометрических операциях языка
|
Дзен-трансгуманист, спасибо твой код помог(особенно moveTo как то не додумался до этого), я вчера жестоко тупил и не пойму с какого перепугу мне вчера казалось что 0 градусов этой прямой угол, в данный момент я понимаю нужно начинать с -90 градусов, но вчера меня жестоко плющило (просто почти не спал вчера).
ctx.arc(150,150,40, -(Math.PI/180)*90,(Math.PI/180)*i,false);
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<canvas width="500" height="500"></canvas>
<script>
var canva = document.body.children[0];
var ctx = canva.getContext("2d");
var i = -90;
!function drawArc() {
if(i>270)return;
ctx.clearRect(110,110,80,80);
ctx.moveTo( 150, 150 );
ctx.arc(150,150,40, -(Math.PI/180)*90,(Math.PI/180)*i,false);
ctx.fill();
ctx.beginPath();
i+=5;
setTimeout(drawArc,60)
}();
</script>
</body>
</html>
|
может кто то подкинет идейку, осталось в игре до пилить так что бы проверялись координаты мячика а не его крайняя точка по х , т.е
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<canvas width="500" height="500"></canvas>
<script>
var canva = document.body.children[0];
var ctx = canva.getContext("2d");
ctx.fillStyle = "green";
ctx.strokeRect(50,50,100,100);
ctx.beginPath();
ctx.fillStyle="red";
ctx.arc(100,100,50,0,(Math.PI/180)*360, false);
ctx.fill();
ctx.beginPath();
</script>
</body>
</html>
в данный момент сделано так что к х прибавляется или отнимается радиус но так не красиво выглядит когда мячик пролетает очень близко , а условие срабатывает из за того что зацепился углом, не могу придумать как сделать так что проверялись координаты мяча без учета пустого пространства. Может кто подкинет идейку? |
Цитата:
var radius = 10; // радиус окружности var center = [ 5, 5 ]; // точка центра окружности var point = [ 0, 0 ]; // точка, принадлежность которой определяем // координаты вектора из точки к центру окружности var x = point[0] - center[0]; var y = point[1] - center[1]; // модуль этого вектора var distance = Math.sqrt(x*x + y*y); // принадлежит ли (bool) var belongs = distance <= radius; |
melky, так как шарик может быть в нескольких строках сразу то нужно определить растояние от центра верхней точки ( к примеру) или нижней
![]() |
melky, опять спустя день понял в чем фишка, спс.
На ночь лучше не думать и не писать) |
блин, запутался шарик может столкнуться с блоком в любой его точке, а так как мячик может находиться на нескольких строках одновременно
поэтому есть вариант: проверять все точки окружность которые находятся в данной точке на совпадения с координатами блока, но как их получать за кэшировать или каждый раз определять... ![]() буду благодарен за любые подсказки... |
cyber,
В случае с шариком, коллизии и углы отражения становится считать легче, если на уровне логики движка принять шарик за материальную точку, а фигуры расширить радиально на величину радиуса шарика. ![]() |
cyber, опять постишь на ночь? или это я уже туплю .. при чём тут строки? что это? почему нельзя определять принадлежность каждой крайней точки (top left; top right; bottom left; bottom right) к окружности (шарику) ?
|
melky, шарик может не только с крайней точкой соприкоснуться а и в любом другом месте допустим он зацепит нижней частью блок , вот 2 варианта
![]() и тогда прийдеться проверять все точки вокруг блока.. |
Дзен-трансгуманист, не совсем понял, если их разширить то тогда шарик будет на фигуре то будет ее затирать по ходу смещения, а если увеличить просто размеры обьектов то он начнет их уничтожать до визуального контакта..
|
cyber,
Да нет же! Для игрока всё визуально остается без изменений. Я просто иллюстрирую как должен выглядеть механизм обработки столкновений изнутри. ![]() Столкновения с углами - самые сложные. Я тебе специально изобразил эту механическую симметрию. Там, где ты видишь скругления - это просто окружности, центр каждой из которых находится в одном из исходных углов, и три четверти которых скрыты под внешними горизонтальными и вертикальными отрезками. Когда точка падает на такую окружность, отражение легко посчитать: нужно просто вычислить направление нормали (радиус-вектора) в точке соприкосновения, обратить направление падения и зеркально отразить его от нормали. Касательную я изобразил просто для наглядности принципа, известного как "угол отражения равен углу падения". А нормаль выходит наружу под прямым углом к этой касательной, то есть это просто вектор, направленный из центра окружности к нашей точке в момент их столкновения. Вот. А теперь докажи мне на практике, что мои труды по рисованию не были бесполезны - а не то я разозлюсь и сделаю свой собственный арканоид! :) |
Дзен-трансгуманист, спасибо, буду вспоминать геометрию
Цитата:
|
Цитата:
Супер-оптимизаций никто от тебя не требует, просто организуй всё так, чтобы хотя бы не тормозило.)) |
Цитата:
классный ресурс, кстати |
| Часовой пояс GMT +3, время: 03:52. |