Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   угол отражения в окружности (http://www.flasher.ru/forum/showthread.php?t=174702)

Wadimir 31.01.2012 14:52

угол отражения в окружности
 
Добрый день!
Столкнулся с проблемой. Есть окружность. Внутри окружности летает шарик. Когда шарик ударяется об стену он отлетает на какой то угол. Как найти этот угол отражения?

Genzo 31.01.2012 15:00

Под каким углом он ударяется к касательной в точке соприкосновения, под таким и отлетит. Наверное)))

elder_Nosferatu 31.01.2012 15:20

Вложений: 1
Вложение 27519

Если не описываете физику всего происходящего (как минимум действие дессипативных сил на идеально упригий шарик и идеально упругую "скоролупу"), то картинкой вполне обойдетесь.

Wadimir 31.01.2012 15:37

картинку я и сам понимаю как нарисовать, как это общитать?

Genzo 31.01.2012 15:44

Код движения в студию

Hauts 31.01.2012 15:52

Эх, нечасто я в разделе про as3 пишу :)

Код AS3:

import flash.display.Graphics;
 
var temp:Sprite = new Sprite();
addChild(temp);
var areaRadius:int = 180;
var areaCenterX:int = 275;
var areaCenterY:int = 200;
var ballRadius = 20;
var ball:Object = {};
ball.x = areaCenterX + 90;
ball.y = areaCenterY;
 
var ballSpeed:Number = 20;
var randomAngle:Number = 90 * Math.PI / 180;
ball.vx = Math.cos(randomAngle) * ballSpeed;
ball.vy = Math.sin(randomAngle) * ballSpeed;
 
var hitDistance:int = areaRadius - ballRadius;
 
var g:Graphics = this.graphics;
g.lineStyle(1,0xFF0000,1);
g.drawCircle(areaCenterX,areaCenterY,areaRadius);
 
var ballSprite:Sprite = new Sprite();
ballSprite.graphics.lineStyle(1,0x00FF00,1);
ballSprite.graphics.drawCircle(0,0,ballRadius);
 
 
addChild(ballSprite);
 
function step(e:Event = null):void {
 
        var newX:Number = ball.x + ball.vx;
        var newY:Number = ball.y + ball.vy;
 
        var dx:Number = (newX - areaCenterX);
        var dy:Number = (newY - areaCenterY);
        var distance:Number = Math.sqrt(dx * dx + dy * dy);
        if (distance >= hitDistance) {
 
                var ballAngle:Number = Math.atan2(ball.vy,ball.vx);
                var hitX:Number = hitDistance * Math.cos(ballAngle);
                var hitY:Number = hitDistance * Math.sin(ballAngle);
                var hitAngle:Number = Math.atan2(newY - areaCenterY,newX - areaCenterX);
                var bounceAngle:Number = ballAngle+2* (hitAngle - ballAngle);
 
                temp.graphics.clear();
                temp.graphics.lineStyle(1,0xFF00FF,1);
                temp.graphics.moveTo(newX, newY);
                temp.graphics.lineTo(newX + Math.cos(bounceAngle) * 200, newY + Math.sin(bounceAngle) * 200);
 
                ball.vx = ballSpeed *  -  Math.cos(bounceAngle);
                ball.vy = ballSpeed *  -  Math.sin(bounceAngle);
        }
 
        ball.x +=  ball.vx;
        ball.y +=  ball.vy;
        //
        ballSprite.x = ball.x;
        ballSprite.y = ball.y;
}
step();
addEventListener(Event.ENTER_FRAME, step);

Вот, разбирайтесь, это несложно.

P.S. У меня код с ошибкой, через некоторое время шарик "выравнивается". Если исправлю — обновлю код :)

Wadimir 31.01.2012 18:47

Большое спасибо!!!


Часовой пояс GMT +4, время: 22:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.