记一次图层合并算法设计

    一张完整的图像可能是由若干个大小不同的图层组成的。如果由计算机将这若干个图层渲染成一张完整的图像,则需要根据图层的z值(也可以理解为远近关系,z值越大,从视觉角度来看,图层被显现的内容越多),所以,一般渲染过程,就是将图层根据z值进行升序排序,然后从z值最小的图层开始依次渲染。每个图层都是固定大小的矩形(即使生活中我们看到各种形状的图形,它们其实是被包含到一个矩形区域"RGBA画布"中)。

    而今天讨论的主题是如何将图层合并,从而减少计算机的计算量(前提:此处可以忽略合并图层带来计算量)。我觉得人类的智慧是比较直接的,从视觉上获得影像,并能分析出可以将哪些图层进行合并(最优)。但是让计算机进行分析时,我们要告诉它图层之间的关系和可以合并的条件。而图层之间的关系模型,可以看成是上层(z值大)图层依赖下层(z值小)图层,所以就可以使用拓扑关系模型构建图层之间的关系。约定上层图层只能依赖下层图层(在算法实现中,上层图层只依赖了一个下层图层,目的是为了让图层之间的关系更简单),所以就不会不存在闭环,但是一个图层可以被多个上层图层依赖。

    算法实现:

package main

import "fmt"

const (
	_LAYER_TYPE_STATIC  = 1	// 支持图层合并
	_LAYER_TYPE_DYNAMIC = 2	// 不支持图层合并
)

type Point struct {
	X, Y int
}

type Layer struct {
	i int
	layerType int
	area *Area
}

type Area struct {
	minP, maxP Point
}

type MergedLayer struct {
	idx int
	layerType int
	cover *Area
	layers []*Layer
}

type LayerStore struct {
	up []*LayerStore
	l *Layer
	cover *Area
	mergedLayers []*Layer
	p int
}

// 测试
func main() {
	// 10000+2500+10000+2500+17500+2500
	layers := []*Layer{
		// &Layer{
		// 	i: 1,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 100},
		// 		maxP: Point{X: 200, Y: 200},
		// 	},
		// },
		// &Layer{
		// 	i: 2,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 200},
		// 		maxP: Point{X: 200, Y: 300},
		// 	},
		// },
		// &Layer{
		// 	i: 3,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 150},
		// 		maxP: Point{X: 200, Y: 250},
		// 	},
		// },
		// &Layer{
		// 	i: 1,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 100},
		// 		maxP: Point{X: 200, Y: 200},
		// 	},
		// },
		// &Layer{
		// 	i: 2,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 150},
		// 		maxP: Point{X: 200, Y: 250},
		// 	},
		// },
		// &Layer{
		// 	i: 3,
		// 	layerType: _LAYER_TYPE_STATIC,
		// 	area: &Area{
		// 		minP: Point{X: 100, Y: 200},
		// 		maxP: Point{X: 200, Y: 300},
		// 	},
	
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值