2012-04-23 4 views
0

기하학적 인 문제를 해결하는 데 도움을주십시오. 휠의 여러 섹터를 만듭니다. 이제 모든 부분에 원의 중심에서 가장자리까지 텍스트를 배치해야합니다. 그러나 어쨌든 모든 것이 엉망이됩니다. 여기 반경을 따라 원의 중심을 중심으로 한 텍스트

wheel

는 한 섹터의 클래스입니다 :

package comps 
{ 

    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.filters.GlowFilter; 
    import flash.geom.Matrix; 
    import flash.geom.Point; 
    import flash.geom.Vector3D; 
    import flash.net.URLRequest; 
    import flash.text.AntiAliasType; 
    import flash.text.Font; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.text.TextFormatAlign; 

    public class Sector extends Sprite 
    { 
     private var imageX1:Number; 
     private var imageY1:Number; 
     private var imageX2:Number; 
     private var imageY2:Number; 
     [Embed(source="font/SEGOEUIB.TTF", fontFamily="SegoeUI", mimeType="application/x-font", embedAsCFF="false", advancedAntiAliasing="true")] 
     private var MoolEmbed:Class; 

     public function Sector(tip:String, rot:Number, centerX:Number, centerY:Number, innerRadius:Number, outerRadius:Number, startAngle:Number, arcAngle:Number, val:Number, color:uint, alpha:Number, url:String, value:Number, steps:int=20) 
     { 
      Font.registerFont(MoolEmbed); 

      var myArc:Sprite = new Sprite(); 
      myArc.graphics.lineStyle(2); 
      myArc.graphics.beginFill(color, alpha); 
      drawSolidArc (myArc,centerX, centerY, innerRadius, outerRadius, startAngle, arcAngle, url, steps); 
      myArc.graphics.endFill(); 
      this.addChild(myArc); 

       var myFormat:TextFormat = new TextFormat(); 
       myFormat.size = 20; 
       myFormat.align = TextFormatAlign.CENTER; 
       myFormat.font = 'SegoeUI'; 
       myFormat.bold = true; 

       var myText:TextField = new TextField(); 
       myText.defaultTextFormat = myFormat; 
       myText.setTextFormat(myFormat); 
       myText.embedFonts = true; 
       myText.antiAliasType = AntiAliasType.ADVANCED; 
       myText.text = url; 
       this.addChild(myText); 

       myText.wordWrap = true; 
       myText.width = outerRadius - innerRadius; 
       myText.height = 20; 
       var sectorsNum:Number = rot/360; 
       textRotation(myText, rot*(sectorsNum-value) - rot*0.5, centerX, centerY); 

       myText.x = imageX1 + 0 * (imageX2 - imageX1); 
       myText.y = imageY1 + 0 * (imageY2 - imageY1); 
       //trace (myText.x + " " + myText.y); 
       var myGlow:GlowFilter = new GlowFilter(); 
       myGlow.color = 0xFFFFFF; 
       myGlow.blurX = 20; 
       myGlow.blurY = 20; 
       myGlow.strength = 2; 
       myText.filters = [myGlow]; 
      } 
     } 

     private function textRotation (target:TextField, angle:Number, centerX:Number, centerY:Number):void{ 
      var point:Point=new Point(centerX + target.width/2, centerY + target.height/2); 

      var m:Matrix=target.transform.matrix; 
      m.tx -= point.x; 
      m.ty -= point.y; 
      m.rotate (angle*(Math.PI/180)); 
      m.tx += point.x; 
      m.ty += point.y; 
      target.transform.matrix=m; 
     } 

     private function drawSolidArc (drawObj:Object, centerX:Number,centerY:Number,innerRadius:Number,outerRadius:Number,startAngle:Number,arcAngle:Number,url:String,steps:int=20):void { 
      var twoPI:Number = 2 * Math.PI; 
      var angleStep:Number = arcAngle/steps; 
      var angle:Number, i:int, endAngle:Number; 
      var xx:Number = centerX + Math.cos(startAngle * twoPI) * innerRadius; 
      var yy:Number = centerY + Math.sin(startAngle * twoPI) * innerRadius; 
      var xxInit:Number=xx; 
      var yyInit:Number=yy; 
      drawObj.graphics.moveTo(xx,yy); 
      for(i=1; i<=steps; i++) { 
       angle = (startAngle + i * angleStep) * twoPI; 
       xx = centerX + Math.cos(angle) * innerRadius; 
       yy = centerY + Math.sin(angle) * innerRadius; 
       drawObj.graphics.lineTo(xx,yy); 
       if (i==steps*0.5-1){ 
        imageX1 = xx; 
        imageY1 = yy; 
       } 
      } 
      endAngle = startAngle + arcAngle; 
      for(i=0;i<=steps;i++) { 
       angle = (endAngle - i * angleStep) * twoPI; 
       xx = centerX + Math.cos(angle) * outerRadius; 
       yy = centerY + Math.sin(angle) * outerRadius; 
       drawObj.graphics.lineTo(xx,yy); 
       if (i==steps*0.5){ 
        imageX2 = xx; 
        imageY2 = yy; 
       } 
      } 
      drawObj.graphics.lineTo(xxInit,yyInit); 
     } 
    } 
} 

을 그리고 그 모든 바퀴 작성이다 : 당신의 TextField의가 필요 말할 것입니다, 그것을보고함으로써

sectorsNum = tarotAC.length; 
       for (var i:int = 0; i < sectorsNum; i++){ 
        var arcAngle:Number = - 1/sectorsNum; 
        var startAngle:Number = arcAngle*i; 
        var arc:Sector = new Sector(FlexGlobals.topLevelApplication.mode, 360/sectorsNum, 0, 0, stageW*0.1, stageW*0.5, startAngle, arcAngle, Number(sectorsNum - i), tarotAC.getItemAt(i).color, 1, tarotAC.getItemAt(i).datas, tarotAC.getItemAt(i).url); 

        con.addChild(arc); 
       } 

답변

1

을 높이에 의해 위로 움직여 라. TextField는 위에서부터 작성되며 사용자가 지정한 좌표는 기준선에 더 잘 맞습니다. 어쩌면 TextField를 스프라이트에 넣고 TextField의 y를 높이로 설정 한 다음 텍스트 자체 대신 컨테이너를 조작 할 수 있습니다.

var container:Sprite = new Sprite(); 
container.addChild(myText); 
this.addChild(container); 
myText.y = -myText.height; 
textRotation(container, rot*(sectorsNum-value) - rot*0.5, centerX, centerY); 
//you should of course modify textRotation's first parameter type 
container.x = imageX1 + 0 * (imageX2 - imageX1); 
container.y = imageY1 + 0 * (imageY2 - imageY1); 
+0

모든 천재는 간단합니다. 나는 5 일 동안 나 자신을 괴롭혔다. 고마워요! – Astraport

+0

Kodiak,이 휠과 관련된 다른 문제에 대해 조언 해 줄 수 있습니까? 나는 당신의 도움에 감사 할 것입니다. http://stackoverflow.com/questions/10344644/hittest-between-animated-flex-components-and-rotated-as3-components – Astraport

관련 문제