Показать сообщение отдельно
Старый 29.08.2013, 21:15
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 5  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Как то делал для полигонов, лень переписывать под кастомные треугольники..
Код AS3:
package  
{
	import flash.display.GraphicsPath;
/* * * * * * * * * *
*                  *
*  @author wolsh   *
*                  *
\* * * * * * * * * */ 
	public class RoundPoly 
	{
		private static const RAD180:Number = Math.PI;
		private static const RAD:Number = Math.PI / 180;
		private static const RAD90:Number = Math.PI / 2;
 
 
		public function RoundPoly() {	}
 
		public static function getPath(sides:uint, centerX:Number, centerY:Number, radius:Number, round:Number, rotation:Number):GraphicsPath
		{
			rotation *= RAD;
			var c:Vector.<int> = new Vector.<int>();
			var d:Vector.<Number> = new Vector.<Number>();
 
			var roundCenterR:Number = radius - round;
			var sideAngle:Number = 2 * RAD180 / sides;
			var roundAngle:Number = RAD90 - sideAngle / 2;
			//// move to start coordinates
			var startX:Number = centerX + roundCenterR * Math.cos(rotation);
			var startY:Number = centerY + roundCenterR * Math.sin(rotation)
			var startArc:GraphicsPath = RoundPoly.getArc(startX, startY, round, rotation - sideAngle / 2, sideAngle);
			c = startArc.commands;
			d = startArc.data;
 
			//// lines to anchors
			for (var i:uint = 1; i < sides; i++)
			{
				var angle:Number = rotation + sideAngle * i;
				var roundCenterX:Number = centerX + roundCenterR * Math.cos(angle);
				var roundCenterY:Number = centerY + roundCenterR * Math.sin(angle);
				var arcStartAngle:Number = angle - sideAngle / 2;
				var arc:GraphicsPath = RoundPoly.getArc(roundCenterX, roundCenterY, round, arcStartAngle, sideAngle);
				arc.commands[0] = 2;
				c = c.concat(arc.commands);
				d = d.concat(arc.data);
			}
			//// Close contur line
			c.push(2);
			d.push(startArc.data[0], startArc.data[1]);
 
			return new GraphicsPath(c, d);
		}
 
		private static function getArc(centerX:Number, centerY:Number, radius:Number, rotation:Number, arc:Number, startCommand:int = 1) : GraphicsPath
		{
			if (arc == 0)
			{
				return null; // ? //
			}
			// alias arc to 360 gradians
			arc = arc % (RAD180 * 2);
			// 18 gradians max at one step
			var frags:Number = Math.abs( Math.ceil(arc * 10 / RAD180) ); 
			if (arc < 0)
			{
				frags += 1;
			}
			var fragAngle:Number = arc / frags;
			var controlR:Number = radius / Math.cos( -fragAngle / 2);
 
			var c:Vector.<int> = Vector.<int>([ startCommand ]);
			var d:Vector.<Number> = new Vector.<Number>();
			d.push(centerX + radius * Math.cos(rotation));
			d.push(centerY + radius * Math.sin(rotation));
 
			for (var i:uint = 1; i < frags + 1; i++) 
			{
				var aA:Number = rotation + fragAngle * i;
				var aX:Number = centerX + radius * Math.cos(aA);
				var aY:Number = centerY + radius * Math.sin(aA);
				var cA:Number = aA - fragAngle / 2;
				var cX:Number = centerX + controlR * Math.cos(cA);
				var cY:Number = centerY + controlR * Math.sin(cA);
				c.push(3);
				d.push(cX, cY, aX, aY);
			}
			return new GraphicsPath(c, d);
		}
	}
}
Usage:
Код AS3:
			var gPath:GraphicsPath = RoundPoly.getPath(
			5, // кол-во сторон
			150, // х центра полигона
			150, // у центра полигона
			120, // радиус полигона
			20, // радиус скругления
			72  // угол поворота полигона
			);
			var gData:Vector.<IGraphicsData> = Vector.<IGraphicsData>
			([
				new GraphicsSolidFill(0x000000, 0.5),
				gPath,
				new GraphicsEndFill()
			]);
			var s:Shape = new Shape();
			super.addChild(s);
			s.graphics.drawGraphicsData(gData);
Poly.swf   (2.6 Кб)
Вложения
Тип файла: swf Poly.swf (2.6 Кб, 663 просмотров)
__________________
Reality.getBounds(this);