Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
const far_point = m.point.fromAngleOnCircle((angle_a + angle_b) / 2 + sign * 90, circ)
const ca = furthest(cas, far_point)
const cb = furthest(cbs, far_point)
const arc = new m.models.BezierCurve([ca, center, cb])
const remove = {
paths: {
a: line(ca, far_point),
b: line(far_point, cb),
c: line(cb, ca)
}
}
const add = {
models: {
arc: new m.models.BezierCurve([ca, center, cb])
},
paths: {
line: line(ca, cb)
}
}
target = subtract(target, remove)
target = combine(target, add)
} else {
// similarly to above, got to make sure the piece we want to combine
// has some intersection with the target or it won't "stick"
const inner_point = m.point.fromAngleOnCircle((angle_a + angle_b) / 2 - sign * 90, circ)
const ca = furthest(cas, inner_point)
const cb = furthest(cbs, inner_point)
///
var makerjs = require('makerjs');
var arc = makerjs.paths.Arc;
var line = makerjs.paths.Line;
var point = makerjs.point;
var PolygonStackBoxInside = (function () {
function PolygonStackBoxInside(angle, radius, holeRadius, rimThickness) {
var rim = Math.min(rimThickness, holeRadius);
var a2 = angle * 2;
var innerFilletCenter = point.rotate([radius + 2 * holeRadius + rim, 0], 90 + angle, [radius, 0]);
var innerFilletTop = new arc(innerFilletCenter, holeRadius, 270 + angle, angle);
var innerFilletTopPoints = point.fromArc(innerFilletTop);
var innerFilletBottomPoint = [innerFilletTopPoints[1][0], -innerFilletTopPoints[1][1]];
this.paths = {
innerFilletTop: innerFilletTop,
innerFilletBottom: makerjs.path.mirror(innerFilletTop, false, true),
innerLine: new line(innerFilletTopPoints[1], point.rotate(innerFilletBottomPoint, a2, [0, 0])),
innerFillet: new arc([radius, 0], holeRadius + rim, 90 + angle, 270 - angle)
};
}
const fix_corner_raw = (a, mirrored_a, b, mirrored_b, outer, target) => {
const center = m.path.intersection(a, b).intersectionPoints[0]
const angle_a = m.angle.ofLineInDegrees(a) + (mirrored_a ? 180 : 0)
const angle_b = m.angle.ofLineInDegrees(b) + (mirrored_b ? 180 : 0)
const angle = angle_b - angle_a
let radius = Math.tan(m.angle.toRadians(Math.abs(angle) / 2)) * corner_radius
const sign = radius > 0 ? 1 : -1
radius = Math.abs(radius)
const circ = circle(center, radius)
const cas = m.path.intersection(a, circ).intersectionPoints
const cbs = m.path.intersection(b, circ).intersectionPoints
// there can be multiple intersections, so we want the points
// furthest from the control (either inner or outer) point
const furthest = (arr, control) => {
let max
let max_dist = 0
const fix_corner_raw = (a, mirrored_a, b, mirrored_b, outer, target) => {
const center = m.path.intersection(a, b).intersectionPoints[0]
const angle_a = m.angle.ofLineInDegrees(a) + (mirrored_a ? 180 : 0)
const angle_b = m.angle.ofLineInDegrees(b) + (mirrored_b ? 180 : 0)
const angle = angle_b - angle_a
let radius = Math.tan(m.angle.toRadians(Math.abs(angle) / 2)) * corner_radius
const sign = radius > 0 ? 1 : -1
radius = Math.abs(radius)
const circ = circle(center, radius)
const cas = m.path.intersection(a, circ).intersectionPoints
const cbs = m.path.intersection(b, circ).intersectionPoints
// there can be multiple intersections, so we want the points
// furthest from the control (either inner or outer) point
const furthest = (arr, control) => {
let max
let max_dist = 0
for (const point of arr) {
const d = m.measure.pointDistance(point, control)
if (d > max_dist) {
max_dist = d
max = point
}
}
return max
const patch = (expand = 0) => {
const originated = m.model.originate(half(pos_hole()))
let lt = get_line(originated, ['inner', 'top', 't']).end
let lm = get_line(originated, ['inner', 'bottom', 'r']).end
let lb = get_line(originated, ['thumb', 'outer', 't']).end
if (expand) {
lt = m.point.add(lt, [0, expand])
lb = m.point.add(lb, [0, -expand])
}
// hacked right side --> won't matter, as it'll be mirrored anyway
rt = [lt[0] + 30, lt[1]]
rb = [lb[0] + 30, lb[1]]
return {
paths: {
a: line(lt, rt),
b: line(rt, rb),
c: line(rb, lb),
d: line(lb, lm),
e: line(lm, lt)
}
}
pixel_path.forEach(function (p) {
var previous_point = points[points.length - 1];
var point_to_add;
if (moveHorizontal) {
point_to_add = [p, 0];
} else {
point_to_add = [0, p];
}
var e = makerjs.point.add(previous_point, point_to_add);
points.push(e);
// flip direction each time
moveHorizontal = !moveHorizontal;
});
///
var makerjs = require('makerjs');
var arc = makerjs.paths.Arc;
var line = makerjs.paths.Line;
var point = makerjs.point;
var PolygonRimboxInside = (function () {
function PolygonRimboxInside(angle, radius, holeRadius, rimThickness) {
var rim = Math.min(rimThickness, holeRadius);
var innerFilletCenter = point.rotate([radius + 2 * holeRadius + rim, 0], 90 + angle, [radius, 0]);
var innerFilletTop = new arc(innerFilletCenter, holeRadius, 270 + angle, angle);
var innerFilletTopPoints = point.fromArc(innerFilletTop);
var innerFilletBottomPoint = [innerFilletTopPoints[1][0], -innerFilletTopPoints[1][1]];
this.paths = {
innerFilletTop: innerFilletTop,
innerFilletBottom: makerjs.path.mirror(innerFilletTop, false, true),
innerLine: new line(innerFilletTopPoints[1], point.rotate(innerFilletBottomPoint, angle * 2, [0, 0])),
innerFillet: new arc([radius, 0], holeRadius + rim, 90 + angle, 270 - angle)
};
}
return PolygonRimboxInside;
})();
///
var makerjs = require('makerjs');
var arc = makerjs.paths.Arc;
var line = makerjs.paths.Line;
var point = makerjs.point;
var PolygonStackBoxInside = (function () {
function PolygonStackBoxInside(angle, radius, holeRadius, rimThickness) {
var rim = Math.min(rimThickness, holeRadius);
var a2 = angle * 2;
var innerFilletCenter = point.rotate([radius + 2 * holeRadius + rim, 0], 90 + angle, [radius, 0]);
var innerFilletTop = new arc(innerFilletCenter, holeRadius, 270 + angle, angle);
var innerFilletTopPoints = point.fromArc(innerFilletTop);
var innerFilletBottomPoint = [innerFilletTopPoints[1][0], -innerFilletTopPoints[1][1]];
this.paths = {
innerFilletTop: innerFilletTop,
innerFilletBottom: makerjs.path.mirror(innerFilletTop, false, true),
innerLine: new line(innerFilletTopPoints[1], point.rotate(innerFilletBottomPoint, a2, [0, 0])),
innerFillet: new arc([radius, 0], holeRadius + rim, 90 + angle, 270 - angle)
};
}
return PolygonStackBoxInside;
let l = [_left, _bottom + fence_corner]
let lt = [_left, _top - fence_corner]
let t = [_left + fence_corner, _top]
let tr = [_right - fence_corner, _top]
let r = [_right, _top - fence_corner]
let rb = [_right, _bottom + fence_corner]
let b = [_right - fence_corner, _bottom]
let bl = [_left + fence_corner, _bottom]
// simplify the "below the wing" region
if (col == 'ring' && key == 'bottom') {
bl = m.point.add(bl, [0, -1])
b = m.point.add(b, [30, -1])
rb = m.point.add(rb, [30, -1])
} else if (col == 'pinky' && key == 'bottom') {
rb = m.point.add(rb, [10, 10])
// elongate the diagonal to reach the top of the next key
} else if (col == 'middle' && key == 'top') {
r = m.point.add(r, [5, -5])
// skip the mini step on the inner col + handle top middle connection
} else if (col == 'inner' && key == 'top') {
t = m.point.add(t, [0, 2])
tr = m.point.add(tr, [30, 2])
r = m.point.add(r, [30, 2])
// handle bottom middle connection
} else if (col == 'thumb' && key == 'outer') {
tr = m.point.add(tr, [0, 30])
r = m.point.add(r, [0, 30])
}
const patch = (expand = 0) => {
const originated = m.model.originate(half(pos_hole()))
let lt = get_line(originated, ['inner', 'top', 't']).end
let lm = get_line(originated, ['inner', 'bottom', 'r']).end
let lb = get_line(originated, ['thumb', 'outer', 't']).end
if (expand) {
lt = m.point.add(lt, [0, expand])
lb = m.point.add(lb, [0, -expand])
}
// hacked right side --> won't matter, as it'll be mirrored anyway
rt = [lt[0] + 30, lt[1]]
rb = [lb[0] + 30, lb[1]]
return {
paths: {
a: line(lt, rt),
b: line(rt, rb),
c: line(rb, lb),
d: line(lb, lm),
e: line(lm, lt)
}
}
}