您的位置:首页 > 其它

(转)任意角度的高质量的快速的图…

2016-12-25 12:21 134 查看
E:优化内部循环的判断函数PixelsIsInPic,将判断展开到内部循环之外,跳过不需要处理的目标像素;

  
TRotaryClipData类用于寻找旋转需要处理的边界范围;算法思路是首先寻找原图片中心点对应的;

那条扫描线,然后依次向上和向下寻找边界; 
如果想要更快速的边界寻找算法,可以考虑利用像素的直线

  绘制原理来自动生成边界(有机会的时候再来实现它);

                  



                      
边界寻找算法图示

struct TRotaryClipData{

public:

    long
src_width;

    long
src_height;

    long
dst_width;

    long
dst_height;

    long
Ax_16;

    long
Ay_16;

    long
Bx_16;

    long
By_16;

    long
Cx_16;

    long
Cy_16;

public:

    long
out_dst_up_y;

    long
out_dst_down_y;

    long
out_src_x0_16;

    long
out_src_y0_16;

private:

    long
out_dst_up_x0;

    long
out_dst_up_x1;

    long
out_dst_down_x0;

    long
out_dst_down_x1;

public:

    inline long
get_up_x0(){ if (out_dst_up_x0<0) return
0;  else return out_dst_up_x0; }

    inline long
get_up_x1(){ if (out_dst_up_x1>=dst_width) return
dst_width;  else return out_dst_up_x1; }

    inline long
get_down_x0(){ if (out_dst_down_x0<0) return
0;  else return out_dst_down_x0; }

    inline long
get_down_x1(){ if (out_dst_down_x1>=dst_width)
return dst_width;  else return out_dst_down_x1;
}

    inline
bool is_in_src(long src_x_16,long src_y_16)

    {

        
return ( (
(src_x_16>=0)&&((src_x_16>>16)<src_width)
)

              
&& (
(src_y_16>=0)&&((src_y_16>>16)<src_height)
) );

    }

    void
find_begin_in(long dst_y,long&
out_dst_x,long& src_x_16,long&
src_y_16)

    {

       
src_x_16-=Ax_16;

       
src_y_16-=Ay_16;

       
while (is_in_src(src_x_16,src_y_16))

       
{

           
--out_dst_x;

           
src_x_16-=Ax_16;

           
src_y_16-=Ay_16;

       
}

       
src_x_16+=Ax_16;

       
src_y_16+=Ay_16;

    }

    bool
find_begin(long dst_y,long& out_dst_x0,long
dst_x1)

    {

       
long test_dst_x0=out_dst_x0-1;

       
long src_x_16=Ax_16*test_dst_x0 + Bx_16*dst_y + Cx_16;

       
long src_y_16=Ay_16*test_dst_x0 + By_16*dst_y + Cy_16;

       
for (long i=test_dst_x0;i<=dst_x1;++i)

       
{

           
if (is_in_src(src_x_16,src_y_16))

           
{

               
out_dst_x0=i;

               
if (i==test_dst_x0)

                   
find_begin_in(dst_y,out_dst_x0,src_x_16,src_y_16);

               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