Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как нарисовать сектор круга? (http://www.flasher.ru/forum/showthread.php?t=144285)

In8Finity 08.09.2010 12:00

Как нарисовать сектор круга?
 
У меня есть задача нарисовать "заполненность" циферблата часов.
Тоесть, по мере того, как секундная стрелка идёт по циферблату, он бы закрашивался цветом.
Во флеше есть инструмент Oval Primitive Tool, который мне идеально подходит.
Там задаётся начальный и конечный угол сектора.

Могу ли я нарисовать программно этот сектор и в зависимости от значения таймера, менять значение угла от 0 до 360 ?
(я нашёл только про рисование кругов и эллипсов. но может вот сектора тоже есть?)

AS3Coder 08.09.2010 12:12

Код AS3:

var center:Point = new Point(100,100);
var angle:Number = 45;
var radius:Number = 50;
//
graphics.lineStyle(2, 0x666666);
graphics.beginFill(0x999999);
graphics.moveTo(center.x, center.y);
//
for (var i:int = 0, poi:Point; i <= angle; i++)
{
        poi = Point.polar(radius, i * Math.PI/180 - Math.PI*.5);
        graphics.lineTo(center.x + poi.x, center.y + poi.y);
}
//
graphics.endFill();


shaman4d 08.09.2010 16:01

Посмотреть как это реализовано в Degrafa

tsarapkabel 08.09.2010 16:52

AS3Coder, в твоём примере надо добавить ещё +1 к angle (полкруга получается 181).

AS3Coder 08.09.2010 17:19

Поправил условие выхода из цикла. Должно нарисоваться правильно.

kutuzov 11.10.2010 17:56

дописал код от AS3Coder, прооптимизировал чуть-чуть и добавил возможность задавать внутренний радиус
Код AS3:

package utils {
 
        import flash.display.Graphics;
        import flash.geom.Point;
 
        public function drawCircleSector(g:Graphics, centerX:Number, centerY:Number, radius:Number, angle:Number, innerRadius:Number = 0):void {
                var p:Point, i:uint;
                const rad:Number = Math.PI / 180;
                const pi2:Number = Math.PI / 2;
 
                g.moveTo(centerX, 0);
                for (i=0; i<=angle; ++i) {
                        p = Point.polar(radius, i * rad - pi2);
                        g.lineTo(centerX + p.x, centerY + p.y);
                }
 
                if (innerRadius != 0 && innerRadius < radius) {
                        for (i=angle; i>=0; --i) {
                                p = Point.polar(innerRadius, i * rad - pi2);
                                g.lineTo(centerX + p.x, centerY + p.y);
                        }
                }
        }
 
}

использовать так:
Код AS3:

import utils.drawCircleSector;
const sh:Shape = new Shape();
sh.graphics.beginFill(0xFFFFFF);
drawCircleSector(sh.graphics, 10, 10, 10, 235, 8);
sh.graphics.endFill();



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

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