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)]);

        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 (со значениями temp, добавленными вручную):

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();
        }
    }

person user3247094    schedule 29.01.2014    source источник


Ответы (1)


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

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

person Yves Daoust    schedule 29.01.2014
comment
Углы не имеют зазора, когда я меняю CapStyle на Round или Square. Но тогда я не могу использовать Mitre JointStyle, чего я и хочу. - person user3247094; 29.01.2014
comment
Мой ответ должен был сказать вам, что это слишком сложно реализовать, поэтому не поддерживается. - person Yves Daoust; 29.01.2014