Skip to content

Commit 5304707

Browse files
authored
Add pointMatchingDistance parameter to bezier seed functions (#623)
* Add pointMatchingDistance parameter to bezier seed functions * new build * rebuild demos with less arcs * rebuild tests
1 parent 4a3bf9d commit 5304707

File tree

7 files changed

+45
-45
lines changed

7 files changed

+45
-45
lines changed

docs/demos/index.html

Lines changed: 9 additions & 9 deletions
Large diffs are not rendered by default.

docs/index.html

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

docs/target/js/browser.maker.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2674,7 +2674,7 @@ var MakerJs;
26742674
}
26752675
if (modelToDistort.type === MakerJs.models.BezierCurve.typeName) {
26762676
var b = modelToDistort;
2677-
var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
2677+
var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
26782678
var _loop_1 = function (layer_1) {
26792679
var pathArray = bezierPartsByLayer[layer_1];
26802680
pathArray.forEach(function (p, i) {
@@ -6437,7 +6437,7 @@ var MakerJs;
64376437
var beziers;
64386438
if (opts.unifyBeziers) {
64396439
beziers = getBezierModels(modelContext);
6440-
swapBezierPathsWithSeeds(beziers, true);
6440+
swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
64416441
}
64426442
model.walk(modelContext, walkOptions);
64436443
var _loop_3 = function (layer_2) {
@@ -6474,7 +6474,7 @@ var MakerJs;
64746474
_loop_3(layer_2);
64756475
}
64766476
if (beziers) {
6477-
swapBezierPathsWithSeeds(beziers, false);
6477+
swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
64786478
}
64796479
if (opts.byLayers) {
64806480
return chainsByLayer;
@@ -6571,7 +6571,7 @@ var MakerJs;
65716571
/**
65726572
* @private
65736573
*/
6574-
function swapBezierPathsWithSeeds(beziers, swap) {
6574+
function swapBezierPathsWithSeeds(beziers, swap, pointMatchingDistance) {
65756575
var tempKey = 'tempPaths';
65766576
var tempLayerKey = 'tempLayer';
65776577
beziers.forEach(function (wm) {
@@ -6583,7 +6583,7 @@ var MakerJs;
65836583
b.layer = wm.layer;
65846584
}
65856585
//use seeds as path, hide the arc paths from findChains()
6586-
var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true });
6586+
var bezierPartsByLayer = MakerJs.models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: pointMatchingDistance });
65876587
for (var layer in bezierPartsByLayer) {
65886588
var bezierSeeds = bezierPartsByLayer[layer];
65896589
if (bezierSeeds.length > 0) {
@@ -9002,7 +9002,7 @@ var MakerJs;
90029002
/**
90039003
* @private
90049004
*/
9005-
function getActualBezierRange(curve, arc, endpoints, offset) {
9005+
function getActualBezierRange(curve, arc, endpoints, offset, pointMatchingDistance) {
90069006
var b = getScratch(curve.seed);
90079007
var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(function (t) { return new TPoint(b, t, offset); });
90089008
var ends = endpoints.slice();
@@ -9011,7 +9011,7 @@ var MakerJs;
90119011
if (endpointDistancetoStart[0] > endpointDistancetoStart[1])
90129012
ends.reverse();
90139013
for (var i = 2; i--;) {
9014-
if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point)) {
9014+
if (!MakerJs.measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
90159015
return null;
90169016
}
90179017
}
@@ -9020,13 +9020,13 @@ var MakerJs;
90209020
/**
90219021
* @private
90229022
*/
9023-
function getChainBezierRange(curve, c, layer, addToLayer) {
9023+
function getChainBezierRange(curve, c, layer, addToLayer, pointMatchingDistance) {
90249024
var endLinks = [c.links[0], c.links[c.links.length - 1]];
90259025
if (endLinks[0].walkedPath.pathContext.bezierData.startT > endLinks[1].walkedPath.pathContext.bezierData.startT) {
90269026
MakerJs.chain.reverse(c);
90279027
endLinks.reverse();
90289028
}
9029-
var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset); });
9029+
var actualBezierRanges = endLinks.map(function (endLink) { return getActualBezierRange(curve, endLink.walkedPath.pathContext, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance); });
90309030
var result = {
90319031
startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
90329032
endT: actualBezierRanges[1] ? actualBezierRanges[1].endT : null
@@ -9188,7 +9188,7 @@ var MakerJs;
91889188
};
91899189
MakerJs.model.findChains(curve, function (chains, loose, layer) {
91909190
chains.forEach(function (c) {
9191-
var range = getChainBezierRange(curve, c, layer, addToLayer);
9191+
var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
91929192
if (range) {
91939193
var b = getScratch(curve.seed);
91949194
var piece = b.split(range.startT, range.endT);
@@ -9203,7 +9203,7 @@ var MakerJs;
92039203
//bezier is linear
92049204
return addToLayer(wp.pathContext, layer, true);
92059205
}
9206-
var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset);
9206+
var range = getActualBezierRange(curve, wp.pathContext, MakerJs.point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance);
92079207
if (range) {
92089208
var b = getScratch(curve.seed);
92099209
var piece = b.split(range.startT, range.endT);

packages/maker.js/src/core/chain.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@
235235
var beziers: IWalkModel[];
236236
if (opts.unifyBeziers) {
237237
beziers = getBezierModels(modelContext);
238-
swapBezierPathsWithSeeds(beziers, true);
238+
swapBezierPathsWithSeeds(beziers, true, opts.pointMatchingDistance);
239239
}
240240

241241
walk(modelContext, walkOptions);
@@ -280,7 +280,7 @@
280280
}
281281

282282
if (beziers) {
283-
swapBezierPathsWithSeeds(beziers, false);
283+
swapBezierPathsWithSeeds(beziers, false, opts.pointMatchingDistance);
284284
}
285285

286286
if (opts.byLayers) {
@@ -398,7 +398,7 @@
398398
/**
399399
* @private
400400
*/
401-
function swapBezierPathsWithSeeds(beziers: IWalkModel[], swap: boolean) {
401+
function swapBezierPathsWithSeeds(beziers: IWalkModel[], swap: boolean, pointMatchingDistance: number) {
402402
const tempKey = 'tempPaths';
403403
const tempLayerKey = 'tempLayer';
404404

@@ -414,7 +414,7 @@
414414
}
415415

416416
//use seeds as path, hide the arc paths from findChains()
417-
var bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true });
417+
var bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance });
418418

419419
for (var layer in bezierPartsByLayer) {
420420
var bezierSeeds = bezierPartsByLayer[layer];
@@ -436,15 +436,15 @@
436436
//revert the above
437437

438438
if (tempKey in b) {
439-
b.paths = b[tempKey];
439+
b.paths = b[tempKey] as IPathMap;
440440
delete b[tempKey];
441441
}
442442

443443
if (tempLayerKey in b) {
444444
if (b[tempLayerKey] == undefined) {
445445
delete (b as IModel).layer;
446446
} else {
447-
(b as IModel).layer = b[tempLayerKey];
447+
(b as IModel).layer = b[tempLayerKey] as string;
448448
}
449449
delete b[tempLayerKey];
450450
}

packages/maker.js/src/core/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ namespace MakerJs.model {
475475

476476
if (modelToDistort.type === models.BezierCurve.typeName) {
477477
const b = modelToDistort as models.BezierCurve;
478-
const bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true });
478+
const bezierPartsByLayer = models.BezierCurve.getBezierSeeds(b, { byLayers: true, pointMatchingDistance: bezierAccuracy });
479479
for (let layer in bezierPartsByLayer) {
480480
let pathArray = bezierPartsByLayer[layer]
481481
pathArray.forEach((p, i) => {

packages/maker.js/src/models/BezierCurve.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@
245245
/**
246246
* @private
247247
*/
248-
function getActualBezierRange(curve: BezierCurve, arc: IPathArcInBezierCurve, endpoints: IPoint[], offset: IPoint): IBezierRange {
248+
function getActualBezierRange(curve: BezierCurve, arc: IPathArcInBezierCurve, endpoints: IPoint[], offset: IPoint, pointMatchingDistance: number): IBezierRange {
249249
var b = getScratch(curve.seed);
250250
var tPoints = [arc.bezierData.startT, arc.bezierData.endT].map(t => new TPoint(b, t, offset));
251251
var ends = endpoints.slice();
@@ -255,7 +255,7 @@
255255
if (endpointDistancetoStart[0] > endpointDistancetoStart[1]) ends.reverse();
256256

257257
for (var i = 2; i--;) {
258-
if (!measure.isPointEqual(ends[i], tPoints[i].point)) {
258+
if (!measure.isPointEqual(ends[i], tPoints[i].point, pointMatchingDistance)) {
259259
return null;
260260
}
261261
}
@@ -273,15 +273,15 @@
273273
/**
274274
* @private
275275
*/
276-
function getChainBezierRange(curve: BezierCurve, c: IChain, layer: string, addToLayer: IAddToLayer): IBezierRange {
276+
function getChainBezierRange(curve: BezierCurve, c: IChain, layer: string, addToLayer: IAddToLayer, pointMatchingDistance: number): IBezierRange {
277277

278278
var endLinks = [c.links[0], c.links[c.links.length - 1]];
279279
if ((endLinks[0].walkedPath.pathContext as IPathArcInBezierCurve).bezierData.startT > (endLinks[1].walkedPath.pathContext as IPathArcInBezierCurve).bezierData.startT) {
280280
chain.reverse(c);
281281
endLinks.reverse();
282282
}
283283

284-
var actualBezierRanges = endLinks.map(endLink => getActualBezierRange(curve, endLink.walkedPath.pathContext as IPathArcInBezierCurve, endLink.endPoints, endLink.walkedPath.offset));
284+
var actualBezierRanges = endLinks.map(endLink => getActualBezierRange(curve, endLink.walkedPath.pathContext as IPathArcInBezierCurve, endLink.endPoints, endLink.walkedPath.offset, pointMatchingDistance));
285285

286286
var result: IBezierRange = {
287287
startT: actualBezierRanges[0] ? actualBezierRanges[0].startT : null,
@@ -523,7 +523,7 @@
523523
model.findChains(curve, function (chains: IChain[], loose: IWalkPath[], layer: string) {
524524

525525
chains.forEach(c => {
526-
var range = getChainBezierRange(curve, c, layer, addToLayer);
526+
var range = getChainBezierRange(curve, c, layer, addToLayer, options.pointMatchingDistance);
527527
if (range) {
528528
var b = getScratch(curve.seed);
529529
var piece = b.split(range.startT, range.endT);
@@ -538,7 +538,7 @@
538538
//bezier is linear
539539
return addToLayer(wp.pathContext, layer, true);
540540
}
541-
var range = getActualBezierRange(curve, wp.pathContext as IPathArcInBezierCurve, point.fromPathEnds(wp.pathContext), wp.offset);
541+
var range = getActualBezierRange(curve, wp.pathContext as IPathArcInBezierCurve, point.fromPathEnds(wp.pathContext), wp.offset, options.pointMatchingDistance);
542542
if (range) {
543543
var b = getScratch(curve.seed);
544544
var piece = b.split(range.startT, range.endT);

packages/maker.js/test/data/newrocker-NewRocker-Regular.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -978,12 +978,12 @@
978978
"arc_1": {
979979
"type": "arc",
980980
"origin": [
981-
34.21829549156312,
982-
20.29048503372315
981+
34.21829499017781,
982+
20.290491976000105
983983
],
984-
"radius": 24.489835405737637,
985-
"startAngle": 245.1291957434888,
986-
"endAngle": 248.37085975705295,
984+
"radius": 24.489841674393777,
985+
"startAngle": 245.12920363866954,
986+
"endAngle": 248.37086683423286,
987987
"bezierData": {
988988
"startT": 0.375,
989989
"endT": 0.765625
@@ -992,12 +992,12 @@
992992
"arc_2": {
993993
"type": "arc",
994994
"origin": [
995-
31.345750652972885,
996-
14.049104010594398
995+
31.345837857608277,
996+
14.049286424965011
997997
],
998-
"radius": 17.619183600608075,
999-
"startAngle": 242.64611943578197,
1000-
"endAngle": 245.06799726651286,
998+
"radius": 17.61938577599639,
999+
"startAngle": 242.6461401266273,
1000+
"endAngle": 245.0679901692163,
10011001
"bezierData": {
10021002
"startT": 0.765625,
10031003
"endT": 1

0 commit comments

Comments
 (0)