aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/InkingStroke.tsx
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2021-10-26 22:38:05 -0400
committerbobzel <zzzman@gmail.com>2021-10-26 22:38:05 -0400
commitb33abf746e82cabf973ae3b8a81fd6b0781b2bfe (patch)
treebf5d3e32b16f6fb96e312435ffddfa64c9409487 /src/client/views/InkingStroke.tsx
parentc7aea59ca8cd24bf218be581ea241670fee6cc49 (diff)
adding snapping code between ink strokes. added some componentView API functions to convert local (eg ink) points to/from screen space and for snapping
Diffstat (limited to 'src/client/views/InkingStroke.tsx')
-rw-r--r--src/client/views/InkingStroke.tsx26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx
index 24c2d7651..b258ea741 100644
--- a/src/client/views/InkingStroke.tsx
+++ b/src/client/views/InkingStroke.tsx
@@ -124,6 +124,32 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps, InkDocume
}
}
+ ptFromScreen = (scrPt: { X: number, Y: number }) => {
+ const { inkScaleX, inkScaleY, inkStrokeWidth, inkTop, inkLeft } = this.inkScaledData();
+ const docPt = this.props.ScreenToLocalTransform().transformPoint(scrPt.X, scrPt.Y);
+ const inkPt = {
+ X: (docPt[0] - inkStrokeWidth / 2) / inkScaleX + inkStrokeWidth / 2 + inkLeft,
+ Y: (docPt[1] - inkStrokeWidth / 2) / inkScaleY + inkStrokeWidth / 2 + inkTop,
+ }
+ return inkPt;
+ }
+ ptToScreen = (inkPt: { X: number, Y: number }) => {
+ const { inkScaleX, inkScaleY, inkStrokeWidth, inkTop, inkLeft } = this.inkScaledData();
+ const docPt = {
+ X: (inkPt.X - inkLeft - inkStrokeWidth / 2) * inkScaleX + inkStrokeWidth / 2,
+ Y: (inkPt.Y - inkTop - inkStrokeWidth / 2) * inkScaleY + inkStrokeWidth / 2
+ };
+ const scrPt = this.props.ScreenToLocalTransform().inverse().transformPoint(docPt.X, docPt.Y);
+ return { X: scrPt[0], Y: scrPt[1] };
+ }
+
+ snapPt = (scrPt: { X: number, Y: number }) => {
+ const { inkData } = this.inkScaledData();
+ const inkPt = this.ptFromScreen(scrPt);
+ const { nearestPt, distance } = InkStrokeProperties.nearestPtToStroke(inkData, inkPt, []);
+ return { nearestPt, distance: distance * this.props.ScreenToLocalTransform().inverse().Scale };
+ }
+
inkScaledData = () => {
const inkData = Cast(this.dataDoc[this.fieldKey], InkField)?.inkData ?? [];
const inkStrokeWidth = NumCast(this.rootDoc.strokeWidth, 1);