简体   繁体   中英

Change pixel color with ActionScript 3

Say I have drawn a triangle with:

import flash.geom.Matrix;

function drawTriangle(sideLength:uint):void {
    var triangleHeight:uint = Math.sqrt(Math.pow(sideLength,2) - Math.pow(sideLength / 2,2));
    var triangleShape:Shape = new Shape();
    triangleShape.graphics.beginFill(0x2147AB);
    triangleShape.graphics.lineStyle(1,0xff00ff00);
    triangleShape.graphics.moveTo(sideLength/2, 0);
    triangleShape.graphics.lineTo(sideLength, triangleHeight);
    triangleShape.graphics.lineTo(0, triangleHeight);
    triangleShape.graphics.lineTo(sideLength/2, 0);
    addChild(triangleShape);

    var matrix:Matrix = new Matrix;
    matrix.translate(50, 50);
    transform.matrix = matrix;
}

drawTriangle(400);

How can I achieve the following:

When the user clicks a point inside the triangle, we will get the x and y coordinates, do some calculation with those values and get some (lots) of pixel coordiantes accordingly (all of those calculated points will be within the triangle). And finally, change the color of those points (something different than triangleShape fill color).

Here's a solution using a triangle drawn to some BitmapData , added to a Bitmap , and then contained in a Sprite .

var box:Sprite = new Sprite();
box.graphics.beginFill(0x000000, 1);
box.graphics.lineStyle(1, 0x000000, 1);
box.graphics.moveTo(100, 50);
box.graphics.lineTo(50, 100);
box.graphics.lineTo(150, 100);
box.graphics.lineTo(100, 50);
box.graphics.endFill();
addChild(box);
var boxCopied:BitmapData = new BitmapData(box.width, box.height, true, 0x00000000);
var matr:Matrix = new Matrix();
matr.tx = -50;
matr.ty = -50;
boxCopied.draw(box, matr);
box.graphics.clear();
var boxCopy:Bitmap = new Bitmap(boxCopied);
box.addChild(boxCopy);
box.addEventListener(MouseEvent.CLICK, clicked, false, 0, true);

function clicked(evt:MouseEvent):void
{
    for(var i=0;i<50;i++)
    {
        var pixel = new Point(Math.floor(Math.random() * boxCopy.width), Math.floor(Math.random() * boxCopy.height));
        if(boxCopied.hitTest(new Point(boxCopy.x, boxCopy.y), 1, pixel))
        {
            boxCopied.setPixel32(pixel.x, pixel.y, Math.random() * 0xFFFFFFFF);
        }
    }
}

http://www.swfupload.com/view/162170.htm

Note I'm using setPixel32 to send a 32-bit integer (essentially an ARBG instead of RGB) to manipulate alpha as well.

50 random pixels are being generated. If they're inside of the triangle, they're kept.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM