完成基本功能

This commit is contained in:
zyj
2026-03-09 16:46:15 +08:00
parent d8851e7698
commit f55dd8ca03
57 changed files with 16098 additions and 6 deletions

143
tools/gen_logo.go Normal file
View File

@@ -0,0 +1,143 @@
// 生成 GitPilot Logo — 极简风格:圆角深色背景 + 大号 Git 分支符号
package main
import (
"image"
"image/color"
"image/png"
"math"
"os"
)
const size = 1024
func main() {
img := image.NewRGBA(image.Rect(0, 0, size, size))
bg := color.RGBA{30, 30, 46, 255} // #1e1e2e
blue := color.RGBA{137, 180, 250, 255} // #89b4fa
green := color.RGBA{166, 227, 161, 255} // #a6e3a1
cx := size / 2
cy := size / 2
// 1. 圆角背景
roundedRect(img, 0, 0, size, size, 220, bg)
// 2. 主干竖线 — 粗实线
thickLine(img, cx, cy-280, cx, cy+280, 50, blue)
// 3. 分支曲线 — 从主干中上方向右上弯出
smoothBranch(img, cx, cy-60, cx+200, cy-260, 40, green)
// 4. 三个实心节点
filledCircle(img, cx, cy-260, 56, blue) // 顶部
filledCircle(img, cx, cy+260, 56, blue) // 底部
filledCircle(img, cx+200, cy-260, 48, green) // 分支端
// 保存
save(img, "build/appicon.png")
save(img, "frontend/public/appicon.png")
println("✅ GitPilot Logo 已生成!")
}
// --- 绘图工具 ---
func roundedRect(img *image.RGBA, x0, y0, x1, y1, r int, c color.RGBA) {
for y := y0; y < y1; y++ {
for x := x0; x < x1; x++ {
dx, dy := 0, 0
if x < x0+r && y < y0+r {
dx, dy = x0+r-x, y0+r-y
} else if x > x1-r-1 && y < y0+r {
dx, dy = x-(x1-r-1), y0+r-y
} else if x < x0+r && y > y1-r-1 {
dx, dy = x0+r-x, y-(y1-r-1)
} else if x > x1-r-1 && y > y1-r-1 {
dx, dy = x-(x1-r-1), y-(y1-r-1)
}
dist := math.Sqrt(float64(dx*dx + dy*dy))
if dist <= float64(r)+0.5 {
if dist > float64(r)-1 {
blend(img, x, y, c, float64(r)+0.5-dist)
} else {
img.SetRGBA(x, y, c)
}
}
}
}
}
func filledCircle(img *image.RGBA, cx, cy, r int, c color.RGBA) {
for y := cy - r - 1; y <= cy+r+1; y++ {
for x := cx - r - 1; x <= cx+r+1; x++ {
dist := math.Hypot(float64(x-cx), float64(y-cy))
if dist <= float64(r)+0.5 {
if dist > float64(r)-1 {
blend(img, x, y, c, float64(r)+0.5-dist)
} else {
img.SetRGBA(x, y, c)
}
}
}
}
}
func thickLine(img *image.RGBA, x0, y0, x1, y1, thickness int, c color.RGBA) {
dx := float64(x1 - x0)
dy := float64(y1 - y0)
length := math.Hypot(dx, dy)
if length == 0 {
return
}
steps := int(length * 1.5)
for i := 0; i <= steps; i++ {
t := float64(i) / float64(steps)
px := float64(x0) + dx*t
py := float64(y0) + dy*t
filledCircle(img, int(math.Round(px)), int(math.Round(py)), thickness/2, c)
}
}
func smoothBranch(img *image.RGBA, x0, y0, x1, y1, thickness int, c color.RGBA) {
// 二次贝塞尔: 控制点使起点水平、终点竖直
cpx := float64(x1)
cpy := float64(y0)
steps := 120
prevX, prevY := float64(x0), float64(y0)
for i := 1; i <= steps; i++ {
t := float64(i) / float64(steps)
u := 1.0 - t
px := u*u*float64(x0) + 2*u*t*cpx + t*t*float64(x1)
py := u*u*float64(y0) + 2*u*t*cpy + t*t*float64(y1)
thickLine(img, int(prevX), int(prevY), int(px), int(py), thickness, c)
prevX, prevY = px, py
}
}
func blend(img *image.RGBA, x, y int, c color.RGBA, alpha float64) {
if x < 0 || y < 0 || x >= size || y >= size || alpha <= 0 {
return
}
if alpha > 1 {
alpha = 1
}
e := img.RGBAAt(x, y)
img.SetRGBA(x, y, color.RGBA{
R: uint8(float64(e.R)*(1-alpha) + float64(c.R)*alpha),
G: uint8(float64(e.G)*(1-alpha) + float64(c.G)*alpha),
B: uint8(float64(e.B)*(1-alpha) + float64(c.B)*alpha),
A: uint8(math.Min(255, float64(e.A)+float64(c.A)*alpha)),
})
}
func save(img *image.RGBA, path string) {
f, err := os.Create(path)
if err != nil {
panic(err)
}
defer f.Close()
png.Encode(f, img)
println(" 保存:", path)
}