Почему этот круг не рисует все точки правильно? - PullRequest
1 голос
/ 28 декабря 2011

У меня проблемы с рисованием круга. Кажется, код работает для рисования всех необходимых сегментов, кроме одного, но трассировка точек чертежа выглядит правильно.

Это класс, который генерирует сегменты:

package views
{
    import flash.display.Sprite;
    import flash.geom.Point;

    import views.segments.AS_Segment;

    public class AS_ColorContainer extends Sprite
    {       
        private var currX       :int;
        private var currY       :int;
        private var diameter    :int;
        private var angle       :int;

        private var segments:Vector.<AS_Segment>;

        public function AS_ColorContainer()
        {
            init();
        }

        private function init():void
        {
            diameter = 400;
            angle = 0;
            currX = 0;
            currY = 0 - radius;
            segments = new Vector.<AS_Segment>(24);

            for(var i:int = 0; i < 6; i++) { 
                drawSegment("greenLarge",0x00FF00,30);
                drawSegment("red",0xFF0000,10);
                drawSegment("greenSmall",0x00FF00,10);
                drawSegment("blue",0x0000FF,10);
            }
        }

        private function drawSegment($name:String,$color:uint,$size:int):void
        {
            var seg:AS_Segment = new AS_Segment($name);
            seg.graphics.beginFill($color);
            seg.graphics.moveTo(0,0);
            seg.graphics.lineTo(currX,currY);
            trace("Old: "+currX+":"+currY);
            angle += $size;
            currX = radius * Math.cos(degToRad(angle));
            currY = radius * Math.sin(degToRad(angle));
            trace("New: "+currX+":"+currY);
            seg.graphics.lineTo(currX,currY);
            seg.graphics.lineTo(0,0);
            seg.graphics.endFill();
            addChild(seg);
            segments.push(seg);
        }

        private function degToRad($deg:Number):Number
        {
            return $deg * (Math.PI / 180);
        }

        private function get radius():Number
        {
            return diameter / 2;
        }
    }
}

Класс AS_Segment - это простое расширение формы, которое просто хранит идентификатор:

package views.segments
{
    import flash.display.Shape;

    public class AS_Segment extends Shape
    {
        public var id       :String;

        public function AS_Segment($id:String)
        {
            id = $id;
        }
    }
}

Вывод не соответствует ожидаемому:

enter image description here

Но следы выглядят правильно:

Old: 0:-200
New: 173:99
Old: 173:99
New: 153:128
Old: 153:128
New: 128:153
Old: 128:153
New: 100:173
Old: 100:173
New: 0:200
Old: 0:200
New: -34:196
Old: -34:196
New: -68:187
Old: -68:187
New: -99:173
Old: -99:173
New: -173:99
Old: -173:99
New: -187:68
Old: -187:68
New: -196:34
Old: -196:34
New: -200:0
Old: -200:0
New: -173:-100
Old: -173:-100
New: -153:-128
Old: -153:-128
New: -128:-153
Old: -128:-153
New: -100:-173
Old: -100:-173
New: 0:-200
Old: 0:-200
New: 34:-196
Old: 34:-196
New: 68:-187
Old: 68:-187
New: 100:-173
Old: 100:-173
New: 173:-100
Old: 173:-100
New: 187:-68
Old: 187:-68
New: 196:-34
Old: 196:-34
New: 200:0

1 Ответ

4 голосов
/ 28 декабря 2011

Вы не правильно инициализировали свое карри.
(а также currX)

  currX = 0;
  currY = 0 - radius;

Эти линии устанавливают первую точку для рисования на (0,-200), когда она должна быть (200,0). Результат немного странный, поскольку можно ожидать, что только значение x будет неправильным. Черная рамка показывает, как на самом деле выглядит первый сегмент круга, если он не был скрыт другими сегментами:

circle segments

...