holes-in
Version:
Generates a 3D mesh from a 2D outer path and 2D inner paths
137 lines (120 loc) • 4.31 kB
JavaScript
;
// const pathHelper = require("./path-helper.js");
var drawHelper = {
colors: ["green", "red", "blue", "purple"],
strokeColors: ["black", "black", "black", "black"],
drawPaths: function drawPaths(ctx, paths, position, fillColors, strokeColors, fillModes) {
if (!fillModes) fillModes = [];
if (!fillColors) fillColors = drawHelper.colors;
if (!strokeColors) strokeColors = drawHelper.strokeColors;
for (var i = 0; i < paths.length; i++) {
drawHelper.drawPath(ctx, paths[i], position, fillColors[i], strokeColors[i], fillModes[i]);
}
},
drawPath: function drawPath(ctx, pathToDraw, position, fillColor, strokeColor, fillMode) {
if (!position) {
position = {
X: 0,
Y: 0
};
}
var path = [];
if (pathToDraw.length === 0) return;
for (var i = 0; i < pathToDraw.length; i++) {
path.push({
X: pathToDraw[i].X + position.X,
Y: pathToDraw[i].Y + position.Y
});
}
ctx.lineWidth = 2;
if (!fillColor) {
fillColor = "black";
}
ctx.fillStyle = fillColor;
if (!strokeColor) {
strokeColor = "black";
}
ctx.strokeStyle = strokeColor;
if (!fillMode) {
fillMode = "nonzero";
}
ctx.mozFillRule = fillMode;
// Draws the inner of the path
var pathFill = new Path2D();
pathFill.moveTo(path[0].X, path[0].Y);
for (var _i = 0; _i < path.length; _i++) {
pathFill.lineTo(path[_i].X, path[_i].Y);
}
pathFill.lineTo(path[0].X, path[0].Y);
ctx.fill(pathFill, fillMode);
ctx.closePath();
// Draws the arrows
/* var pathArrow = new Path2D();
for (let i = 0; i < path.length - 1; i++) {
drawHelper.drawArrow(ctx, path[i], path[i + 1]);
}
drawHelper.drawArrow(ctx, path[path.length - 1], path[0]);
//Draws the dots:
for (let i = 0; i < path.length; i++) {
drawHelper.drawDot(ctx, path[i]);
}
*/
},
drawArrow: function drawArrow(ctx, begin, end) {
ctx.save();
ctx.moveTo(begin.X, begin.Y);
ctx.lineTo(end.X, end.Y);
ctx.stroke();
var vect = {
X: end.X - begin.X,
Y: end.Y - begin.Y
};
var norm = Math.sqrt(vect.X * vect.X + vect.Y * vect.Y);
vect = {
X: vect.X / norm,
Y: vect.Y / norm
};
var angle = Math.PI / 2 + Math.atan2(vect.Y, vect.X);
ctx.translate(begin.X + vect.X * norm * 0.75, begin.Y + vect.Y * norm * 0.75);
ctx.rotate(angle);
var sizeA = 5;
var branch1 = {
X: sizeA,
Y: sizeA
};
var branch2 = {
X: -sizeA,
Y: sizeA
};
ctx.beginPath();
ctx.moveTo(branch1.X, branch1.Y);
ctx.lineTo(0, 0);
ctx.lineTo(branch2.X, branch2.Y);
ctx.stroke();
ctx.restore();
},
drawDot: function drawDot(ctx, dot) {
ctx.fillStyle = "red";
ctx.fillRect(dot.X, dot.Y, 4, 4);
},
drawTriangles: function drawTriangles(ctx, pointsAndTriangles, translation) {
for (var i = 0; i < pointsAndTriangles.triangles.length; i++) {
drawHelper.drawTriangle(ctx, pointsAndTriangles.points, pointsAndTriangles.triangles[i], translation);
}
},
drawTriangle: function drawTriangle(ctx, points, triangle, translation) {
if (!translation) {
translation = {
X: 0,
Y: 0
};
}
ctx.beginPath();
ctx.moveTo(points[triangle[0]][0] + translation.X, points[triangle[0]][1] + translation.Y);
ctx.lineTo(points[triangle[1]][0] + translation.X, points[triangle[1]][1] + translation.Y);
ctx.lineTo(points[triangle[2]][0] + translation.X, points[triangle[2]][1] + translation.Y);
ctx.lineTo(points[triangle[0]][0] + translation.X, points[triangle[0]][1] + translation.Y);
ctx.stroke();
}
};
module.exports = drawHelper;