flash on 2009-11-7
♥0 |
Line 122 |
Modified 2009-11-07 14:54:14 |
MIT License
archived:2017-03-30 04:46:18
| (replaced)
Related images
ActionScript3 source code
/**
* Copyright uwi ( http://wonderfl.net/user/uwi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/sgn9
*/
package {
import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.text.*;
import net.wonderfl.utils.SequentialLoader;
import net.hires.debug.Stats;
public class FillFillRect extends Sprite {
public const PIC_DEFAULT : String = "http://assets.wonderfl.net/images/related_images/b/b8/b825/b8258201e6eb69aebaed9c7e4d6c954c1848f6cc";
private var _images : Array = [];
private var _tf : TextField;
public function FillFillRect() {
SequentialLoader.loadImages([PIC_DEFAULT], _images, onImageLoaded);
}
private var _targ : BitmapData;
private var _elitebmd : BitmapData;
private var _curbmd : BitmapData;
private var _curdiff : Number;
private var _nextbmd : BitmapData;
private var _cur : Array;
private var _elite : Array;
private var _elitediff : Number;
private var _W : Number;
private var _H : Number;
private function onImageLoaded() : void
{
var l : Loader = _images.pop();
_targ = new BitmapData(l.width, l.height, false);
_targ.draw(l);
// addChild(new Bitmap(_targ));
_elitebmd = new BitmapData(l.width, l.height, false, 0x000000);
addChild(new Bitmap(_elitebmd));
_W = l.width;
_H = l.height;
_cur = new Array(N);
_elite = new Array(N);
for(var i : int = 0;i < N;i++){
_cur[i] = generate();
_elite[i] = {};
}
_curbmd = new BitmapData(_W, _H, false, 0x000000);
_nextbmd = new BitmapData(_W, _H, false, 0x000000);
_curdiff = Number.MAX_VALUE;
_elitediff = Number.MAX_VALUE;
_curbmd.lock();
_nextbmd.lock();
_R0 = _elitebmd.rect;
_tf = new TextField();
_tf.x = 0;
_tf.y = 420;
_tf.width = 400;
_tf.height = 100;
addChild(_tf);
addChild(new Stats());
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e : Event) : void
{
_elitebmd.lock();
for(var i : int = 0;i < 10;i++){
step();
}
_elitebmd.unlock();
// _tf.text = "" + _curdiff + "\n" + _elitediff;
/*
var curhist : Vector.<Vector.<Number>> = _elitebmd.histogram();
var targhist : Vector.<Vector.<Number>> = _targ.histogram();
var diffcur : Number = 0;
for(var ch : int = 0;ch < 3;ch++){
for(i = 0;i < 256;i++){
diffcur += (curhist[ch][i] - targhist[ch][i]) * (curhist[ch][i] - targhist[ch][i]);
}
}
*/
_tf.text = "" + countDiff(_elitebmd, _targ, _R0);
}
private function generate() : Array
{
var r : Rectangle = new Rectangle(
Math.random() * _W, Math.random() * _H,
Math.random() * Math.random() * _W + 2,
Math.random() * Math.random() * _H + 2
);
if(r.x + r.width >= _W){
r.width = _W - r.x;
}
if(r.y + r.height >= _H){
r.height = _H - r.y;
}
return [r, uint(Math.random() * 0xffffff)];
}
private const N : int = 500;
private var _R0 : Rectangle;
private const P0 : Point = new Point(0, 0);
private function step() : void
{
var ind : int = Math.random() * N;
var i : int;
_nextbmd.fillRect(_R0, 0x000000);
var candi : Array = generate();
for(i = 0;i < ind;i++){
_nextbmd.fillRect(_cur[i][0], _cur[i][1]);
}
_nextbmd.fillRect(candi[0], candi[1]);
for(i = ind + 1;i < N;i++){
_nextbmd.fillRect(_cur[i][0], _cur[i][1]);
}
var u : Rectangle = _cur[ind][0].union(candi[0]);
/*
var curhist : Vector.<Vector.<Number>> = _curbmd.histogram(u);
var nexthist : Vector.<Vector.<Number>> = _nextbmd.histogram(u);
var targhist : Vector.<Vector.<Number>> = _targ.histogram(u);
*/
var diffcur : Number = countDiff(_curbmd, _targ, _cur[ind][0]) + countDiff(_curbmd, _targ, candi[0]);
var diffnext : Number = countDiff(_nextbmd, _targ, _cur[ind][0]) + countDiff(_nextbmd, _targ, candi[0]);
/*
for(var ch : int = 0;ch < 3;ch++){
for(i = 0;i < 256;i++){
diffcur += (curhist[ch][i] - targhist[ch][i]) * (curhist[ch][i] - targhist[ch][i]);
diffnext += (nexthist[ch][i] - targhist[ch][i]) * (nexthist[ch][i] - targhist[ch][i]);
}
}
*/
if(diffcur > diffnext){
_cur[ind] = candi;
_curbmd.copyPixels(_nextbmd, _R0, P0);
_elitebmd.copyPixels(_curbmd, _R0, P0);
/*
if(_curdiff < _elitediff){
_elitediff = _curdiff;
_elitebmd.copyPixels(_curbmd, _R0, P0);
for(i = 0;i < N;i++){
_elite[i] = _cur[i].concat();
}
}
*/
}
}
private function countDiff(a : BitmapData, b : BitmapData, u : Rectangle) : Number
{
var diff : Number = 0;
for(var x : int = u.x;x < u.x + u.width;x+=2){
for(var y : int = u.y;y < u.y + u.height;y+=2){
var pa : uint = a.getPixel(x, y);
var pb : uint = b.getPixel(x, y);
var rr : int, gg : int, bb : int;
rr = (pa >> 16) - (pb >> 16);
gg = ((pa >> 8) & 255) - ((pb >> 8) & 255);
bb = (pa & 255) - (pb & 255);
diff += rr * rr + gg * gg + bb * bb;
}
}
return diff;
}
}
}