1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-08-13 10:14:41 +02:00

fix join-miter error

This commit is contained in:
Justin Lin
2022-05-04 10:17:34 +08:00
parent ccf77872ed
commit 61fef89bfd

View File

@@ -34,8 +34,8 @@ module polyline2d(points, width = 1, startingStyle = "CAP_SQUARE", endingStyle =
p1Style = p1Style, p2Style = p2Style); p1Style = p1Style, p2Style = p2Style);
} }
module joins(line, radius, i_end, i) { module joins(line, radius, i_end, j) {
if(i < i_end) { for(i = [j:i_end - 1]) {
p1 = line[i]; p1 = line[i];
p2 = line[i + 1]; p2 = line[i + 1];
p3 = line[i + 2]; p3 = line[i + 2];
@@ -46,25 +46,28 @@ module polyline2d(points, width = 1, startingStyle = "CAP_SQUARE", endingStyle =
normv1xv2 = sqrt(v1 * v1 * v2 * v2); normv1xv2 = sqrt(v1 * v1 * v2 * v2);
cosa = (v1 * v2) / normv1xv2; cosa = (v1 * v2) / normv1xv2;
sina = -c / normv1xv2; sina = -c / normv1xv2;
a = acos(cosa);
translate(p2) translate(p2)
rotate(atan2(v1.y, v1.x) + (c > 0 ? -90 : asin(cosa))) { rotate(90 + atan2(v1.y, v1.x))
{
if(joinStyle == "JOIN_ROUND") { if(joinStyle == "JOIN_ROUND") {
a = acos(cosa); rotate(c > 0 ? 180 : -a)
pie( pie(
radius = radius, radius = radius,
angle = [0, a], angle = [0, a],
$fn = fn * 360 / a $fn = fn * 360 / a
); );
} else if(joinStyle == "JOIN_MITER") { } else {
tana2 = sina / (1 + cosa); // tan(a / 2) rotate(c > 0 ? 180 + a : -a)
polygon(radius * [[0, 0], [1, 0], [1, tana2], [cosa, sina]]); if(joinStyle == "JOIN_MITER") {
} else { // "JOIN_BEVEL" polygon(radius * [[0, 0], [1, 0], [1, sina / (1 + cosa)], [cosa, sina]]);
polygon(radius * [[0, 0], [1, 0], [cosa, sina]]); } else { // "JOIN_BEVEL"
polygon(radius * [[0, 0], [1, 0], [cosa, sina]]);
}
} }
} }
joins(line, radius, i_end, i + 1);
} }
} }