Dead Code Preservation :: Archived AS3 works from wonderfl.net

円形ランダム配置

半径と角度をランダムで円形に配置すると中心に固まってしまいます。(赤色配置)
そこで、XとYでランダムに配置。半径内にないものは再配置してみると、視覚的にはよりランダムに配置できました。(青色配置)

左上のボタンで表示を切り替えれます。
Get Adobe Flash player
by kawamura 30 Jan 2014
  • Related works: 1
  • Talk

    ton at 01 Feb 2014 13:20
    半径と角度をランダムにして,偏りなく円の中に配置する方法をforkしておきましたので,よかったら参考にしてください http://wonderfl.net/c/mmAl
    makc3d at 04 Feb 2014 17:37
    @ton works for ellipses too http://wonderfl.net/c/sacn
    Embed
/**
 * Copyright kawamura ( http://wonderfl.net/user/kawamura )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/yCT7
 */

package 
{
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    /**
     * ...
     * @author Jaiko
     */
    public class Main extends Sprite 
    {
        private var blue:Sprite;
        private var red:Sprite;
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            var i:uint;
            var n:uint;
            var r:Number = 200;
            var theta:Number;
            var sprite:Sprite;
            var g:Graphics;
            
            var redButton:Sprite = new Sprite()
            addChild(redButton);
            g = redButton.graphics;
            g.beginFill(0xFF0000);
            g.drawRect(0, 0, 100, 20);
            redButton.x = 5;
            redButton.y = 5;
            redButton.addEventListener(MouseEvent.CLICK, redClickHandler);
            
            var blueButton:Sprite = new Sprite()
            addChild(blueButton);
            g = blueButton.graphics;
            g.beginFill(0x0000FF);
            g.drawRect(0, 0, 100, 20);
            blueButton.x = 110;
            blueButton.y = 5;
            blueButton.addEventListener(MouseEvent.CLICK, blueClickHandler);
            
            red = new Sprite();
            addChild(red);
            blue = new Sprite();
            addChild(blue);
            //赤色配置 半径と角度をランダム配置処理
            n = 10000;
            for (i = 0; i < n; i++)
            {
                sprite = new Sprite();
                red.addChild(sprite);
                g = sprite.graphics;
                g.beginFill(0xFF0000);
                g.drawCircle(0, 0, 1);
                r = 200 * Math.random();
                theta = 2 * Math.PI * Math.random();
                sprite.x = stage.stageWidth * 0.5 + r * Math.cos(theta);
                sprite.y = stage.stageHeight * 0.5 + r * Math.sin(theta);
            }
            
            //XYに配置。半径内にないものは再配置処理
            n = 10000;
            for (i = 0; i < n; i++)
            {
                sprite = new Sprite();
                blue.addChild(sprite);
                g = sprite.graphics;
                g.beginFill(0x0000FF);
                g.drawCircle(0, 0, 1);
                checkPosition(sprite);
            }
            //
            blue.visible = false;
        }
        
        private function blueClickHandler(e:MouseEvent):void 
        {
            if (blue.visible)
            {
                blue.visible = false;
            }
            else
            {
                blue.visible = true;
            }
        }
        
        private function redClickHandler(e:MouseEvent):void 
        {
            if (red.visible)
            {
                red.visible = false;
            }
            else
            {
                red.visible = true;
            }
        }
        
        private function checkPosition(sprite:Sprite):void 
        {
            var d:Number
            sprite.x = stage.stageWidth * 0.5 + 200 - 400 * Math.random();
            sprite.y = stage.stageWidth * 0.5 + 200 - 400 * Math.random();
            d = Math.sqrt(Math.pow(stage.stageWidth * 0.5 - sprite.x, 2) + Math.pow(stage.stageHeight * 0.5 - sprite.y, 2));
            if (d > 200)
            {
                //半径内にないので再配置。回数制限などしたほうがいいかもね。
                checkPosition(sprite);
            }
            
        }
        
    }
    
}