一张完整的图像可能是由若干个大小不同的图层组成的。如果由计算机将这若干个图层渲染成一张完整的图像,则需要根据图层的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},
// },