BitmapDataに直接描画する直線とBezier曲線 uwi forked:0favorite:3lines:58license : MIT License modified : 2009-12-12 23:55:17 Embed Tweet package { import flash.display.*; import flash.text.*; public class FlashTest extends Sprite { private var _bmd : BitmapData; private var _tf : TextField; public function FlashTest() { _bmd = new BitmapData(465, 465, false, 0xffffff); addChild(new Bitmap(_bmd)); _tf = new TextField(); _tf.height = 465; addChild(_tf); drawLine(_bmd, 100, 100, 200, 300, 0x000000); drawLine(_bmd, 200, 300, 300, 300, 0x000000); drawCurve(_bmd, 100, 100, 200, 300, 300, 300, 0x000000); } private static function drawLine(bmd : BitmapData, x1 : Number, y1 : Number, x2 : Number, y2 : Number, color : uint, fill : Number = 1.0) : void { var nDiv : int = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) * fill + 1; for(var i : int = 0;i < nDiv;i++){ bmd.setPixel(x1 + i / nDiv * (x2 - x1), y1 + i / nDiv * (y2 - y1), color); } } private static function drawCurve(bmd : BitmapData, x1 : Number, y1 : Number, xc : Number, yc : Number, x2 : Number, y2 : Number, color : uint, fill : Number = 1.0) : void { var nDiv : int = lenBezier(x1, y1, xc, yc, x2, y2) * fill + 1; /* var nDiv : int = ( Math.sqrt((xc - x1) * (xc - x1) + (yc - y1) * (yc - y1)) + Math.sqrt((x2 - xc) * (x2 - xc) + (y2 - yc) * (y2 - yc)) ) * fill + 1; */ for(var i : int = 0;i < nDiv;i++){ var t : Number = i / nDiv; var x1c : Number = x1 + t * (xc - x1); var y1c : Number = y1 + t * (yc - y1); var xc2 : Number = xc + t * (x2 - xc); var yc2 : Number = yc + t * (y2 - yc); bmd.setPixel(x1c + t * (xc2 - x1c), y1c + t * (yc2 - y1c), color); } } private static function lenBezier(x1 : Number, y1 : Number, xc : Number, yc : Number, x2 : Number, y2 : Number, t : Number = 1.0) : Number { var A : Array = [2 * (xc - x1), 2 * (yc - y1)]; var B : Array = [2 * ((x2 - xc) - (xc - x1)), 2 * ((y2 - yc) - (yc - y1))]; var U : Number = Math.sqrt(B[0] * B[0] + B[1] * B[1]); if(U < 0.001){ return Math.sqrt(A[0] * A[0] + A[1] * A[1]) * t; } var V : Number = (A[0] * B[0] + A[1] * B[1]) / U; var W : Number = (A[0] * A[0] + A[1] * A[1]) - V * V; if(W < 0.001){ var q : Number = (A[0] * A[0] + A[1] * A[1]) / (B[0] * B[0] + B[1] * B[1]); return (t * t * 0.5 + q * t) * U; } var u : Number; u = (U * t + V) / Math.sqrt(W); var sup : Number = Math.log(u + Math.sqrt(1 + u * u)) + u * Math.sqrt(1 + u * u); u = (V) / Math.sqrt(W); var inf : Number = Math.log(u + Math.sqrt(1 + u * u)) + u * Math.sqrt(1 + u * u); return W / (2 * U) * (sup - inf); } } } Code Fullscreen Preview Fullscreen ooops aobyrne : bezierbezier-codedbitmapdatacoded-bezierlinedraw halfmile : 画 Bezier 曲线 bezier bezier-coded bitmapdata coded-bezier linedraw Math.sqrt fill color Math.log setPixel BitmapData addChild height TextField Bitmap Array uint Sprite int Number