实现扫描线算法

时间:2015-02-10 06:23:02

标签: javascript algorithm webgl scanline

我正在尝试为随机三角形实现扫描线填充算法,给出3个点作为数组和颜色。我得到了一些奇怪的结果。请忽略代码的优化,我只是想让它工作,然后尝试优化它。我有一种方法,它使用Bresenham线算法绘制线条。 我无法弄清楚为什么我会得到这些结果。 http://postimg.org/image/qh1sdizwv/

    var dx1;
    var dx2;
    var dx3;

    var S= new Int32Array([0,0]);
    var E= new Int32Array([0,0]);

    var A=new Int32Array([0,0]);
    var B=new Int32Array([0,0]);
    var C=new Int32Array([0,0]);

    var xmin = Math.min(v0[0],v1[0],v2[0]);
    var xmax = Math.max(v0[0],v1[0],v2[0]);
    var ymin = Math.min(v0[1],v1[1],v2[1]);
    var ymax = Math.max(v0[1],v1[1],v2[1]);

    /*A,B and C are points sorted by y-coordinates
      A[1] is ymin, C[1] is ymax
      S is for start, E is for end*/

    if((ymin==v0[1]) && (ymax==v2[1])){
      A[0]=v0[0];
      A[1]=v0[1];
      B[0]=v1[0];
      B[1]=v1[1];
      C[0]=v2[0];
      C[1]=v2[1];
    }

    if((ymin==v0[1]) && (ymax==v1[1])){
      A[0]=v0[0];
      A[1]=v0[1];
      B[0]=v2[0];
      B[1]=v2[1];
      C[0]=v1[0];
      C[1]=v1[1];
    }

    if((ymin==v1[1]) && (ymax==v2[1])){
      A[0]=v1[0];
      A[1]=v1[1];
      B[0]=v0[0];
      B[1]=v0[1];
      C[0]=v2[0];
      C[1]=v2[1];
    }

    if((ymin==v1[1]) && (ymax==v0[1])){
      A[0]=v1[0];
      A[1]=v1[1];
      B[0]=v2[0];
      B[1]=v2[1];
      C[0]=v0[0];
      C[1]=v0[1];
    }

    if((ymin==v2[1]) && (ymax==v0[1])){
      A[0]=v2[0];
      A[1]=v2[1];
      B[0]=v1[0];
      B[1]=v1[1];
      C[0]=v0[0];
      C[1]=v0[1];
    }

    if((ymin==v2[1]) && (ymax==v1[1])){
      A[0]=v2[0];
      A[1]=v2[1];
      B[0]=v0[0];
      B[1]=v0[1];
      C[0]=v1[0];
      C[1]=v1[1];
    }

    if(B[1]-A[1] >0)
      dx1=((B[0]-A[0])/(B[1]-A[1]));
    else
      dx1=0;

    if(C[1]-A[1] >0)
      dx2=((C[0]-A[0])/(C[1]-A[1]));
    else
      dx2=0;

    if(C[1]-B[1] >0)
      dx3=((C[0]-B[0])/(C[1]-B[1]));
    else
      dx3=0;

    S[0]=A[0];
    S[1]=A[1];
    E[0]=A[0];
    E[1]=A[1];

    if(dx1>dx2){
      for(;S[1]<=B[1]; S[1]++, E[1]++, S[0]=S[0]+dx2, E[0]=E[0]+dx1)
        bresenhamAlg(S,E,color);

      E[0]=B[0];
      E[1]=B[1];
      for(;S[1]<=C[1]; S[1]++, E[1]++, S[0]=S[0]+dx2, E[0]=E[0]+dx3)
        bresenhamAlg(S,E,color);
    }

    else{
      for(;S[1]<=B[1]; S[1]++, E[1]++, S[0]=S[0]+dx1, E[0]=E[0]+dx2)
        bresenhamAlg(S,E,color);

      S[0]=B[0];
      S[1]=B[1];
      for(;S[1]<=C[1]; S[1]++, E[1]++, S[0]=S[0]+dx3, E[0]=E[0]+dx2)
        bresenhamAlg(S,E,color);
    }

0 个答案:

没有答案