类似horizon效果的实现

最近小项目中需要解决一些抗锯齿的问题,刚接触这个的时候查了很多资料,这里特别感觉一个朋友,谢谢他在我解决这个问题的时候给予的建议与帮助。

在horizon App中,屏幕中的矩形框随着手机的角度而不停的变换,但是矩形框在某些角度下会产生明显的锯齿,会影响显示效果。采取两种方案解决锯齿问题。

方案1:opengl的简单实现,刚接触opengl,对一些api不是很熟,在PC端单间做了一下测试:

       1)code如下:    

float width = 1.0;
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glLineWidth(width);

glBegin(GL_LINE_LOOP);
glVertex3f(0, 0.0198, 0.0) ;
glColor3f(1.0,1.0,1.0);
glVertex3f(0.0301, 0.9877, 0.0) ;
glColor3f(1.0,1.0,1.0);
glVertex3f(1.0, 0.9802, 0.0) ;
glColor3f(1.0,1.0,1.0);
glVertex3f(0.9699, 0.01031, 0.0) ;
glColor3f(1.0,1.0,1.0);
glEnd();

glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
glFlush();//先画矩形框的四个边界(这个是在测试过程中)

glColor3f(1.0,1.0,1.0);
glBegin(GL_QUADS);
glVertex3f(0, 0.0198, 0.0) ;
glVertex3f(0.0301, 0.9877, 0.0) ;
glVertex3f(1.0, 0.9802, 0.0) ;
glVertex3f(0.9699, 0.01031, 0.0) ;
glEnd();//画矩形框

在实际的测试中,如果没有画出无锯齿的矩形框而直接画出填充的矩形,这样锯齿是解决不了的。

但是这个没有在android端实现,gl_line_smooth在android端没有效果,可能自己没有用对。有在网上查到用FBO,这个需要在3.0以上的版本上才可以用,而且很复杂,没有进行深入的查阅。

2)效果图:

方案2:抗锯齿的边界算法

    抗锯齿这里主要用了融合的原理,当处于当前直线点的像素值的时候,融合底层像素值与直线像素的值。

    在图像中,先根据旋转角度求取出矩形框在图像中的四个顶点,求出四条直线的函数方程。抗锯齿的过程如下:

1.根据直线方程以及点到直线的距离判断点在矩形框内的分布情况;

2.若当前设置的矩形边界宽度为W,当点到直线的距离小于W/2的时候就认为当前点是直线上的点,距离大于W/2的时候根据点的分布情况设置矩形内外的值。

       当直线距离小于W/2的时候,进行融合过程处理。

       融合值主要是由距离的exp获取,当距离越大的时候权值越低,exp函数又可以达到平滑的效果。

方案2:抗锯齿的边界算法优化

     无需判断点在矩形分布的内外情况。

1. 反向插值。当前的旋转矩形框放大到原始尺寸的大小,并进行旋转到原始方向,若当前点经过反向插值以后不再原始框的区域内,说明此点不在旋转的矩形框内,若在的话说明此点在旋转的矩形框内(如下所示)。

2. 距离计算。最原始的时候:点到直线的距离是计算点到四条旋转曲线的距离。而当前算法中:点到直线的距离,四条直线是不会变换的,就是原始矩形框的四条边界。

3. 融合过程。上一方案的融合过程类似。

这一方案的关键code如下:

    rstData = zeros(m,n,k);//结果像素
    linew = 1;//线宽
    lineData = ones(1,1,3) * 255;//线的像素
    for j = 1:m
        for i = 1:n   //遍历图像像素
            trans_before = [i;j;1];
            trans_end1 = S * trans_before + T;
            trans_end1 = R * (trans_end1 - T1) + T1;  //S、T、R仿射矩阵
            y = trans_end1(2);x = trans_end1(1);

            dis = min( min(y,m - y),min(x,n-x));
            ap = abs(abs(dis)) /f/linew ;
            a = exp(-1.0 *  ap^2);
            a = sqrt(a);
            y = round(y);x = round(x);
             if y < 0 | y > m | x < 0 | x > n
                rstData(j,i,:) = lineData * a + Image(j,i,:) * 0.4 * (1 - a);
             else
                rstData(j,i,:) = lineData * a + Image(j,i,:) * (1 - a);
             end//融合处理过程
        end
    end
    figure,imshow(uint8(rstData));

