-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbezier.go
More file actions
69 lines (62 loc) · 1.97 KB
/
bezier.go
File metadata and controls
69 lines (62 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package gg
import (
"math"
)
func quadraticBezier(x0, y0, x1, y1, x2, y2, ds float64, p []Point) error {
if canUseBezierKernel {
err := quadraticBezeirGPU(x0, y0, x1, y1, x2, y2, ds, p)
if err == nil {
return nil
}
canUseBezierKernel = false
if ReturnErrOnGPUFailed {
return err
}
}
quadraticBezierPlatform(x0, y0, x1, y1, x2, y2, ds, p)
return nil
}
func cubicBezier(x0, y0, x1, y1, x2, y2, x3, y3, ds float64, p []Point) error {
if canUseBezierKernel {
err := cubicBezeirGPU(x0, y0, x1, y1, x2, y2, x3, y3, ds, p)
if err == nil {
return nil
}
canUseBezierKernel = false
if ReturnErrOnGPUFailed {
return err
}
}
cubicBezierPlatform(x0, y0, x1, y1, x2, y2, x3, y3, ds, p)
return nil
}
func quadraticBezierLen(x0, y0, x1, y1, x2, y2 float64) int {
l := math.Hypot(x1-x0, y1-y0) + math.Hypot(x2-x1, y2-y1)
n := max(int(l+0.5), 4)
return n
}
// QuadraticBezier computes points along a quadratic Bezier curve defined by
// (x0, y0), (x1, y1), (x2, y2).
//
// QuadraticBezier 计算由 (x0, y0)、(x1, y1)、(x2, y2) 定义的二次贝塞尔曲线上的点。
func QuadraticBezier(x0, y0, x1, y1, x2, y2 float64) ([]Point, error) {
n := quadraticBezierLen(x0, y0, x1, y1, x2, y2)
result := make([]Point, n)
err := quadraticBezier(x0, y0, x1, y1, x2, y2, float64(n)-1, result)
return result, err
}
func cubicBezierLen(x0, y0, x1, y1, x2, y2, x3, y3 float64) int {
l := math.Hypot(x1-x0, y1-y0) + math.Hypot(x2-x1, y2-y1) + math.Hypot(x3-x2, y3-y2)
n := max(int(l+0.5), 4)
return n
}
// CubicBezier computes points along a cubic Bezier curve defined by
// (x0, y0), (x1, y1), (x2, y2), (x3, y3).
//
// CubicBezier 计算由 (x0, y0)、(x1, y1)、(x2, y2)、(x3, y3) 定义的三次贝塞尔曲线上的点。
func CubicBezier(x0, y0, x1, y1, x2, y2, x3, y3 float64) ([]Point, error) {
n := cubicBezierLen(x0, y0, x1, y1, x2, y2, x3, y3)
result := make([]Point, n)
err := cubicBezier(x0, y0, x1, y1, x2, y2, x3, y3, float64(n)-1, result)
return result, err
}