球面化算法的研究

最近在研究图形球面化,网上查找到的信息很少,也许大家都藏着掖着,找到一些所谓的模型得到效果都不尽人意,其中找到一个是《微型机与应用》2001年第5期《球面化算法的研究》的论文按照它映射函数得到的效果实在是不尽人意,看来还是得自己去努力了。

对一张图形的一个圆形区域进行球化处理,形成PhotoShop 滤镜->扭曲->球面化的效果

如下所示

原图:(径为R)

球面化之后:

原图点A经过球面化之后变换到了A’的位置,那么点A和点A’是怎么变换的呢?

对比分析可以看出原图点A是沿原图半径方向变换到了A’的位置,其实一个圆形球面化是将圆形内的点均匀的向外扩展成一个球形。即以圆形的边为赤道,圆心为北极点的半球体,过球面的点A,点A’,北极点,赤道的圆心(即原图的圆心)得到一个切面如下图所示:

 

∵原图的点均匀扩展的 (意识到这点很重要):

∴2R->πR, 即得到扩展系数k=(πR)/(2R)= π/ 2

则L = OA * k

  α = L / R

OA’ = sin(α) * R = sin((π*OA)/(2*R))*R

 

有上面的转换公式我们可以对点A(x, y)球面化之后的新位置A’(x’,y’)进行推导了.设圆心为O(0, 0)

OA = sqrt(x *x + y*y)

OA’ =sin((π*OA)/(2*R))*R

OA , OA’与x轴的夹角β= atan(y/x)-----(注意到x <= 0的情况)

x’ = cos(β) * OA’

y’ = sin(β) * OA’

最终结果为:

 

x’ = cos(atan(y/x)) * sin((π*sqrt(x*x +y*y)) / (2*R)) * R

y’ = sin(atan(y/x)) * sin((π*sqrt(x*x +y*y)) / (2*R)) * R

这两个式子有木有化简的形式?忘了,有空得问问高中数学老师了。

经测试生成的图像与Photoshop的球面化滤镜效果一致,但是球面化的过程会导致像素的丢失,需要用到图形的插值算法(正在研究中------J)。

 

测试的代码已经上传,在我的共享资源-http://download.csdn.net/detail/xeral/3487473-旋转地球 屏保,得到效果与Photoshop效果一致,呵呵。

 

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值