效果图如下:

   

方案2、3效果上可能与opengl的效果有些差别,但是已经很好的去除了锯齿。

时间: 2024-10-12 19:02:40

类似horizon效果的实现的相关文章

Android自定义类似ProgressDialog效果的Dialog

Android自定义类似ProgressDialog效果的Dialog. 方法如下: 1.首先准备两张自己要定义成哪样子的效果的图片和背景图片(也可以不要背景). 如我要的效果: 2.定义loading_dialog.xml布局文件(这里你也可以按自己的布局效果定义,关键是要有个imageView): [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <LinearLayout

ListView实现类似WheelView效果的探究

不得不说,作为一名安卓码农,总是会有蛋蛋的忧伤,因为CP常说的就是:你看,人家ios的那个效果好炫酷,比如下面这样的 作为一名合格的码农,实在不能忍,最后还是实现了这个效果,虽然没有ios的厉害... 实现的思路还是不复杂的,主要分两个方向:WheelView类似的思想(github一大堆).ClipToPadding和ClipChildren取巧.因为我是用的取巧,所以我们下面只谈第二种方法. 难点有两个,一是精确地控制listview的item滚动到悬浮框内.因为大多数时候都不会是某个ite

android 上下左右都能滑动的是类似scorllview效果

上下左右都能滑动且带平滑效果的类似scorllview 代码:HVScrollView.java package com.yqy.yqy_frame.view; import java.util.List; import android.content.Context; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.view.Foc

ios根据文本自适应 然后 搭建类似如下效果

UIView * headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tbSecond.size.width, 0)]; headView.backgroundColor = [UIColor whiteColor]; UIView * view = [[UIView alloc]initWithFrame:CGRectMake(30, 40, self.tbSecond.bounds.size.width - 90, 0)

博主教你制作类似9patch效果的iOS图片拉伸

下面张图片,本来是设计来做按钮背景的:   button.png,尺寸为:24x60 现在我们把它用作为按钮背景,按钮尺寸是150x50: C代码   // 得到view的尺寸 CGSize viewSize = self.view.bounds.size; // 初始化按钮 UIButton *button = [[UIButton alloc] init]; // 设置尺寸 button.bounds = CGRectMake(0, 0, 150, 50); // 设置位置 button.c

JSP中使用SIteMesh实现类似母版效果

1.sitemesh官网 http://www.baidu.com/link?url=vOHcgbkFz2ppR8BWjrPn-RXfc5WtmWxxfmYv8Uf_qnB6C4D5p_-7Q3ap4JXnqGoX 2.介绍 SiteMesh框架是OpenSymphony团队开发的一个非常优秀的页面装饰器框架,它通过对用户请求进行过滤,并对服务器向客户端响应也进行过滤,然后给原始页面加入一定的装饰(header,footer等),然后把结果返回给客户端.通过SiteMesh的页面装饰,可以提供更

实现类似toast效果的圆角dialog警告框

在最近的项目中需要用到一个类似于toast效果的警告框,而且还要是圆角的.下面是我实现的效果截图: 首先定义一个dialog: package com.bobge.doura.customview; import android.app.Dialog; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearL

Java中没有C#的out关键字,但可以通过数组实现类似的效果

其实传递的就是数组的指针,里面的每一项的值还是那块内存,所以能直接操作里面的值.如果单纯传指定的值,那么里面操作的就是新的一块内存块. 用数组实现的效果如下: class B{ String cnt=null; public static void main(String[] args) { B t=new B();//实例化一个对象 String a=null; String[]s=new String[1]; B b=new B(); Object o=null; t.test1(a); S

WPF 基于Adorner实现类似Popup效果

1.  什么是Adorner 装饰器是一种特殊类型的FrameworkElement,可用来向用户提供可视提示. 装饰器有很多用途,可用来向元素添加功能句柄,或者提供有关某个控件的状态信息. 2.  使用Adorner实现Popup的原因 1. 通过AdornerLayer存在与独立的布局系统,不会与界面布局环论 2. 使用过WPF中的Popup就可以知道Popup中有许多的限制(例如需要实现某些效果比较麻烦) 3. 效果 4. 主要实现 1. Popup中当StaysOpen为False的情况