@tldraw/editor 3.14.0-canary.e0ab6f4c80f9 → 3.14.0-canary.f6a0206007b3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.d.ts +64 -49
- package/dist-cjs/index.js +3 -1
- package/dist-cjs/index.js.map +2 -2
- package/dist-cjs/lib/editor/Editor.js +2 -2
- package/dist-cjs/lib/editor/Editor.js.map +2 -2
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +16 -20
- package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
- package/dist-cjs/lib/editor/managers/FocusManager.js +2 -0
- package/dist-cjs/lib/editor/managers/FocusManager.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js +8 -0
- package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js +6 -0
- package/dist-cjs/lib/editor/shapes/group/GroupShapeUtil.js.map +2 -2
- package/dist-cjs/lib/editor/shapes/shared/getPerfectDashProps.js.map +2 -2
- package/dist-cjs/lib/primitives/Box.js +6 -0
- package/dist-cjs/lib/primitives/Box.js.map +2 -2
- package/dist-cjs/lib/primitives/Vec.js +18 -13
- package/dist-cjs/lib/primitives/Vec.js.map +3 -3
- package/dist-cjs/lib/primitives/geometry/Arc2d.js +41 -21
- package/dist-cjs/lib/primitives/geometry/Arc2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Circle2d.js +11 -11
- package/dist-cjs/lib/primitives/geometry/Circle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js +13 -16
- package/dist-cjs/lib/primitives/geometry/CubicBezier2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js +4 -4
- package/dist-cjs/lib/primitives/geometry/CubicSpline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Edge2d.js +14 -21
- package/dist-cjs/lib/primitives/geometry/Edge2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js +10 -10
- package/dist-cjs/lib/primitives/geometry/Ellipse2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js +5 -0
- package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Point2d.js +6 -6
- package/dist-cjs/lib/primitives/geometry/Point2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Polygon2d.js +3 -0
- package/dist-cjs/lib/primitives/geometry/Polygon2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js +8 -5
- package/dist-cjs/lib/primitives/geometry/Polyline2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Rectangle2d.js +22 -11
- package/dist-cjs/lib/primitives/geometry/Rectangle2d.js.map +2 -2
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js +22 -22
- package/dist-cjs/lib/primitives/geometry/Stadium2d.js.map +2 -2
- package/dist-cjs/lib/utils/areShapesContentEqual.js +1 -1
- package/dist-cjs/lib/utils/areShapesContentEqual.js.map +2 -2
- package/dist-cjs/version.js +3 -3
- package/dist-cjs/version.js.map +1 -1
- package/dist-esm/index.d.mts +64 -49
- package/dist-esm/index.mjs +6 -2
- package/dist-esm/index.mjs.map +2 -2
- package/dist-esm/lib/editor/Editor.mjs +2 -2
- package/dist-esm/lib/editor/Editor.mjs.map +2 -2
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +16 -20
- package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
- package/dist-esm/lib/editor/managers/FocusManager.mjs +2 -0
- package/dist-esm/lib/editor/managers/FocusManager.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +8 -0
- package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs +6 -0
- package/dist-esm/lib/editor/shapes/group/GroupShapeUtil.mjs.map +2 -2
- package/dist-esm/lib/editor/shapes/shared/getPerfectDashProps.mjs.map +2 -2
- package/dist-esm/lib/primitives/Box.mjs +6 -0
- package/dist-esm/lib/primitives/Box.mjs.map +2 -2
- package/dist-esm/lib/primitives/Vec.mjs +19 -14
- package/dist-esm/lib/primitives/Vec.mjs.map +3 -3
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs +41 -21
- package/dist-esm/lib/primitives/geometry/Arc2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs +11 -11
- package/dist-esm/lib/primitives/geometry/Circle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs +13 -16
- package/dist-esm/lib/primitives/geometry/CubicBezier2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs +4 -4
- package/dist-esm/lib/primitives/geometry/CubicSpline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs +14 -21
- package/dist-esm/lib/primitives/geometry/Edge2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs +11 -11
- package/dist-esm/lib/primitives/geometry/Ellipse2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +7 -1
- package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Point2d.mjs +6 -6
- package/dist-esm/lib/primitives/geometry/Point2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Polygon2d.mjs +3 -0
- package/dist-esm/lib/primitives/geometry/Polygon2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs +8 -5
- package/dist-esm/lib/primitives/geometry/Polyline2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs +22 -11
- package/dist-esm/lib/primitives/geometry/Rectangle2d.mjs.map +2 -2
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs +22 -22
- package/dist-esm/lib/primitives/geometry/Stadium2d.mjs.map +2 -2
- package/dist-esm/lib/utils/areShapesContentEqual.mjs +1 -1
- package/dist-esm/lib/utils/areShapesContentEqual.mjs.map +2 -2
- package/dist-esm/version.mjs +3 -3
- package/dist-esm/version.mjs.map +1 -1
- package/package.json +7 -7
- package/src/index.ts +5 -1
- package/src/lib/editor/Editor.ts +3 -2
- package/src/lib/editor/derivations/notVisibleShapes.ts +24 -25
- package/src/lib/editor/managers/FocusManager.ts +2 -0
- package/src/lib/editor/shapes/ShapeUtil.ts +9 -0
- package/src/lib/editor/shapes/group/GroupShapeUtil.tsx +8 -0
- package/src/lib/editor/shapes/shared/getPerfectDashProps.ts +5 -2
- package/src/lib/primitives/Box.ts +8 -0
- package/src/lib/primitives/Vec.test.ts +2 -2
- package/src/lib/primitives/Vec.ts +15 -10
- package/src/lib/primitives/geometry/Arc2d.ts +42 -23
- package/src/lib/primitives/geometry/Circle2d.ts +12 -12
- package/src/lib/primitives/geometry/CubicBezier2d.test.ts +5 -0
- package/src/lib/primitives/geometry/CubicBezier2d.ts +13 -17
- package/src/lib/primitives/geometry/CubicSpline2d.ts +5 -5
- package/src/lib/primitives/geometry/Edge2d.ts +14 -25
- package/src/lib/primitives/geometry/Ellipse2d.ts +12 -13
- package/src/lib/primitives/geometry/Geometry2d.ts +6 -0
- package/src/lib/primitives/geometry/Point2d.ts +6 -6
- package/src/lib/primitives/geometry/Polygon2d.ts +4 -0
- package/src/lib/primitives/geometry/Polyline2d.ts +10 -7
- package/src/lib/primitives/geometry/Rectangle2d.ts +24 -11
- package/src/lib/primitives/geometry/Stadium2d.ts +22 -23
- package/src/lib/utils/areShapesContentEqual.ts +2 -1
- package/src/version.ts +3 -3
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { Box } from '../Box'
|
|
2
2
|
import { Vec, VecLike } from '../Vec'
|
|
3
|
-
import { PI, PI2, perimeterOfEllipse } from '../utils'
|
|
3
|
+
import { PI, PI2, clamp, perimeterOfEllipse } from '../utils'
|
|
4
4
|
import { Edge2d } from './Edge2d'
|
|
5
5
|
import { Geometry2d, Geometry2dOptions } from './Geometry2d'
|
|
6
6
|
import { getVerticesCountForLength } from './geometry-constants'
|
|
7
7
|
|
|
8
8
|
/** @public */
|
|
9
9
|
export class Ellipse2d extends Geometry2d {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
private _w: number
|
|
11
|
+
private _h: number
|
|
12
|
+
private _edges?: Edge2d[]
|
|
12
13
|
|
|
13
14
|
constructor(
|
|
14
15
|
public config: Omit<Geometry2dOptions, 'isClosed'> & {
|
|
@@ -18,12 +19,10 @@ export class Ellipse2d extends Geometry2d {
|
|
|
18
19
|
) {
|
|
19
20
|
super({ ...config, isClosed: true })
|
|
20
21
|
const { width, height } = config
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
22
|
+
this._w = width
|
|
23
|
+
this._h = height
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
_edges?: Edge2d[]
|
|
26
|
-
|
|
27
26
|
// eslint-disable-next-line no-restricted-syntax
|
|
28
27
|
get edges() {
|
|
29
28
|
if (!this._edges) {
|
|
@@ -41,8 +40,8 @@ export class Ellipse2d extends Geometry2d {
|
|
|
41
40
|
|
|
42
41
|
getVertices() {
|
|
43
42
|
// Perimeter of the ellipse
|
|
44
|
-
const w = Math.max(1, this.
|
|
45
|
-
const h = Math.max(1, this.
|
|
43
|
+
const w = Math.max(1, this._w)
|
|
44
|
+
const h = Math.max(1, this._h)
|
|
46
45
|
const cx = w / 2
|
|
47
46
|
const cy = h / 2
|
|
48
47
|
const q = Math.pow(cx - cy, 2) / Math.pow(cx + cy, 2)
|
|
@@ -63,7 +62,7 @@ export class Ellipse2d extends Geometry2d {
|
|
|
63
62
|
const vertices = Array(len)
|
|
64
63
|
|
|
65
64
|
for (let i = 0; i < len; i++) {
|
|
66
|
-
vertices[i] = new Vec(cx + cx * cos, cy + cy * sin)
|
|
65
|
+
vertices[i] = new Vec(clamp(cx + cx * cos, 0, w), clamp(cy + cy * sin, 0, h))
|
|
67
66
|
ts = b * cos + a * sin
|
|
68
67
|
tc = a * cos - b * sin
|
|
69
68
|
sin = ts
|
|
@@ -95,11 +94,11 @@ export class Ellipse2d extends Geometry2d {
|
|
|
95
94
|
}
|
|
96
95
|
|
|
97
96
|
getBounds() {
|
|
98
|
-
return new Box(0, 0, this.
|
|
97
|
+
return new Box(0, 0, this._w, this._h)
|
|
99
98
|
}
|
|
100
99
|
|
|
101
100
|
getLength(): number {
|
|
102
|
-
const { w, h } = this
|
|
101
|
+
const { _w: w, _h: h } = this
|
|
103
102
|
const cx = w / 2
|
|
104
103
|
const cy = h / 2
|
|
105
104
|
const rx = Math.max(0, cx)
|
|
@@ -108,7 +107,7 @@ export class Ellipse2d extends Geometry2d {
|
|
|
108
107
|
}
|
|
109
108
|
|
|
110
109
|
getSvgPathData(first = false) {
|
|
111
|
-
const { w, h } = this
|
|
110
|
+
const { _w: w, _h: h } = this
|
|
112
111
|
const cx = w / 2
|
|
113
112
|
const cy = h / 2
|
|
114
113
|
const rx = Math.max(0, cx)
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
intersectLineSegmentPolygon,
|
|
9
9
|
intersectLineSegmentPolyline,
|
|
10
10
|
intersectPolys,
|
|
11
|
+
linesIntersect,
|
|
11
12
|
} from '../intersect'
|
|
12
13
|
import { approximately, pointInPolygon } from '../utils'
|
|
13
14
|
|
|
@@ -107,8 +108,13 @@ export abstract class Geometry2d {
|
|
|
107
108
|
let nearest: Vec | undefined
|
|
108
109
|
let dist = Infinity
|
|
109
110
|
let d: number, p: Vec, q: Vec
|
|
111
|
+
const nextLimit = this.isClosed ? vertices.length : vertices.length - 1
|
|
110
112
|
for (let i = 0; i < vertices.length; i++) {
|
|
111
113
|
p = vertices[i]
|
|
114
|
+
if (i < nextLimit) {
|
|
115
|
+
const next = vertices[(i + 1) % vertices.length]
|
|
116
|
+
if (linesIntersect(A, B, p, next)) return 0
|
|
117
|
+
}
|
|
112
118
|
q = Vec.NearestPointOnLineSegment(A, B, p, true)
|
|
113
119
|
d = Vec.Dist2(p, q)
|
|
114
120
|
if (d < dist) {
|
|
@@ -3,7 +3,7 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
|
|
|
3
3
|
|
|
4
4
|
/** @public */
|
|
5
5
|
export class Point2d extends Geometry2d {
|
|
6
|
-
|
|
6
|
+
private _point: Vec
|
|
7
7
|
|
|
8
8
|
constructor(
|
|
9
9
|
config: Omit<Geometry2dOptions, 'isClosed' | 'isFilled'> & { margin: number; point: Vec }
|
|
@@ -11,23 +11,23 @@ export class Point2d extends Geometry2d {
|
|
|
11
11
|
super({ ...config, isClosed: true, isFilled: true })
|
|
12
12
|
const { point } = config
|
|
13
13
|
|
|
14
|
-
this.
|
|
14
|
+
this._point = point
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
getVertices() {
|
|
18
|
-
return [this.
|
|
18
|
+
return [this._point]
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
nearestPoint(): Vec {
|
|
22
|
-
return this.
|
|
22
|
+
return this._point
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
hitTestLineSegment(A: VecLike, B: VecLike, margin: number): boolean {
|
|
26
|
-
return Vec.DistanceToLineSegment(A, B, this.
|
|
26
|
+
return Vec.DistanceToLineSegment(A, B, this._point) < margin
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
getSvgPathData() {
|
|
30
|
-
const { point } = this
|
|
30
|
+
const { _point: point } = this
|
|
31
31
|
return `M${point.toFixed()}`
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -7,5 +7,9 @@ export class Polygon2d extends Polyline2d {
|
|
|
7
7
|
constructor(config: Omit<Geometry2dOptions, 'isClosed'> & { points: Vec[] }) {
|
|
8
8
|
super({ ...config })
|
|
9
9
|
this.isClosed = true
|
|
10
|
+
|
|
11
|
+
if (config.points.length < 3) {
|
|
12
|
+
throw new Error('Polygon2d: points must be an array of at least 3 points')
|
|
13
|
+
}
|
|
10
14
|
}
|
|
11
15
|
}
|
|
@@ -4,18 +4,21 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
|
|
|
4
4
|
|
|
5
5
|
/** @public */
|
|
6
6
|
export class Polyline2d extends Geometry2d {
|
|
7
|
-
|
|
7
|
+
private _points: Vec[]
|
|
8
|
+
private _segments?: Edge2d[]
|
|
8
9
|
|
|
9
10
|
constructor(config: Omit<Geometry2dOptions, 'isFilled' | 'isClosed'> & { points: Vec[] }) {
|
|
10
11
|
super({ isClosed: false, isFilled: false, ...config })
|
|
11
12
|
const { points } = config
|
|
12
|
-
this.
|
|
13
|
-
}
|
|
13
|
+
this._points = points
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
if (points.length < 2) {
|
|
16
|
+
throw new Error('Polyline2d: points must be an array of at least 2 points')
|
|
17
|
+
}
|
|
18
|
+
}
|
|
16
19
|
|
|
17
20
|
// eslint-disable-next-line no-restricted-syntax
|
|
18
|
-
get segments() {
|
|
21
|
+
protected get segments() {
|
|
19
22
|
if (!this._segments) {
|
|
20
23
|
this._segments = []
|
|
21
24
|
const { vertices } = this
|
|
@@ -38,12 +41,12 @@ export class Polyline2d extends Geometry2d {
|
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
getVertices() {
|
|
41
|
-
return this.
|
|
44
|
+
return this._points
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
nearestPoint(A: VecLike): Vec {
|
|
45
48
|
const { segments } = this
|
|
46
|
-
let nearest = this.
|
|
49
|
+
let nearest = this._points[0]
|
|
47
50
|
let dist = Infinity
|
|
48
51
|
let p: Vec // current point on segment
|
|
49
52
|
let d: number // distance from A to p
|
|
@@ -5,10 +5,10 @@ import { Polygon2d } from './Polygon2d'
|
|
|
5
5
|
|
|
6
6
|
/** @public */
|
|
7
7
|
export class Rectangle2d extends Polygon2d {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
private _x: number
|
|
9
|
+
private _y: number
|
|
10
|
+
private _w: number
|
|
11
|
+
private _h: number
|
|
12
12
|
|
|
13
13
|
constructor(
|
|
14
14
|
config: Omit<Geometry2dOptions, 'isClosed'> & {
|
|
@@ -28,18 +28,31 @@ export class Rectangle2d extends Polygon2d {
|
|
|
28
28
|
new Vec(x, y + height),
|
|
29
29
|
],
|
|
30
30
|
})
|
|
31
|
-
this.
|
|
32
|
-
this.
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
31
|
+
this._x = x
|
|
32
|
+
this._y = y
|
|
33
|
+
this._w = width
|
|
34
|
+
this._h = height
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
getBounds() {
|
|
38
|
-
return new Box(this.
|
|
38
|
+
return new Box(this._x, this._y, this._w, this._h)
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
getSvgPathData(): string {
|
|
42
|
-
const { x, y, w, h } = this
|
|
43
|
-
|
|
42
|
+
const { _x: x, _y: y, _w: w, _h: h } = this
|
|
43
|
+
this.negativeZeroFix()
|
|
44
|
+
return `M${x},${y} h${w} v${h} h${-w}z`
|
|
44
45
|
}
|
|
46
|
+
|
|
47
|
+
private negativeZeroFix() {
|
|
48
|
+
this._x = zeroFix(this._x)
|
|
49
|
+
this._y = zeroFix(this._y)
|
|
50
|
+
this._w = zeroFix(this._w)
|
|
51
|
+
this._h = zeroFix(this._h)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function zeroFix(value: number) {
|
|
56
|
+
if (Object.is(value, -0)) return 0
|
|
57
|
+
return value
|
|
45
58
|
}
|
|
@@ -7,13 +7,12 @@ import { Geometry2d, Geometry2dOptions } from './Geometry2d'
|
|
|
7
7
|
|
|
8
8
|
/** @public */
|
|
9
9
|
export class Stadium2d extends Geometry2d {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
d: Edge2d
|
|
10
|
+
private _w: number
|
|
11
|
+
private _h: number
|
|
12
|
+
private _a: Arc2d
|
|
13
|
+
private _b: Edge2d
|
|
14
|
+
private _c: Arc2d
|
|
15
|
+
private _d: Edge2d
|
|
17
16
|
|
|
18
17
|
constructor(
|
|
19
18
|
public config: Omit<Geometry2dOptions, 'isClosed'> & {
|
|
@@ -23,45 +22,45 @@ export class Stadium2d extends Geometry2d {
|
|
|
23
22
|
) {
|
|
24
23
|
super({ ...config, isClosed: true })
|
|
25
24
|
const { width: w, height: h } = config
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
25
|
+
this._w = w
|
|
26
|
+
this._h = h
|
|
28
27
|
|
|
29
28
|
if (h > w) {
|
|
30
29
|
const r = w / 2
|
|
31
|
-
this.
|
|
30
|
+
this._a = new Arc2d({
|
|
32
31
|
start: new Vec(0, r),
|
|
33
32
|
end: new Vec(w, r),
|
|
34
33
|
center: new Vec(w / 2, r),
|
|
35
34
|
sweepFlag: 1,
|
|
36
35
|
largeArcFlag: 1,
|
|
37
36
|
})
|
|
38
|
-
this.
|
|
39
|
-
this.
|
|
37
|
+
this._b = new Edge2d({ start: new Vec(w, r), end: new Vec(w, h - r) })
|
|
38
|
+
this._c = new Arc2d({
|
|
40
39
|
start: new Vec(w, h - r),
|
|
41
40
|
end: new Vec(0, h - r),
|
|
42
41
|
center: new Vec(w / 2, h - r),
|
|
43
42
|
sweepFlag: 1,
|
|
44
43
|
largeArcFlag: 1,
|
|
45
44
|
})
|
|
46
|
-
this.
|
|
45
|
+
this._d = new Edge2d({ start: new Vec(0, h - r), end: new Vec(0, r) })
|
|
47
46
|
} else {
|
|
48
47
|
const r = h / 2
|
|
49
|
-
this.
|
|
48
|
+
this._a = new Arc2d({
|
|
50
49
|
start: new Vec(r, h),
|
|
51
50
|
end: new Vec(r, 0),
|
|
52
51
|
center: new Vec(r, r),
|
|
53
52
|
sweepFlag: 1,
|
|
54
53
|
largeArcFlag: 1,
|
|
55
54
|
})
|
|
56
|
-
this.
|
|
57
|
-
this.
|
|
55
|
+
this._b = new Edge2d({ start: new Vec(r, 0), end: new Vec(w - r, 0) })
|
|
56
|
+
this._c = new Arc2d({
|
|
58
57
|
start: new Vec(w - r, 0),
|
|
59
58
|
end: new Vec(w - r, h),
|
|
60
59
|
center: new Vec(w - r, r),
|
|
61
60
|
sweepFlag: 1,
|
|
62
61
|
largeArcFlag: 1,
|
|
63
62
|
})
|
|
64
|
-
this.
|
|
63
|
+
this._d = new Edge2d({ start: new Vec(w - r, h), end: new Vec(r, h) })
|
|
65
64
|
}
|
|
66
65
|
}
|
|
67
66
|
|
|
@@ -71,7 +70,7 @@ export class Stadium2d extends Geometry2d {
|
|
|
71
70
|
let _d: number
|
|
72
71
|
let p: Vec
|
|
73
72
|
|
|
74
|
-
const { a, b, c, d } = this
|
|
73
|
+
const { _a: a, _b: b, _c: c, _d: d } = this
|
|
75
74
|
for (const part of [a, b, c, d]) {
|
|
76
75
|
p = part.nearestPoint(A)
|
|
77
76
|
_d = Vec.Dist2(p, A)
|
|
@@ -85,12 +84,12 @@ export class Stadium2d extends Geometry2d {
|
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
hitTestLineSegment(A: VecLike, B: VecLike): boolean {
|
|
88
|
-
const { a, b, c, d } = this
|
|
87
|
+
const { _a: a, _b: b, _c: c, _d: d } = this
|
|
89
88
|
return [a, b, c, d].some((edge) => edge.hitTestLineSegment(A, B))
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
getVertices() {
|
|
93
|
-
const { a, b, c, d } = this
|
|
92
|
+
const { _a: a, _b: b, _c: c, _d: d } = this
|
|
94
93
|
return [a, b, c, d].reduce<Vec[]>((a, p) => {
|
|
95
94
|
a.push(...p.vertices)
|
|
96
95
|
return a
|
|
@@ -98,17 +97,17 @@ export class Stadium2d extends Geometry2d {
|
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
getBounds() {
|
|
101
|
-
return new Box(0, 0, this.
|
|
100
|
+
return new Box(0, 0, this._w, this._h)
|
|
102
101
|
}
|
|
103
102
|
|
|
104
103
|
getLength() {
|
|
105
|
-
const { h, w } = this
|
|
104
|
+
const { _h: h, _w: w } = this
|
|
106
105
|
if (h > w) return (PI * (w / 2) + (h - w)) * 2
|
|
107
106
|
else return (PI * (h / 2) + (w - h)) * 2
|
|
108
107
|
}
|
|
109
108
|
|
|
110
109
|
getSvgPathData() {
|
|
111
|
-
const { a, b, c, d } = this
|
|
110
|
+
const { _a: a, _b: b, _c: c, _d: d } = this
|
|
112
111
|
return [a, b, c, d].map((p, i) => p.getSvgPathData(i === 0)).join(' ') + ' Z'
|
|
113
112
|
}
|
|
114
113
|
}
|
package/src/version.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// This file is automatically generated by internal/scripts/refresh-assets.ts.
|
|
2
2
|
// Do not edit manually. Or do, I'm a comment, not a cop.
|
|
3
3
|
|
|
4
|
-
export const version = '3.14.0-canary.
|
|
4
|
+
export const version = '3.14.0-canary.f6a0206007b3'
|
|
5
5
|
export const publishDates = {
|
|
6
6
|
major: '2024-09-13T14:36:29.063Z',
|
|
7
|
-
minor: '2025-
|
|
8
|
-
patch: '2025-
|
|
7
|
+
minor: '2025-06-03T09:18:36.909Z',
|
|
8
|
+
patch: '2025-06-03T09:18:36.909Z',
|
|
9
9
|
}
|