Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   lineBitmapStyle. Не пойму в каком направлении рыть (http://www.flasher.ru/forum/showthread.php?t=124664)

zafod 05.05.2009 20:28

lineBitmapStyle. Не пойму в каком направлении рыть
 
Подскажите. В IDE когда просто рисуешь линию можно выбрать стиль линии line -> properties -> style:ragged допустим. А в AS3 как реализовать подобное? Пробывал lineBitmapStyle - битмап заливает всегда линейно, пробывал переворачивать матрицей, но эффект все равно не тот. Да ладно линия, кривую безье скоро нужно будет рисовать подобную, а я линию все победить не могу.

Vas717 05.05.2009 20:48

Рыть в направлении ручной (AS3) отрисовки линии ); т.е. делим линию на n частей и рисуем каждый сегмент отдельно ( как line/curve ) с заданными расстояниями между сегментами и нужным стилем.

Alex Lexcuk 06.05.2009 00:07

Код AS3:

var pointXYArr:Array, facArr:Array, i:int, fixFac:Array, fixPointArr:Array;
pointXYArr =[100,0,100,41.35,70.65,70.65,41.35,100,0,100,-41.4,100,-70.65,70.65,-100,41.35,-100,0,-100,-41.4,-70.65,-70.65,-41.4,-100,0,-100,41.35,-100,70.65,-70.65,100,-41.4,-70,22,70,24,1,121,-64,-47,-42,-71,-14,-45,-41,-22,-15,-71,-17,-22,-62,-21,-62,-71,8,-25,71,-17,48,-73,39,-37];
facArr=[16,0,18,2,17,1,0,0,1,2,2,1,3,2,4,1,5,2,6,1,7,2,8,1,9,2,10,1,11,2,12,1,13,2,14,1,15,2,0,1,20,0,23,2,21,1,24,2,22,1,25,2,19,1,26,2,20,1,27,0,29,2,28,1,30,2,27,1];
fixPointArr = [];
for (i=0;i<pointXYArr.length;i+=2) fixPointArr.push(new Point(pointXYArr[i], pointXYArr[i+1]));
fixFac = [];
for (i=0;i<facArr.length;i+=2) fixFac.push({id:facArr[i], type:facArr[i+1]});
//сдвигание и увеличение смайла
for (i=0;i<fixPointArr.length;i++) {
        fixPointArr[i].x*=2;
        fixPointArr[i].y*=2;
        fixPointArr[i].x+=250;
        fixPointArr[i].y+=200;
}
graphics.lineStyle(1,1);
for (i=0;i<fixFac.length;i++) {
        try{
        if (fixFac[i].type == 0)
        graphics.moveTo(fixPointArr[fixFac[i].id].x, fixPointArr[fixFac[i].id].y);
        /*if (fixFac[i].type == 1)
        graphics.lineTo(fixPointArr[fixFac[i].id].x, fixPointArr[fixFac[i].id].y);
        */

        if (fixFac[i].type == 2) {
        graphics.curveTo(fixPointArr[fixFac[i].id].x, fixPointArr[fixFac[i].id].y,
                fixPointArr[fixFac[i+1].id].x, fixPointArr[fixFac[i+1].id].y);
        i++;
        }
        }catch(e:Error){trace(e+' ' +i)};
}
//подготовка массива из черточек
graphics.lineStyle(0,0xFF);
var curveLine:Array = [];
var point:Point;
var lastPoint:Point;
var j:int, b:int;
var breakPoint:Array = [];
var breakTr:Boolean = true;
for (i=0;i<fixFac.length;i++) {
        try{
                if (fixFac[i].type == 0) {
                        graphics.moveTo(fixPointArr[fixFac[i].id].x, fixPointArr[fixFac[i].id].y);
                        lastPoint = fixPointArr[fixFac[i].id];
                        breakPoint.push(lastPoint);
                }
 
                if (fixFac[i].type == 2) {
                        for (j=0;j<100;j++){
                                //trace(lastPoint);
                                curveLine.push(point = new Point);
                                point.x = bezier3(lastPoint.x,fixPointArr[fixFac[i].id].x,fixPointArr[fixFac[i+1].id].x, j/100);
                                point.y = bezier3(lastPoint.y,fixPointArr[fixFac[i].id].y,fixPointArr[fixFac[i+1].id].y, j/100);
                                if (curveLine.length>1) {
                                        graphics.moveTo(curveLine[curveLine.length-2].x,curveLine[curveLine.length-2].y);
                                        breakTr = true;
                                        for(b=0; b<breakPoint.length; b++) if (curveLine[curveLine.length-1].equals(breakPoint[b])==true) {breakTr = false;break;}
 
                                        if (breakTr == true) graphics.lineTo(curveLine[curveLine.length-1].x,curveLine[curveLine.length-1].y);
                                }
                        //
                        }
                        lastPoint = fixPointArr[fixFac[i+1].id];
                        i++;
                }
        }catch(e:Error){trace(e+' ' +i)};
}
//подготовка массива из черточек c одинаковым расстоянием между ними
var fixDistance:Array = [];
var dist:Number=0;
var FIX_DIST:int = 10;//ширина точечек
lastPoint = curveLine[0];
for (i=0;i<curveLine.length;i++){
        dist+=Point.distance(lastPoint,curveLine[i]);
        //trace(Point.distance(lastPoint,curveLine[i]));
        if (dist >= FIX_DIST) {
                dist=0;
                fixDistance.push(curveLine[i]);
        }
        lastPoint = curveLine[i];
        }
//чертение смайла черточками
graphics.lineStyle(4,0xFF0000);
for (i=1; i<fixDistance.length; i+=2){
graphics.moveTo(fixDistance[i-1].x,fixDistance[i-1].y);
breakTr = true;
for(b=0; b<breakPoint.length; b++) if (fixDistance[i].equals(breakPoint[b])==true) {
        breakTr = false;
        break;
        }
if (breakTr == true)
graphics.lineTo(fixDistance[i].x,fixDistance[i].y);
}
 
function bezier3(p0:int,p1:int,p2:int,t:Number):Number {
        return (1-t)*(1-t)*p0+2*t*(1-t)*p1+t*t*p2;
}

http://www.murmadillo.tut.su/m/face.jpg

zafod 06.05.2009 07:41

да, так пробывал - расчитал кривую через n curves и отрисовал через drawPath, но кроме как черточками не получилось. Обшарил весь инет, но такого эффекта как ragged все равно не получается.


Часовой пояс GMT +4, время: 06:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.