Pixi.js: Recurso ausente: linha tracejada

Criado em 8 jan. 2015  ·  9Comentários  ·  Fonte: pixijs/pixi.js

Não pode desenhar linha tracejada?

🙏 Feature Request

Comentários muito úteis

Se alguém estiver procurando por esse recurso, aqui está minha implementação de linha tracejada para desenhar polígonos.
https://codepen.io/unrealnl/pen/aYaxBW

Todos 9 comentários

+1 para este recurso. Seria muito bom ter.

Uma função que faz muitas operações lineTo + moveTo pode obter uma linha tracejada.

Internamente, provavelmente é assim que seria feito no canvas2D. No WebGL, você pode fazer o mesmo ou aplicar o traço no sombreador de fragmento. O último é mais complicado e também leva a uma taxa de preenchimento desnecessária, mas custa menos em termos de largura de banda de vértices. Outra abordagem é usar um padrão de textura repetido para criar o pontilhado.

IMHO isso não precisa fazer parte do Pixi, pois há muitas maneiras de implementá-lo e exatamente qual solução você escolhe pode depender muito do seu aplicativo.

Eu posso entender o ponto de vista @mattdesl e não é muito difícil implementar uma linha tracejada para, por exemplo, uma linha reta. Mas como estou trabalhando em um projeto com gráficos bastante complexos, incluindo curvas e splines, seria muito bom ter esse recurso incluído no pixi.

Após o anúncio de primitivos para pixi @GoodBoyDigital disse que está na lista de tarefas (aqui em um comentário: http://www.goodboydigital.com/pixi-webgl-primitives/). Então eu realmente esperava que chegasse logo.

E também acho que seria bom que o pixi suportasse pelo menos as operações de desenho que estão disponíveis para tela.

fechando isso por enquanto, pois ainda não temos planos de implementar linhas pontilhadas. Obrigado!

Eu também encontrei esse problema e resolvi de maneira simples.
aqui está o código:

function drawdash(x0,y0,x1,y1,linewidth){
        var dashed = new PIXI.Graphics();
        dashed.lineStyle(1, 0x59e3e8, 1); // linewidth,color,alpha
        dashed.moveTo(0, 0);
        dashed.lineTo(linewidth,0);
        dashed.moveTo(linewidth*1.5,0);
        dashed.lineTo(linewidth*2.5,0);
        var dashedtexture = dashed.generateCanvasTexture(1,1);
        var linelength=Math.pow(Math.pow(x1-x0,2) + Math.pow(y1-y0,2) , 0.5);
        var tilingSprite = new PIXI.extras.TilingSprite(dashedtexture, linelength, linewidth);
        tilingSprite.x=x0;
        tilingSprite.y=y0;
        tilingSprite.rotation = angle(x0,y0,x1,y1)*Math.PI/180;
        tilingSprite.pivot.set(linewidth/2, linewidth/2);
        return tilingSprite;
        function angle(x0,y0,x1,y1){
                var diff_x = Math.abs(x1 - x0),
                    diff_y = Math.abs(y1 - y0);
                var cita;
               if(x1>x0){
                    if(y1>y0){
                        cita= 360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                    }else
                   {
                        if(y1<y0){ 
                            cita=-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else{  
                            cita=0;
                        }
                    }
                }else
                {
                    if(x1<x0){
                        if(y1>y0){
                            cita=180-360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                        }else
                        {
                            if(y1<y0){ 
                                cita=180+360*Math.atan(diff_y/diff_x)/(2*Math.PI);
                            }else{  
                                cita=180;
                            }
                        } 
                    }else{ 
                        if(y1>y0){ 
                            cita=90;
                        }else
                        {
                            if(y1<y0){ 
                                cita=-90;
                            }else{  
                                cita=0;
                            }
                        }
                    }
                }
                return cita;
        }
}

usage:

var linewidth=5;
var tilingSprite = drawdash(100,100,100,400,linewidth);
app.stage.addChild(tilingSprite);
app.ticker.add(function(delta) {
    tilingSprite.tilePosition.x += 0.5*delta;
});

pode ajudar?

Existe algum plano de revisitar esse recurso? Seria bom ter a paridade funcional com o CanvasRenderingContext2D.

Se alguém estiver procurando por esse recurso, aqui está minha implementação de linha tracejada para desenhar polígonos.
https://codepen.io/unrealnl/pen/aYaxBW

Outro exemplo simples de linha tracejada:

https://codepen.io/bokos/pen/EeBXgR

PIXI.Graphics.prototype.drawDashLine = function(toX, toY, dash = 16, gap = 8) {
  const lastPosition = this.currentPath.shape.points;

  const currentPosition = {
    x: lastPosition[lastPosition.length - 2] || 0,
    y: lastPosition[lastPosition.length - 1] || 0
  };

  const absValues = {
    toX: Math.abs(toX),
    toY: Math.abs(toY)
  };

  for (
    ;
    Math.abs(currentPosition.x) < absValues.toX ||
    Math.abs(currentPosition.y) < absValues.toY;
  ) {
    currentPosition.x =
      Math.abs(currentPosition.x + dash) < absValues.toX
        ? currentPosition.x + dash
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + dash) < absValues.toY
        ? currentPosition.y + dash
        : toY;

    this.lineTo(currentPosition.x, currentPosition.y);

    currentPosition.x =
      Math.abs(currentPosition.x + gap) < absValues.toX
        ? currentPosition.x + gap
        : toX;
    currentPosition.y =
      Math.abs(currentPosition.y + gap) < absValues.toY
        ? currentPosition.y + gap
        : toY;

    this.moveTo(currentPosition.x, currentPosition.y);
  }
};

Este tópico foi bloqueado automaticamente, pois não houve nenhuma atividade recente depois que ele foi fechado. Por favor, abra um novo problema para bugs relacionados.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

softshape picture softshape  ·  3Comentários

SebastienFPRousseau picture SebastienFPRousseau  ·  3Comentários

readygosports picture readygosports  ·  3Comentários

distinctdan picture distinctdan  ·  3Comentários

zcr1 picture zcr1  ·  3Comentários