Код 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;
}