jsketcher/modules/geom/path.js
Val Erastov (xibyte) e11c1f7f4a geom module
2020-07-19 22:37:24 -07:00

62 lines
1.1 KiB
JavaScript

import {Point} from './point'
import {defineIterable} from '../../web/app/utils/utils'
class Path {
constructor(head) {
this.head = head;
defineIterable(this, 'segments', () => segmentsGenerator(this));
}
isClosed() {
return this.head.prev != null;
}
}
export class PathBuilder {
constructor(head) {
this.head = null;
this.tail = null;
defineIterable(this, 'segments', () => segmentsGenerator(this));
}
addSegment(segment) {
if (this.tail == null) {
this.head = segment;
} else {
this.tail.next = segment;
}
segment.prev = this.tail;
this.tail = segment;
}
close() {
this.tail.next = this.head;
this.head.prev = this.tail;
return this.head;
}
unclosed() {
return this.head;
}
}
export class Segment {
constructor(curve, point) {
this.curve = curve;
this.point = point;
this.next = null;
this.prev = null;
this.data = {};
}
}
export function* segmentsGenerator(path) {
let node = path.head;
while (node != null) {
yield node;
node = node.next;
if (node == path.node) break;
}
}