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, время: 09:26. |