Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Заливка контура (http://www.flasher.ru/forum/showthread.php?t=102742)

yava 21.10.2007 03:06

Заливка контура
 
Привет!

Для рисования кривых по точкам использовал функцию:
Код:


function Multicurve(Xargs, Yargs, closed)
{

        var Xmid = Xargs.slice(0);
        var Ymid = Yargs.slice(0);
        if ((Xmid.length != Ymid.length) || (Xmid.length < 2))
        {
                trace('Wrong Arguments');
                return this;
        }
        if (Xmid.length == 2)
        {
                this.moveTo(Xmid[0],Ymid[0]);
                this.lineTo(Xmid[1],Ymid[1]);
                delete Xmid;
                delete Ymid;
                return this;
        }
        var Xpoint = new Array();
        var Ypoint = new Array();
        for (var i = 1; i < Xmid.length - 2; i++)
        {
                Xpoint[i] = 0.5 * (Xmid[i + 1] + Xmid[i]);
                Ypoint[i] = 0.5 * (Ymid[i + 1] + Ymid[i]);
        }
        if (closed)
        {
                Xpoint[0] = 0.5 * (Xmid[1] + Xmid[0]);
                Ypoint[0] = 0.5 * (Ymid[1] + Ymid[0]);
                Xpoint[i] = 0.5 * (Xmid[i + 1] + Xmid[i]);
                Ypoint[i] = 0.5 * (Ymid[i + 1] + Ymid[i]);
                Xpoint[i + 1] = 0.5 * (Xmid[i + 1] + Xmid[0]);
                Ypoint[i + 1] = 0.5 * (Ymid[i + 1] + Ymid[0]);
                Xmid[i + 2] = Xmid[0];
                Ymid[i + 2] = Ymid[0];
                Xpoint[i + 2] = Xpoint[0];
                Ypoint[i + 2] = Ypoint[0];
        }
        else
        {
                Xpoint[0] = Xmid[0];
                Ypoint[0] = Ymid[0];
                Xpoint[i] = Xmid[i + 1];
                Ypoint[i] = Ymid[i + 1];
                Xmid.pop();
                Ymid.pop();
        }
        this.moveTo(Xpoint[0],Ypoint[0]);
        for (var i = 1; i < Xmid.length; i++)
        {
                this.curveTo(Xmid[i],Ymid[i],Xpoint[i],Ypoint[i]);
        }
        delete Xmid;
        delete Ymid;
        delete Xpoint;
        delete Ypoint;
        return this;
}
Object.prototype.multicurveTo = Multicurve;


Если при создании контура эту функцию использовать один раз, то все ок. Но если присоздании контура ее использовать дважду, в любых комбинациях, то при заливке появляются странные незапланированные артифакты. Хотя без заливки контур нормальный. С заливкой же контур имеет странную форму.
Подскажите, с чем это связано?

iNils 21.10.2007 03:29

А не рабочие и рабочие данные для примера где?

yava 22.10.2007 14:26

Вот тестовые данные.

1. Функция один раз ссылается на Multicurve. Здесь все нормально.
Код:

function drawTest()
{
       
        this.lineStyle(2,0x9fff999,255);
        xa = new Array();
        ya = new Array();

        this.beginFill(0xF02D17,255)

        xa[0] = 600;
        ya[0] = 20;
        xa[1] = 650;
        ya[1] = 30;
        xa[2] = 670;
        ya[2] = 80;
       

        this.moveTo(400,20)
        this.lineTo(600,20);
        this.multicurveTo(xa,ya,false);
       

        this.lineTo(400,20);
        this.endFill();
}
Object.prototype.drawTest = drawTest;

Вот отрицательный тестовый пример:
Код:

function drawTest()
{
       
        this.lineStyle(2,0x9fff999,255);
        xa = new Array();
        ya = new Array();

        this.beginFill(0xF02D17,255)

        xa[0] = 600;
        ya[0] = 20;
        xa[1] = 650;
        ya[1] = 30;
        xa[2] = 670;
        ya[2] = 80;
       

        this.moveTo(400,20)
        this.lineTo(600,20);
        this.multicurveTo(xa,ya,false);
       
        xa[0] = 670;
        ya[0] = 80;
        xa[1] = 650;
        ya[1] = 90;
        xa[2] = 400;
        ya[2] = 100;
       
        this.lineTo(670,80);
        this.multicurveTo(xa,ya,false);
        this.lineTo(400,20);
        this.endFill();
}
Object.prototype.drawTest = drawTest;

Но при этом, если во втором варианте не заливать фигуру,то контур будет правильным:
Код:


unction drawTest()
{
       
        this.lineStyle(2,0x9fff999,255);
        xa = new Array();
        ya = new Array();

        //this.beginFill(0xF02D17,255)

        xa[0] = 600;
        ya[0] = 20;
        xa[1] = 650;
        ya[1] = 30;
        xa[2] = 670;
        ya[2] = 80;
       

        this.moveTo(400,20)
        this.lineTo(600,20);
        this.multicurveTo(xa,ya,false);
       
        xa[0] = 670;
        ya[0] = 80;
        xa[1] = 650;
        ya[1] = 90;
        xa[2] = 400;
        ya[2] = 100;
       
        this.lineTo(670,80);
        this.multicurveTo(xa,ya,false);
        this.lineTo(400,20);
        //this.endFill();
}
Object.prototype.drawTest = drawTest;

Вот вроде все.

Kikasso 22.10.2007 15:13

Ну так вы же рисуете и рисуете, получается одна фигура. Если линии пересекаются, возможны дырки.
Надо в какой-то момент сказать endFill() и начать рисовать следующюю фигуру (beginFill)
А кстати зачем вы мультикривую в прототип к Object добавляете? Добавляйте к MovieClip, все равно никто кроме него рисовать не умеет.

yava 22.10.2007 15:57

Но ведь тут то и странность что линии не пересекаются!

wvxvw 22.10.2007 16:20

Код:

.....
for (var i = 1; i < Xmid.length; i++)
        {
                this.curveTo(Xmid[i],Ymid[i],Xpoint[i],Ypoint[i]);
        }
if(closed){
this.endFill();
}
        delete Xmid;
.....

А так?

yava 22.10.2007 18:10

Дело в том, что я рисую сложную фигуру из линий и кривых, и проблемс то в том, что не получается за один раз эту фигуру закрасить. И чем эта фигура сложнее, тем проблематичнее залатывать этот баг.

wvxvw 22.10.2007 18:20

А мой вариант не помог?
А вообще, да рисовал бы из простых составляющих, если сложно... зачем самому себе жизнь усложнять?
Т.е. разбей свою фигуру на простые примитивы, и рисуй по частям - во-первых, проще будет понять, где не сростается, во-вторых - тебе же легче будет.
Как тут уже сказали, если ты не будешь "поднимать-опускать перо" beginFill-endFill то и результаты могут быть далеко не теми, какие ты ожидаешь...

Или... еще проще, нарисуй на бумажке/в паинте чего собираешься рисовать, мб решение ещe проще.

yava 22.10.2007 18:34

Ок. Спасибо.


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

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