@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering
126 lines (94 loc) • 2.87 kB
text/typescript
import { Geometry } from '../geometry'
import { Line } from '../line'
import { Point, PointOptions } from '../point'
import { Rectangle } from '../rectangle'
export interface SegmentOptions {
precision?: number
subdivisions?: Segment[]
}
export abstract class Segment extends Geometry {
isVisible = true
isSegment = true
isSubpathStart = false
nextSegment: Segment | null
previousSegment: Segment | null
subpathStartSegment: Segment | null
protected endPoint: Point
get end() {
return this.endPoint
}
get start() {
if (this.previousSegment == null) {
throw new Error(
'Missing previous segment. (This segment cannot be the ' +
'first segment of a path, or segment has not yet been ' +
'added to a path.)',
)
}
return this.previousSegment.end
}
abstract get type(): string
abstract bbox(): Rectangle | null
abstract closestPoint(p: PointOptions): Point
abstract closestPointLength(p: PointOptions): number
abstract closestPointNormalizedLength(p: PointOptions): number
closestPointT(
p: PointOptions,
options?: SegmentOptions, // eslint-disable-line
) {
if (this.closestPointNormalizedLength) {
return this.closestPointNormalizedLength(p)
}
throw new Error(
'Neither `closestPointT` nor `closestPointNormalizedLength` method is implemented.',
)
}
abstract closestPointTangent(p: PointOptions): Line | null
abstract length(options?: SegmentOptions): number
// eslint-disable-next-line
lengthAtT(t: number, options?: SegmentOptions) {
if (t <= 0) {
return 0
}
const length = this.length()
if (t >= 1) {
return length
}
return length * t
}
abstract divideAt(ratio: number, options?: SegmentOptions): [Segment, Segment]
abstract divideAtLength(
length: number,
options?: SegmentOptions,
): [Segment, Segment]
divideAtT(t: number) {
if (this.divideAt) {
return this.divideAt(t)
}
throw new Error('Neither `divideAtT` nor `divideAt` method is implemented.')
}
abstract getSubdivisions(options?: SegmentOptions): Segment[]
abstract pointAt(ratio: number): Point
abstract pointAtLength(length: number, options?: SegmentOptions): Point
pointAtT(t: number): Point {
if (this.pointAt) {
return this.pointAt(t)
}
throw new Error('Neither `pointAtT` nor `pointAt` method is implemented.')
}
abstract tangentAt(ratio: number): Line | null
abstract tangentAtLength(
length: number,
options?: SegmentOptions,
): Line | null
tangentAtT(t: number): Line | null {
if (this.tangentAt) {
return this.tangentAt(t)
}
throw new Error(
'Neither `tangentAtT` nor `tangentAt` method is implemented.',
)
}
abstract isDifferentiable(): boolean
abstract clone(): Segment
}