|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2013
Сообщений: 157
|
Проверить закрашена линия (или прямоугольник)
Здравствуйте.
Задача такая. Есть ряд линий (или прямоугольников) белого цвета. Пользователю необходимо закрасить эти прямоугольники. Не по нажатию по линии, а именно заштриховать (например, в красный цвет). Как проверить, была ли область (прямоугольник или линия) полностью закрашена или нет? Спасибо! |
|
|||||
Lorem ipsum
|
import flash.display.BitmapData; import flash.display.Bitmap; import flash.display.Shape; import flash.events.MouseEvent; import flash.geom.Point; import flash.events.Event; import flash.geom.Matrix; import flash.display.StageScaleMode; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; stage.scaleMode = StageScaleMode.NO_SCALE; stage.frameRate = 60; var background:Shape = new Shape(); background.graphics.beginFill(0xa0a0a0); background.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); addChild(background); var tf:TextField = new TextField(); tf.width = stage.stageWidth; tf.height = 30; tf.y = 10; tf.defaultTextFormat = new TextFormat('Arial', 20, 0xffffff, true, null, null, null, null, TextFormatAlign.CENTER); tf.text = '0%'; addChild(tf); var rectToFill:BitmapData = new BitmapData(300, 200, false, 0xffffff); var rectToFillBmp:Bitmap = new Bitmap(rectToFill); rectToFillBmp.x = (stage.stageWidth - rectToFillBmp.width) / 2; rectToFillBmp.y = (stage.stageHeight - rectToFillBmp.height) / 2; addChild(rectToFillBmp); var canvas:Shape = new Shape(); addChild(canvas); var mtx:Matrix = new Matrix(); mtx.translate(-rectToFillBmp.x, -rectToFillBmp.y); var brushPosition:Point = new Point(); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); function onMouseDown(event:MouseEvent):void { //brushPosition.x = event.stageX; //brushPosition.y = event.stageY; canvas.graphics.moveTo(event.stageX, event.stageY); canvas.graphics.lineStyle(40, 0xff0000); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpOrLeave); stage.addEventListener(Event.MOUSE_LEAVE, onMouseUpOrLeave); } function onMouseMove(event:MouseEvent):void { canvas.graphics.lineTo(event.stageX, event.stageY); } function onMouseUpOrLeave(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUpOrLeave); stage.removeEventListener(Event.MOUSE_LEAVE, onMouseUpOrLeave); // Срисовываем нашу мазанину с холста в "прямоугольник". rectToFill.draw(canvas, mtx, null, null, null, true); canvas.graphics.clear(); // Берем самое яркое (255-е) значение "синего" (который по индексу 2) // вектора гистограммы нашего "прямоугольника". Так как мы рисуем красным, // под закрашенными пикселями тухнут зеленые и синие значения. // Вот мы и ждем, когда распространение синих точек сведется со значения // 60000 (ширина умноженная на высоту прямоугольника, его площадь в квадратных // пикселях, так сказать) до нуля. var ratio:Number = (1 - rectToFill.histogram()[2][255] / 60000) * 100; if (ratio == 100) { tf.text = int(ratio) + '% (готово!)'; } else if (ratio >= 90) { tf.text = int(ratio) + '% (почти)'; } else if (ratio >= 70) { tf.text = int(ratio) + '% (еще немножечко)'; } else { tf.text = int(ratio) + '%'; } }
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Mar 2013
Сообщений: 157
|
Спасибо огромное! Буду разбираться.
|
|
|||||
rectToFill.histogram() - не знал о такой функции =)
|
|
|||||
Lorem ipsum
|
Забыл прокомментировать, зачем ждать полного отсутствия синего (как в примере) вместо наличия тотального красного. Это сделано с заделом на то, что цвет закрашивания может быть любым оттенком, собранным из двух оставшихся цветов (красный, зеленый, желтый, оранжевый, салатовый и т.д.). Точно так же можно проверять гистограмму на красный или синий цвет, тогда можно закрашивать синим, зеленым, бирюзовым (если будем проверять отсутствие красного), или синим, сиреневым, малиновым, красным, бордовым (в случае проверки зеленого канала).
__________________
Поймай яблоко 2! |
|
|||||
Lorem ipsum
|
ZackMercury, можешь показать кодом? Что-то я не понял, как это применить к приведенному выше алгоритму.
__________________
Поймай яблоко 2! |
|
|||||
Берём это:
Цитата:
function onMouseDown(event:MouseEvent):void { //brushPosition.x = event.stageX; //brushPosition.y = event.stageY; canvas.graphics.moveTo(event.stageX, event.stageY); canvas.graphics.lineStyle(40, BRUSH_COLOR); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpOrLeave); stage.addEventListener(Event.MOUSE_LEAVE, onMouseUpOrLeave); } Цитата:
var ratio:Number = (rectToFill.histogram()[0][BRUSH_COLOR >> 16 & 0xFF] / (rectToFill.width*rectToFill.height) * 100; var ratio2:Number = (rectToFill.histogram()[1][BRUSH_COLOR >> 8 & 0xFF] / (rectToFill.width*rectToFill.height)) * 100; var ratio3:Number = (rectToFill.histogram()[2][BRUSH_COLOR & 0xFF] / (rectToFill.width*rectToFill.height)) * 100; if (ratio == 100 && ratio2 == 100 && ratio3 == 100) { tf.text = int(ratio) + '% (готово!)'; } else if (ratio >= 90 && ratio2 >= 90 && ratio3 >= 90) { tf.text = int(ratio) + '% (почти)'; } else if (ratio >= 70 && ratio3 >= 70 && ratio4 >= 70) { tf.text = int(ratio) + '% (еще немножечко)'; } else { tf.text = int(ratio) + '%'; } Ну и да, конечно в таком случае лучше вынести результат выполнения histogram в отдельную переменную. UPD: забыл поменять с инверсии, сча...
__________________
There is no thing in this world that is not simple. |
Часовой пояс GMT +4, время: 21:09. |
|
« Предыдущая тема | Следующая тема » |
Теги |
закрасить , заштриховать , проверить |
|
|