aboutsummaryrefslogtreecommitdiff
path: root/src/client/util
diff options
context:
space:
mode:
authoreleanor-park <eleanor_park@brown.edu>2024-07-11 12:08:26 -0400
committereleanor-park <eleanor_park@brown.edu>2024-07-11 12:08:26 -0400
commitb88f3a79b4558b222864b7c925fd0d5086cdcea2 (patch)
tree4f830b4a4dd96948983115e1e5bff07a1a6eb3d1 /src/client/util
parent4438e7fe202ff4091b26f073122e7866ec9abb46 (diff)
Revert "Merge branch 'eleanor-gptdraw' into master"
This reverts commit 4438e7fe202ff4091b26f073122e7866ec9abb46, reversing changes made to 59ca918ea0918b41f1e2fa4b6acb8725ca9b44af.
Diffstat (limited to 'src/client/util')
-rw-r--r--src/client/util/CurrentUserUtils.ts4
-rw-r--r--src/client/util/bezierFit.ts146
2 files changed, 1 insertions, 149 deletions
diff --git a/src/client/util/CurrentUserUtils.ts b/src/client/util/CurrentUserUtils.ts
index 141695d86..e095bc659 100644
--- a/src/client/util/CurrentUserUtils.ts
+++ b/src/client/util/CurrentUserUtils.ts
@@ -730,7 +730,6 @@ pie title Minerals in my tap water
static inkTools():Button[] {
return [
{ title: "Pen", toolTip: "Pen (Ctrl+P)", btnType: ButtonType.ToggleButton, icon: "pen-nib", toolType: "pen", scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }},
- { title: "Highlight", toolTip: "Highlight (Ctrl+H)", btnType: ButtonType.ToggleButton, icon: "highlighter",toolType: "highlighter", scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }},
{ title: "Write", toolTip: "Write (Ctrl+Shift+P)", btnType: ButtonType.ToggleButton, icon: "pen", toolType: "write", scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}' }, funcs: {hidden:"IsNoviceMode()" }},
{ title: "Eraser", toolTip: "Eraser (Ctrl+E)", btnType: ButtonType.MultiToggleButton, scripts: {onClick: '{ return setActiveTool(this.toolType, false, _readOnly_);}'}, funcs: {toolType:"activeEraserTool()"},
subMenu: [
@@ -743,10 +742,9 @@ pie title Minerals in my tap water
{ title: "Square", toolTip: "Square (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "square", toolType: Gestures.Rectangle, scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`, onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
{ title: "Line", toolTip: "Line (double tap to lock mode)", btnType: ButtonType.ToggleButton, icon: "minus", toolType: Gestures.Line, scripts: {onClick:`{ return setActiveTool(this.toolType, false, _readOnly_);}`, onDoubleClick:`{ return setActiveTool(this.toolType, true, _readOnly_);}`} },
{ title: "Mask", toolTip: "Mask", btnType: ButtonType.ToggleButton, icon: "user-circle",toolType: "inkMask", scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, funcs: {hidden:"IsNoviceMode()" } },
- { title: "Labels", toolTip: "Labels", btnType: ButtonType.ToggleButton, icon: "text-width", toolType: "labels", scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, },
+ { title: "Labels", toolTip: "Lab els", btnType: ButtonType.ToggleButton, icon: "text-width", toolType: "labels", scripts: {onClick:'{ return setInkProperty(this.toolType, value, _readOnly_);}'}, },
{ title: "Width", toolTip: "Stroke width", btnType: ButtonType.NumberSliderButton, toolType: "strokeWidth", ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'}, numBtnMin: 1},
{ title: "Ink", toolTip: "Stroke color", btnType: ButtonType.ColorButton, icon: "pen", toolType: "strokeColor", ignoreClick: true, scripts: {script: '{ return setInkProperty(this.toolType, value, _readOnly_);}'} },
- { title: "Smart Draw", toolTip: "Draw with GPT", btnType: ButtonType.ToggleButton, icon: "user-pen", toolType: "smartdraw", scripts: {onClick:'{ return setActiveTool(this.toolType, false, _readOnly_);}'}, funcs: {hidden: "IsNoviceMode()"}},
];
}
diff --git a/src/client/util/bezierFit.ts b/src/client/util/bezierFit.ts
index f5696afaf..d6f3f2340 100644
--- a/src/client/util/bezierFit.ts
+++ b/src/client/util/bezierFit.ts
@@ -2,18 +2,8 @@
/* eslint-disable prefer-destructuring */
/* eslint-disable no-param-reassign */
/* eslint-disable camelcase */
-import e from 'cors';
import { Point } from '../../pen-gestures/ndollar';
-export enum SVGType {
- Rect = 'rect',
- Path = 'path',
- Circle = 'circle',
- Ellipse = 'ellipse',
- Line = 'line',
- Polygon = 'polygon',
-}
-
class SmartRect {
minx: number = 0;
miny: number = 0;
@@ -567,12 +557,6 @@ function FitCubic(d: Point[], first: number, last: number, tHat1: Point, tHat2:
const negThatCenter = new Point(-tHatCenter.X, -tHatCenter.Y);
FitCubic(d, splitPoint2D, last, negThatCenter, tHat2, error, result);
}
-/**
- * Convert polyline coordinates to a (multi) segment bezier curve
- * @param d - polyline coordinates
- * @param error - how much error to allow in fitting (measured in pixels)
- * @returns
- */
export function FitCurve(d: Point[], error: number) {
const tHat1 = ComputeLeftTangent(d, 0); // Unit tangent vectors at endpoints
const tHat2 = ComputeRightTangent(d, d.length - 1);
@@ -602,136 +586,6 @@ export function FitOneCurve(d: Point[], tHat1?: Point, tHat2?: Point) {
return { finalCtrls, error };
}
-// alpha determines how far away the tangents are, or the "tightness" of the bezier
-export function GenerateControlPoints(coordinates: Point[], alpha = 0.1) {
- const firstEnd = coordinates.length ? [coordinates[0], coordinates[0]] : [];
- const lastEnd = coordinates.length ? [coordinates.lastElement(), coordinates.lastElement()] : [];
- const points: Point[] = coordinates.slice(1, coordinates.length - 1).flatMap((pt, index, inkData) => {
- const prevPt: Point = index === 0 ? firstEnd[0] : inkData[index - 1];
- const nextPt: Point = index === inkData.length - 1 ? lastEnd[0] : inkData[index + 1];
- if (prevPt.X === nextPt.X) {
- const verticalDist = nextPt.Y - prevPt.Y;
- return [{ X: pt.X, Y: pt.Y - alpha * verticalDist }, pt, pt, { X: pt.X, Y: pt.Y + alpha * verticalDist }];
- } else if (prevPt.Y === nextPt.Y) {
- const horizDist = nextPt.X - prevPt.X;
- return [{ X: pt.X - alpha * horizDist, Y: pt.Y }, pt, pt, { X: pt.X + alpha * horizDist, Y: pt.Y }];
- }
- // tangent vectors between the adjacent points
- const tanX = nextPt.X - prevPt.X;
- const tanY = nextPt.Y - prevPt.Y;
- const ctrlPt1: Point = { X: pt.X - alpha * tanX, Y: pt.Y - alpha * tanY };
- const ctrlPt2: Point = { X: pt.X + alpha * tanX, Y: pt.Y + alpha * tanY };
- return [ctrlPt1, pt, pt, ctrlPt2];
- });
- return [...firstEnd, ...points, ...lastEnd];
-}
-
-export function SVGToBezier(name: SVGType, attributes: any): Point[] {
- console.log('in svg to bezier', name, attributes);
- switch (name) {
- case 'line':
- const x1 = parseInt(attributes.x1);
- const x2 = parseInt(attributes.x2);
- const y1 = parseInt(attributes.y1);
- const y2 = parseInt(attributes.y2);
- return [
- { X: x1, Y: y1 },
- { X: x1, Y: y1 },
- { X: x2, Y: y2 },
- { X: x2, Y: y2 },
- ];
- case 'circle':
- case 'ellipse':
- const c = 0.551915024494;
- const centerX = parseInt(attributes.cx);
- const centerY = parseInt(attributes.cy);
- const radiusX = parseInt(attributes.rx) || parseInt(attributes.r);
- const radiusY = parseInt(attributes.ry) || parseInt(attributes.r);
- return [
- { X: centerX, Y: centerY + radiusY },
- { X: centerX + c * radiusX, Y: centerY + radiusY },
- { X: centerX + radiusX, Y: centerY + c * radiusY },
- { X: centerX + radiusX, Y: centerY },
- { X: centerX + radiusX, Y: centerY },
- { X: centerX + radiusX, Y: centerY - c * radiusY },
- { X: centerX + c * radiusX, Y: centerY - radiusY },
- { X: centerX, Y: centerY - radiusY },
- { X: centerX, Y: centerY - radiusY },
- { X: centerX - c * radiusX, Y: centerY - radiusY },
- { X: centerX - radiusX, Y: centerY - c * radiusY },
- { X: centerX - radiusX, Y: centerY },
- { X: centerX - radiusX, Y: centerY },
- { X: centerX - radiusX, Y: centerY + c * radiusY },
- { X: centerX - c * radiusX, Y: centerY + radiusY },
- { X: centerX, Y: centerY + radiusY },
- ];
- case 'rect':
- const x = parseInt(attributes.x);
- const y = parseInt(attributes.y);
- const width = parseInt(attributes.width);
- const height = parseInt(attributes.height);
- return [
- { X: x, Y: y },
- { X: x, Y: y },
- { X: x + width, Y: y },
- { X: x + width, Y: y },
- { X: x + width, Y: y },
- { X: x + width, Y: y },
- { X: x + width, Y: y + height },
- { X: x + width, Y: y + height },
- { X: x + width, Y: y + height },
- { X: x + width, Y: y + height },
- { X: x, Y: y + height },
- { X: x, Y: y + height },
- { X: x, Y: y + height },
- { X: x, Y: y + height },
- { X: x, Y: y },
- { X: x, Y: y },
- ];
- case 'path':
- const coordList: Point[] = [];
- const startPt = attributes.d.match(/M(-?\d+\.?\d*),(-?\d+\.?\d*)/);
- coordList.push({ X: parseInt(startPt[1]), Y: parseInt(startPt[2]) });
- const matches: RegExpMatchArray[] = Array.from(
- attributes.d.matchAll(/Q(-?\d+\.?\d*),(-?\d+\.?\d*) (-?\d+\.?\d*),(-?\d+\.?\d*)|C(-?\d+\.?\d*),(-?\d+\.?\d*) (-?\d+\.?\d*),(-?\d+\.?\d*) (-?\d+\.?\d*),(-?\d+\.?\d*)|L(-?\d+\.?\d*),(-?\d+\.?\d*)/g)
- );
- let lastPt: Point;
- matches.forEach(match => {
- if (match[0].startsWith('Q')) {
- coordList.push({ X: parseInt(match[1]), Y: parseInt(match[2]) });
- coordList.push({ X: parseInt(match[1]), Y: parseInt(match[2]) });
- coordList.push({ X: parseInt(match[3]), Y: parseInt(match[4]) });
- coordList.push({ X: parseInt(match[3]), Y: parseInt(match[4]) });
- lastPt = { X: parseInt(match[3]), Y: parseInt(match[4]) };
- } else if (match[0].startsWith('C')) {
- coordList.push({ X: parseInt(match[5]), Y: parseInt(match[6]) });
- coordList.push({ X: parseInt(match[7]), Y: parseInt(match[8]) });
- coordList.push({ X: parseInt(match[9]), Y: parseInt(match[10]) });
- coordList.push({ X: parseInt(match[9]), Y: parseInt(match[10]) });
- lastPt = { X: parseInt(match[9]), Y: parseInt(match[10]) };
- } else {
- coordList.push(lastPt || { X: parseInt(startPt[1]), Y: parseInt(startPt[2]) });
- coordList.push({ X: parseInt(match[11]), Y: parseInt(match[12]) });
- coordList.push({ X: parseInt(match[11]), Y: parseInt(match[12]) });
- coordList.push({ X: parseInt(match[11]), Y: parseInt(match[12]) });
- lastPt = { X: parseInt(match[11]), Y: parseInt(match[12]) };
- }
- });
- const hasZ = attributes.d.match(/Z/);
- if (hasZ) {
- coordList.push(lastPt);
- coordList.push({ X: parseInt(startPt[1]), Y: parseInt(startPt[2]) });
- coordList.push({ X: parseInt(startPt[1]), Y: parseInt(startPt[2]) });
- } else {
- coordList.pop();
- }
- return coordList;
- case 'polygon':
- default:
- return [];
- }
-}
-
/*
static double GetTValueFromSValue (const BezierRep &parent, double t, double endT, bool left, double influenceDistance, double &excess) {
double dist = 0;