Filters
SVG displacement and mask filters for a hand-drawn look.
Parameters
120
5
0.38
2.75
0.10
1
1.60
0.03
1
Display
Camera
const geometryGroup = scene.geometry.group();
const dimensionsGroup = scene.dimensions.group();
scene.enableFilter(true);
scene.enableMask(true);
const ROSE = "#e11d48";
const roseFillId = scene.addHatchFill(ROSE);
const roseStroke = ROSE;
const dimensionsOffset = 28;
const starStartAngle = Math.PI / 2;
scene.draw((p) => {
const { size: outerRadius, points, innerRadiusRatio } = p;
const innerRadius = outerRadius * innerRadiusRatio;
const pointCount = Math.max(3, Math.floor(points));
const step = Math.PI / pointCount;
const path = geometryGroup.path({ stroke: roseStroke, fill: roseFillId });
const startX = outerRadius * Math.cos(starStartAngle);
const startY = outerRadius * Math.sin(starStartAngle);
path.moveToAbs(startX, startY);
let previousX = startX;
let previousY = startY;
for (let vertexIndex = 1; vertexIndex < pointCount * 2; vertexIndex++) {
const isOuterPoint = vertexIndex % 2 === 0;
const pointRadius = isOuterPoint ? outerRadius : innerRadius;
const pointAngle = starStartAngle + step * vertexIndex;
const pointX = pointRadius * Math.cos(pointAngle);
const pointY = pointRadius * Math.sin(pointAngle);
path.lineTo(pointX - previousX, pointY - previousY);
previousX = pointX;
previousY = pointY;
}
path.close();
dimensionsGroup
.dimension()
.moveToAbs(-outerRadius, outerRadius + dimensionsOffset)
.arrow(Math.PI)
.lineTo(outerRadius * 2, 0)
.arrow(0)
.textAt(-outerRadius, 10, `${outerRadius * 2}mm`);
dimensionsGroup
.dimension()
.moveToAbs(outerRadius + dimensionsOffset, -outerRadius)
.arrow(-Math.PI / 2)
.lineTo(0, outerRadius * 2)
.arrow(Math.PI / 2)
.textAt(10, -outerRadius, `${outerRadius * 2}mm`, "start");
});