add codec optional extended point data encoding

This commit is contained in:
Stewart Allen 2025-09-26 09:44:56 -04:00
commit 39cc3db3d8
2 changed files with 31 additions and 3 deletions

View file

@ -312,7 +312,7 @@ Polygon.prototype.encode = function(state) {
state.poly[this.id] = this;
return {
let enc = {
type: TYPE.POLY,
id: this.id,
array: encodePointArray(this.points, state, this.z),
@ -322,6 +322,20 @@ Polygon.prototype.encode = function(state) {
color: this.color,
open: this.open
};
// encode extended point info for tagged polys
if (this._epk) {
let epk = enc.epk = {};
for (let key of this._epk) {
let arr = epk[key] = [];
let pts = this.points;
for (let i=0, l=pts.length; i<l; i++) {
if (pts[i][key]) arr.push(i, pts[i][key]);
}
}
}
return enc;
};
registerDecoder(TYPE.POLY, function(v, state) {
@ -340,6 +354,18 @@ registerDecoder(TYPE.POLY, function(v, state) {
poly.push(newPoint(array[vid++], array[vid++], array[vid++]));
}
// decode extended point when present
if (v.epk) {
let pts = poly.points;
for (let [key, arr] of Object.entries(v.epk)) {
for (let i=0; i<arr.length; ) {
let pos = arr[i++];
let val = arr[i++];
pts[pos][key] = val;
}
}
}
state.poly[v.id] = poly;
poly.id = v.id;

View file

@ -152,8 +152,8 @@ function offset_default(params) {
// merge points marking point offset and skip
let mid = p0.midPointTo(p1);
let inc = p0.distTo2D(mid) / offset1;
moved = p0.moved = p1.moved = inc;
p1.skip = true;
moved = p0.moved = p1.moved = inc.round(4);
p1.skip = 1;
p0.x = p1.x = mid.x;
p0.y = p1.y = mid.y;
}
@ -168,6 +168,8 @@ function offset_default(params) {
for (let rec of thin_test) {
if (rec.moved) {
let last_seg;
// tag for codec extended point encoding
rec.poly._epk = ["moved", "skip"];
rec.poly.points = rec.points.filter((p,i) => {
let keep = (last_seg !== p.segment || p.moved || p.skip);
last_seg = p.segment;