# 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")
}
```