lineStyle() внутри для цикла создает несвязанные углы

Вот мой код (сжато для рассматриваемой функции):

public function redrawNewShape() {
        var tempAX:Number;
        var tempAY:Number;
        var tempBX:Number;
        var tempBY:Number;
        var tempLineThickness:Number;
        var tempLineColour:uint;
        var tempLineJoints:String;
        var tempLineMiter:Number;
        var tempSprite:Sprite;

        tempSprite = new Sprite;
        tempSprite = shapeArray[1];
        tempSprite.graphics.clear()

        if (fillTransparency == 0) {            
            tempSprite.graphics.beginFill(shapeArray[3],1);
        }

        tempSprite.graphics.moveTo(linesArray[(linesArray.length - 2)],linesArray[(linesArray.length - 1)]);

        for (var d = 0; d < (linesArray.length/4); d++) {
            tempAX = linesArray[(d*4)];
            tempAY = linesArray[((d*4)+1)];
            tempBX = linesArray[((d*4)+2)];
            tempBY = linesArray[((d*4)+3)];
            tempLineThickness = lineStyleArray[(d*4)];
            tempLineColour = lineStyleArray[((d*4)+1)];
            tempLineMiter = lineStyleArray[((d*4)+3)];

            if (lineStyleArray[((d*4)+2)] == 0) {
                tempLineJoints = JointStyle.MITER;
            } else if (lineStyleArray[((d*4)+2)] == 1) {
                tempLineJoints = JointStyle.ROUND;
            } else if (lineStyleArray[((d*4)+2)] == 2) {
                tempLineJoints = JointStyle.BEVEL;
            }

            tempSprite.graphics.lineStyle(tempLineThickness,tempLineColour,1,false,"normal","none",tempLineJoints,tempLineMiter)
            tempSprite.graphics.curveTo(tempAX,tempAY,tempBX,BY)                
            }

        if (fillTransparency == 0) {            
            tempSprite.graphics.endFill();
        }
    }

Эта функция перерисовывает фигуру в моей программе, определенную атрибутами в массивах shapeArray, linesArray и lineStyleArray. Проблема в том, что углы фигуры в моей программе не связаны, независимо от того, какой я установил JointStyle.

(Я не могу загрузить пример изображения, потому что у меня нет как минимум 10 репутации. Представьте себе две толстые линии без заглавных букв, соединяющихся под углом 90 градусов. Вместо закругления, скошения или выточки угла в форме есть разрыв квадратной половины ширины двух линий.)

Но я не понимаю, почему углы соединяются, если я помещаю tempSprite.graphics.lineStyle вне цикла for. В ссылке Actionscript 3.0 в lineStyle говорится, что

"Вы можете вызвать метод lineStyle() в середине рисования пути, чтобы указать разные стили для разных отрезков в пределах пути".

так почему это не работает внутри цикла?

Пример размещения lineStyle вне цикла for (с временными значениями, добавленными вручную):

public function redrawNewShape() {
        var tempAX:Number;
        var tempAY:Number;
        var tempBX:Number;
        var tempBY:Number;
        var tempLineThickness:Number;
        var tempLineColour:uint;
        var tempLineJoints:String;
        var tempLineMiter:Number;
        var tempSprite:Sprite;

        tempSprite = new Sprite;
        tempSprite = shapeArray[1];
        tempSprite.graphics.clear()

        if (fillTransparency == 0) {            
            tempSprite.graphics.beginFill(shapeArray[3],1);
        }

        tempSprite.graphics.moveTo(linesArray[(linesArray.length - 2)],linesArray[(linesArray.length - 1)]);
        tempSprite.graphics.lineStyle(10,0x000000,1,false,"normal","none","miter",3)

        for (var d = 0; d < (linesArray.length/4); d++) {
            tempAX = linesArray[(d*4)];
            tempAY = linesArray[((d*4)+1)];
            tempBX = linesArray[((d*4)+2)];
            tempBY = linesArray[((d*4)+3)];
            tempLineThickness = lineStyleArray[(d*4)];
            tempLineColour = lineStyleArray[((d*4)+1)];
            tempLineMiter = lineStyleArray[((d*4)+3)];

            if (lineStyleArray[((d*4)+2)] == 0) {
                tempLineJoints = JointStyle.MITER;
            } else if (lineStyleArray[((d*4)+2)] == 1) {
                tempLineJoints = JointStyle.ROUND;
            } else if (lineStyleArray[((d*4)+2)] == 2) {
                tempLineJoints = JointStyle.BEVEL;
            }

            tempSprite.graphics.curveTo(tempAX,tempAY,tempBX,tempBY)                
            }

        if (fillTransparency == 0) {            
            tempSprite.graphics.endFill();
        }
    }

1 ответ

Вполне вероятно, что изменение lineStyle в середине пути перезапускает новый сегмент и применяет текущий CapStyle.

Попытайтесь выяснить сложность вычисления соединений в случае, если вы измените толщину линии в углу.

Другие вопросы по тегам