Форум 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=127108)

SashaBorandi 05.07.2009 19:41

Как нарисовать кольцо?
 
Как с помощью языка ActionScript 3.0 нарисовать кольцо? Да так чтобы можно было его использовать как маска для другого графического объекта.

ramshteks 05.07.2009 19:43

ну как нибудь так?

Код AS3:

graphics.beginFill(0,0);
graphics.drawCircle(0,0,100);
graphics.drawCircle(0,0,50);
graphics.endFill();


alatar 13.07.2009 11:10

По идее так не получится, кольцо должно быть разрезанным, иначе маска упростится до круга.

silin 13.07.2009 11:37

можно срисовать этот шейп в прозрачный битмап и использовать его как маску (и маска и маскируемый объект должны быть добавлены в дисплейлист и иметь cacheAsBitmap = true в этом случае)

Партизан 13.07.2009 12:05

Как вариант, можно использовать битмап и blendMode.ALPHA или blendMode.Erase. Один недостаток - придется делать такую маску на весь экран или больше чем границы маскируемого объекта.

Ну или отрисовать полукольцо вектором, и отразить копию.

Короче способов много.

iNils 13.07.2009 12:56

Буквально на днях столкнулся с этой же задачей. Манипуляции с блендом вроде дали нужный результат, но в итоге, при понижении качества отрисовки (качество в ролике меняется динамически при анимации), по краям маски появляется ореол.
В результате, я просто стал заливать кольцо битмапом.

Irradiance 13.07.2009 13:43

Так еще можно, только оптимизировать надо:
Код AS3:

public function drawSegment (_from:Number, _angle:Number, _length:int, _resolution:int):Sprite {
                        var sgm:Sprite = new Sprite();
                        var quality:Number = _angle/_resolution;
                        var p:Object;
                        var i:int;
                        if (quality > 20) {
                                _resolution = _angle/10;
                                quality = _angle/this.resolution;
                        }
                        this.graphics.beginFill(0);
                        for (i = 0; i <= _resolution; i++) {
                                p = radialToCartesian (_length, quality*i + _from);
                                this.graphics.lineTo(p.X, p.Y);
                        }
                        this.graphics.lineTo(0, 0);
                        this.graphics.endFill();
                        return sgm;
                }
 
                public function radialToCartesian (r:Number, a:Number):Object {
                        var X:Number = r*this.cosD(a);
                        var Y:Number = r*this.sinD(a);
                        return {X:X, Y:Y};
                }
 
                public function sinD (angle:Number):Number {
                        return Math.sin(this.degreesToRadian(angle));
                }
 
                public function cosD (angle:Number):Number {
                        return Math.cos(this.degreesToRadian(angle));
                }
 
                public function degreesToRadian (angle:Number):Number {
                        return angle * (Math.PI/180);
                }


Партизан 13.07.2009 14:33

Цитата:

Сообщение от Irradiance (Сообщение 835075)
Так еще можно, только оптимизировать надо:

С вашего так сказать, позволения :) Кстати, прикольная вещь...

Код AS3:

function drawSegment(_from:Number, _angle:Number, _length:int, _resolution:int,_width:int):Sprite {
        var sgm:Sprite = new Sprite();
        var quality:Number=_angle/_resolution;
        var p:Object;
        var i:int;
        if (quality>20) {
                _resolution=_angle/10;
                quality=_angle/this.resolution;
        }
        sgm.graphics.beginFill(0);
        for (i = 0; i <= _resolution; i++) {
                p=radialToCartesian(_length,quality*i+_from);               
                sgm.graphics.lineTo(p.X, p.Y);
        }
        for (var j = 0; j <= _resolution; j++) {               
                var p1=radialToCartesian(_length-_width,quality*j+_from);               
                sgm.graphics.lineTo(p1.X, p1.Y);
        }
        sgm.graphics.lineTo(0, 0);
        sgm.graphics.endFill();
        return sgm;
}
 
function radialToCartesian(r:Number, a:Number):Object {
        var X:Number=r*this.cosD(a);
        var Y:Number=r*this.sinD(a);
        return {X:X, Y:Y};
}
 
function sinD(angle:Number):Number {
        return Math.sin(this.degreesToRadian(angle));
}
 
function cosD(angle:Number):Number {
        return Math.cos(this.degreesToRadian(angle));
}
 
function degreesToRadian(angle:Number):Number {
        return angle * (Math.PI/180);
}
 
var sv:Sprite=drawSegment(0,360,100,100,30);
sv.x=200
sv.y=200
addChild(sv);



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

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