55 lines
1.3 KiB
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)
|
|
}
|