# imagedd golang绘图库 ## 功能概述 imagedd是一个Go语言绘图库,提供了精灵图(Sprite)管理、2D图形绘制、图像渲染等功能。 ## 主要组件 ### 精灵图 (Sprite) 精灵图是基本的渲染单元,包含图像数据和位置信息。 ```go type Sprite struct { Name string // 精灵名称 Position image.Point // 精灵位置 Image image.Image // 精灵图像 Index int // 用于排序的索引 } ``` #### 精灵图操作 ```go // 移动精灵 sprite.Move(x, y int) // 旋转精灵 sprite.Rotate(angle float64) // 投影变换 sprite.Project(projectMatrix *ProjectMatrix) // 在精灵上绘制线条 sprite.DrawLine(line *Line) ``` ### 精灵板 (NamedSpriteBoard) 精灵板用于管理多个精灵,提供高效的添加、查找、排序功能。 ```go // 创建新的精灵板 board := sprite.NewNamedSpriteBoard() // 添加精灵 board.AddSprite(sprite) // 按名称查找精灵 foundSprite := board.GetSpriteByName("精灵名称") // 获取特定索引的所有精灵 sprites := board.GetSpritesByIndex(1) // 按名称删除精灵 board.RemoveSpriteByName("精灵名称") // 更新精灵的索引 board.UpdateSpriteIndex("精灵名称", 2) // 更新精灵的名称 board.UpdateSpriteName("旧名称", "新名称") // 获取所有精灵(按Index主排序,Name次排序) allSprites := board.GetAllSprites() // 渲染精灵板为图像 img := board.RenderToImage() // 保存为PNG文件 board.SaveToPng("output.png") ``` ### 2D图形组件 #### 线条 (Line) ```go // 创建线条 line := &sprite.Line{ Start: image.Point{X: 10, Y: 10}, End: image.Point{X: 100, Y: 100}, Width: 2, Color: color.RGBA{255, 0, 0, 255}, // 红色 } // 添加到精灵 line.AddToSprite(sprite) ``` #### 圆形 (Circle) ```go // 创建圆形 circle := &sprite.Circle{ Center: image.Point{X: 50, Y: 50}, Radius: 30, Color: color.RGBA{0, 0, 255, 255}, // 蓝色 } // 添加到精灵 circle.AddToSprite(sprite) ``` #### 投影矩阵 (ProjectMatrix) ```go // 创建投影矩阵 matrix := &sprite.ProjectMatrix{ Matrix: [2][2]float64{ {1.0, 0.5}, {0.0, 1.0}, }, } // 投影点 newPoint := matrix.ProjectPoint(image.Point{X: 10, Y: 20}) // 投影线条 newLine := matrix.ProjectLine(line) ``` ## 渲染特性 - 支持精灵的层级渲染(通过Index控制) - 支持精灵的名称索引(O(1)时间复杂度查找) - 支持负坐标位置的精灵 - 自动计算画布大小以适应所有精灵 - 处理超出边界的精灵(裁剪) ## 使用示例 ```go package main import ( "image" "image/color" "git.lxtend.com/lixiangwuxian/imagedd/sprite" ) func main() { // 创建精灵板 board := sprite.NewNamedSpriteBoard() // 创建精灵 sprite1 := &sprite.Sprite{ Name: "背景", Position: image.Point{0, 0}, Index: 0, } // 创建圆形并添加到精灵 circle := &sprite.Circle{ Center: image.Point{50, 50}, Radius: 30, Color: color.RGBA{0, 0, 255, 255}, } circle.AddToSprite(sprite1) // 添加到精灵板 board.AddSprite(sprite1) // 创建第二个精灵 sprite2 := &sprite.Sprite{ Name: "线条", Position: image.Point{20, 20}, Index: 1, } // 创建线条并添加到精灵 line := &sprite.Line{ Start: image.Point{0, 0}, End: image.Point{100, 100}, Width: 2, Color: color.RGBA{255, 0, 0, 255}, } line.AddToSprite(sprite2) // 添加到精灵板 board.AddSprite(sprite2) // 渲染并保存 board.SaveToPng("output.png") } ```