canvas/geometry.go

55 lines
1.3 KiB
Go

package canvas
import (
"image"
"math"
)
// 变换点坐标
func (c *Context) transformPoint(x, y float64) image.Point {
// 应用变换矩阵 [a, b, c, d, e, f]
// | a c e | | x |
// | b d f | * | y |
// | 0 0 1 | | 1 |
tx := x*c.state.transform[0] + y*c.state.transform[2] + c.state.transform[4]
ty := x*c.state.transform[1] + y*c.state.transform[3] + c.state.transform[5]
return image.Point{X: int(tx), Y: int(ty)}
}
// 计算两点之间的距离
func distance(x1, y1, x2, y2 float64) float64 {
dx := x2 - x1
dy := y2 - y1
return math.Sqrt(dx*dx + dy*dy)
}
// 计算贝塞尔曲线点
func bezierPoint(t float64, p0, p1, p2, p3 float64) float64 {
u := 1 - t
tt := t * t
uu := u * u
uuu := uu * u
ttt := tt * t
// (1-t)^3 * P0 + 3 * (1-t)^2 * t * P1 + 3 * (1-t) * t^2 * P2 + t^3 * P3
return uuu*p0 + 3*uu*t*p1 + 3*u*tt*p2 + ttt*p3
}
// 计算二次贝塞尔曲线点
func quadraticPoint(t float64, p0, p1, p2 float64) float64 {
u := 1 - t
return u*u*p0 + 2*u*t*p1 + t*t*p2
}
// 计算椭圆上的点
func ellipsePoint(cx, cy, rx, ry, angle float64) (float64, float64) {
x := cx + rx*math.Cos(angle)
y := cy + ry*math.Sin(angle)
return x, y
}
// 计算圆上的点
func circlePoint(cx, cy, r, angle float64) (float64, float64) {
return ellipsePoint(cx, cy, r, r, angle)
}