{
const ratio = Math.min(2.5, width / tin.width), ctx = DOM.context2d(tin.width * ratio, tin.height * ratio);
await visibility();
const T = new Uint8Array(tin.triangles.length / 3);
const V = new Uint8Array(tin.coords.length / 2);
let numVisited = 0;
for (let i = 0; i < tin.halfedges.length; i++) {
if (tin.halfedges[i] === -1) V[tin.triangles[i]] = 1;
}
const queue = [];
let h = startingHalfedge;
while (h !== undefined) {
const h0 = h % 3 === 0 ? h + 2 : h - 1;
const h1 = h % 3 === 2 ? h - 2 : h + 1;
const v = tin.triangles[h0];
const l = tin.halfedges[h0];
const r = tin.halfedges[h1];
const t = Math.floor(h / 3);
const tipVisited = V[v];
const leftVisited = l === -1 || T[Math.floor(l / 3)];
const rightVisited = r === -1 || T[Math.floor(r / 3)];
T[t] = 1; V[v] = 1; V[tin.triangles[h]] = 1; V[tin.triangles[h1]] = 1;
let type;
if (!tipVisited) {
type = 0; h = r;
} else if (leftVisited && rightVisited) {
type = 2; h = queue.pop();
} else if (leftVisited) {
type = 1; h = r;
} else if (rightVisited) {
type = 3; h = l;
} else {
type = 4; h = r; queue.push(l);
}
drawTriangle(ctx, t, ++numVisited, type, ratio); if (numVisited % speed === 0) yield ctx.canvas;
}
return ctx.canvas;
}