poly-extrude 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/poly-extrude.js +205 -65
- package/dist/poly-extrude.js.map +1 -1
- package/dist/poly-extrude.min.js +2 -2
- package/dist/poly-extrude.mjs +204 -66
- package/index.js +2 -2
- package/package.json +3 -2
- package/src/polyline.js +155 -24
package/dist/poly-extrude.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* poly-extrude v0.
|
2
|
+
* poly-extrude v0.5.0
|
3
3
|
*/
|
4
4
|
(function (global, factory) {
|
5
5
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
@@ -1091,9 +1091,66 @@
|
|
1091
1091
|
result.lines = lines;
|
1092
1092
|
return result;
|
1093
1093
|
}
|
1094
|
+
function extrudeSlopes(lines, options) {
|
1095
|
+
options = Object.assign({}, {
|
1096
|
+
depth: 2,
|
1097
|
+
lineWidth: 1,
|
1098
|
+
side: 'left',
|
1099
|
+
sideDepth: 0
|
1100
|
+
}, options);
|
1101
|
+
var _options = options,
|
1102
|
+
depth = _options.depth,
|
1103
|
+
side = _options.side,
|
1104
|
+
sideDepth = _options.sideDepth;
|
1105
|
+
var results = lines.map(function (line) {
|
1106
|
+
var tempResult = expandLine(line, options);
|
1107
|
+
tempResult.line = line;
|
1108
|
+
var leftPoints = tempResult.leftPoints,
|
1109
|
+
rightPoints = tempResult.rightPoints;
|
1110
|
+
var result = {
|
1111
|
+
line: line
|
1112
|
+
};
|
1113
|
+
var depths;
|
1114
|
+
|
1115
|
+
for (var i = 0, len = line.length; i < len; i++) {
|
1116
|
+
line[i][2] = line[i][2] || 0;
|
1117
|
+
}
|
1118
|
+
|
1119
|
+
if (side === 'left') {
|
1120
|
+
result.leftPoints = leftPoints;
|
1121
|
+
result.rightPoints = line;
|
1122
|
+
depths = [sideDepth, depth];
|
1123
|
+
} else {
|
1124
|
+
result.leftPoints = line;
|
1125
|
+
result.rightPoints = rightPoints;
|
1126
|
+
depths = [depth, sideDepth];
|
1127
|
+
}
|
1128
|
+
|
1129
|
+
result.depths = depths;
|
1130
|
+
generateTopAndBottom(result, options);
|
1131
|
+
generateSides(result, options);
|
1132
|
+
result.position = new Float32Array(result.points);
|
1133
|
+
result.indices = new Uint32Array(result.index);
|
1134
|
+
result.uv = new Float32Array(result.uvs);
|
1135
|
+
result.normal = generateNormal(result.indices, result.position);
|
1136
|
+
return result;
|
1137
|
+
});
|
1138
|
+
var result = merge(results);
|
1139
|
+
result.lines = lines;
|
1140
|
+
return result;
|
1141
|
+
}
|
1094
1142
|
|
1095
1143
|
function generateTopAndBottom(result, options) {
|
1096
1144
|
var z = options.depth;
|
1145
|
+
var depths = result.depths;
|
1146
|
+
var lz = z,
|
1147
|
+
rz = z;
|
1148
|
+
|
1149
|
+
if (depths) {
|
1150
|
+
lz = depths[0];
|
1151
|
+
rz = depths[1];
|
1152
|
+
}
|
1153
|
+
|
1097
1154
|
var points = [],
|
1098
1155
|
index = [],
|
1099
1156
|
uvs = [];
|
@@ -1111,7 +1168,7 @@
|
|
1111
1168
|
z1 = _leftPoints$i[2];
|
1112
1169
|
points[idx0] = x1;
|
1113
1170
|
points[idx0 + 1] = y1;
|
1114
|
-
points[idx0 + 2] =
|
1171
|
+
points[idx0 + 2] = lz + z1; // top right
|
1115
1172
|
|
1116
1173
|
var _rightPoints$i = rightPoints[i],
|
1117
1174
|
x2 = _rightPoints$i[0],
|
@@ -1120,7 +1177,7 @@
|
|
1120
1177
|
var idx1 = len * 3 + idx0;
|
1121
1178
|
points[idx1] = x2;
|
1122
1179
|
points[idx1 + 1] = y2;
|
1123
|
-
points[idx1 + 2] =
|
1180
|
+
points[idx1 + 2] = rz + z2; // bottom left
|
1124
1181
|
|
1125
1182
|
var idx2 = len * 2 * 3 + idx0;
|
1126
1183
|
points[idx2] = x1;
|
@@ -1171,6 +1228,17 @@
|
|
1171
1228
|
result.index = index;
|
1172
1229
|
result.points = points;
|
1173
1230
|
result.uvs = uvs;
|
1231
|
+
|
1232
|
+
if (depths) {
|
1233
|
+
len = leftPoints.length;
|
1234
|
+
i = 0;
|
1235
|
+
|
1236
|
+
while (i < len) {
|
1237
|
+
leftPoints[i].depth = lz;
|
1238
|
+
rightPoints[i].depth = rz;
|
1239
|
+
i++;
|
1240
|
+
}
|
1241
|
+
}
|
1174
1242
|
}
|
1175
1243
|
|
1176
1244
|
function generateSides(result, options) {
|
@@ -1181,10 +1249,11 @@
|
|
1181
1249
|
uvs = result.uvs;
|
1182
1250
|
var z = options.depth;
|
1183
1251
|
var rings = [leftPoints, rightPoints];
|
1252
|
+
var depthsEnable = result.depths;
|
1184
1253
|
|
1185
1254
|
function addOneSideIndex(v1, v2) {
|
1186
1255
|
var idx = points.length / 3;
|
1187
|
-
points.push(v1[0], v1[1], z + v1[2], v2[0], v2[1], z + v2[2], v1[0], v1[1], v1[2], v2[0], v2[1], v2[2]);
|
1256
|
+
points.push(v1[0], v1[1], (depthsEnable ? v1.depth : z) + v1[2], v2[0], v2[1], (depthsEnable ? v2.depth : z) + v2[2], v1[0], v1[1], v1[2], v2[0], v2[1], v2[2]);
|
1188
1257
|
var a = idx + 2,
|
1189
1258
|
b = idx + 3,
|
1190
1259
|
c = idx,
|
@@ -1233,7 +1302,7 @@
|
|
1233
1302
|
y: 0
|
1234
1303
|
};
|
1235
1304
|
function expandLine(line, options) {
|
1236
|
-
|
1305
|
+
// let preAngle = 0;
|
1237
1306
|
var radius = options.lineWidth / 2;
|
1238
1307
|
var points = [],
|
1239
1308
|
leftPoints = [],
|
@@ -1241,66 +1310,76 @@
|
|
1241
1310
|
var len = line.length;
|
1242
1311
|
var i = 0;
|
1243
1312
|
|
1244
|
-
while (i < len
|
1245
|
-
var
|
1246
|
-
|
1247
|
-
var
|
1248
|
-
|
1249
|
-
|
1313
|
+
while (i < len) {
|
1314
|
+
var p1 = line[i],
|
1315
|
+
p2 = line[i + 1];
|
1316
|
+
var currentp = line[i]; // last vertex
|
1317
|
+
|
1318
|
+
if (i === len - 1) {
|
1319
|
+
p1 = line[len - 2];
|
1320
|
+
p2 = line[len - 1];
|
1321
|
+
}
|
1322
|
+
|
1323
|
+
var dy = p2[1] - p1[1],
|
1324
|
+
dx = p2[0] - p1[0];
|
1325
|
+
var rAngle = 0;
|
1250
1326
|
var rad = Math.atan(dy / dx);
|
1251
|
-
var angle = radToDeg(rad);
|
1252
|
-
preAngle = angle;
|
1327
|
+
var angle = radToDeg(rad); // preAngle = angle;
|
1253
1328
|
|
1254
|
-
if (i === 0) {
|
1255
|
-
|
1256
|
-
|
1329
|
+
if (i === 0 || i === len - 1) {
|
1330
|
+
rAngle = angle;
|
1331
|
+
rAngle -= 90;
|
1257
1332
|
} else {
|
1333
|
+
// 至少3个顶点才会触发
|
1258
1334
|
var p0 = line[i - 1];
|
1259
|
-
TEMPV1.x = p0[0] -
|
1260
|
-
TEMPV1.y = p0[1] -
|
1261
|
-
TEMPV2.x =
|
1262
|
-
TEMPV2.y =
|
1335
|
+
TEMPV1.x = p0[0] - p1[0];
|
1336
|
+
TEMPV1.y = p0[1] - p1[1];
|
1337
|
+
TEMPV2.x = p2[0] - p1[0];
|
1338
|
+
TEMPV2.y = p2[1] - p1[1];
|
1263
1339
|
var vAngle = getAngle(TEMPV1, TEMPV2);
|
1264
|
-
|
1340
|
+
rAngle = angle - vAngle / 2;
|
1265
1341
|
}
|
1266
1342
|
|
1267
|
-
var
|
1343
|
+
var rRad = degToRad(rAngle);
|
1344
|
+
var p3 = currentp;
|
1345
|
+
var x = Math.cos(rRad) + p3[0],
|
1346
|
+
y = Math.sin(rRad) + p3[1];
|
1347
|
+
var p4 = [x, y];
|
1268
1348
|
|
1269
|
-
var
|
1270
|
-
|
1271
|
-
|
1349
|
+
var _translateLine = translateLine(p1, p2, radius),
|
1350
|
+
line1 = _translateLine[0],
|
1351
|
+
line2 = _translateLine[1];
|
1272
1352
|
|
1273
|
-
|
1353
|
+
var op1 = lineIntersection(line1[0], line1[1], p3, p4);
|
1354
|
+
var op2 = lineIntersection(line2[0], line2[1], p3, p4); // 平行,回头路
|
1274
1355
|
|
1275
|
-
if (
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
leftPoints.push(_op2);
|
1280
|
-
rightPoints.push(_op);
|
1281
|
-
}
|
1356
|
+
if (!op1 || !op2) {
|
1357
|
+
var len1 = points.length;
|
1358
|
+
var point1 = points[len1 - 2];
|
1359
|
+
var point2 = points[len1 - 1];
|
1282
1360
|
|
1283
|
-
|
1284
|
-
|
1361
|
+
if (!point1 || !point2) {
|
1362
|
+
continue;
|
1363
|
+
}
|
1285
1364
|
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
var p1 = line[len - 2];
|
1290
|
-
var p2 = line[len - 1];
|
1365
|
+
op1 = [point1[0], point1[1]];
|
1366
|
+
op2 = [point2[0], point2[1]];
|
1367
|
+
}
|
1291
1368
|
|
1292
|
-
|
1293
|
-
|
1294
|
-
op2 = _calOffsetPoint2[1];
|
1369
|
+
op1[2] = currentp[2] || 0;
|
1370
|
+
op2[2] = currentp[2] || 0; // const [op1, op2] = calOffsetPoint(rRad, radius, p1);
|
1295
1371
|
|
1296
|
-
|
1372
|
+
points.push(op1, op2);
|
1297
1373
|
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1374
|
+
if (leftOnLine(op1, p1, p2)) {
|
1375
|
+
leftPoints.push(op1);
|
1376
|
+
rightPoints.push(op2);
|
1377
|
+
} else {
|
1378
|
+
leftPoints.push(op2);
|
1379
|
+
rightPoints.push(op1);
|
1380
|
+
}
|
1381
|
+
|
1382
|
+
i++;
|
1304
1383
|
}
|
1305
1384
|
|
1306
1385
|
return {
|
@@ -1308,21 +1387,7 @@
|
|
1308
1387
|
leftPoints: leftPoints,
|
1309
1388
|
rightPoints: rightPoints
|
1310
1389
|
};
|
1311
|
-
}
|
1312
|
-
|
1313
|
-
function calOffsetPoint(rad, radius, p) {
|
1314
|
-
var x = p[0],
|
1315
|
-
y = p[1];
|
1316
|
-
var z = p[2] || 0;
|
1317
|
-
var x1 = Math.cos(rad) * radius,
|
1318
|
-
y1 = Math.sin(rad) * radius;
|
1319
|
-
var p1 = [x + x1, y + y1, z];
|
1320
|
-
var rad1 = rad += Math.PI;
|
1321
|
-
var x2 = Math.cos(rad1) * radius,
|
1322
|
-
y2 = Math.sin(rad1) * radius;
|
1323
|
-
var p2 = [x + x2, y + y2, z];
|
1324
|
-
return [p1, p2];
|
1325
|
-
}
|
1390
|
+
} // eslint-disable-next-line no-unused-vars
|
1326
1391
|
|
1327
1392
|
var getAngle = function getAngle(_ref, _ref2) {
|
1328
1393
|
var x1 = _ref.x,
|
@@ -1344,6 +1409,79 @@
|
|
1344
1409
|
y = p[1];
|
1345
1410
|
return (y1 - y2) * x + (x2 - x1) * y + x1 * y2 - x2 * y1 > 0;
|
1346
1411
|
}
|
1412
|
+
/**
|
1413
|
+
* 平移线
|
1414
|
+
* @param {*} p1
|
1415
|
+
* @param {*} p2
|
1416
|
+
* @param {*} distance
|
1417
|
+
* @returns
|
1418
|
+
*/
|
1419
|
+
|
1420
|
+
function translateLine(p1, p2, distance) {
|
1421
|
+
var dy = p2[1] - p1[1],
|
1422
|
+
dx = p2[0] - p1[0];
|
1423
|
+
var rad = Math.atan2(dy, dx);
|
1424
|
+
var rad1 = rad + Math.PI / 2;
|
1425
|
+
var offsetX = Math.cos(rad1) * distance,
|
1426
|
+
offsetY = Math.sin(rad1) * distance;
|
1427
|
+
var tp1 = [p1[0] + offsetX, p1[1] + offsetY];
|
1428
|
+
var tp2 = [p2[0] + offsetX, p2[1] + offsetY];
|
1429
|
+
var rad2 = rad - Math.PI / 2;
|
1430
|
+
offsetX = Math.cos(rad2) * distance;
|
1431
|
+
offsetY = Math.sin(rad2) * distance;
|
1432
|
+
var tp3 = [p1[0] + offsetX, p1[1] + offsetY];
|
1433
|
+
var tp4 = [p2[0] + offsetX, p2[1] + offsetY];
|
1434
|
+
return [[tp1, tp2], [tp3, tp4]];
|
1435
|
+
}
|
1436
|
+
/**
|
1437
|
+
* 直线交点
|
1438
|
+
* @param {*} p1
|
1439
|
+
* @param {*} p2
|
1440
|
+
* @param {*} p3
|
1441
|
+
* @param {*} p4
|
1442
|
+
* @returns
|
1443
|
+
*/
|
1444
|
+
|
1445
|
+
|
1446
|
+
function lineIntersection(p1, p2, p3, p4) {
|
1447
|
+
var dx1 = p2[0] - p1[0],
|
1448
|
+
dy1 = p2[1] - p1[1];
|
1449
|
+
var dx2 = p4[0] - p3[0],
|
1450
|
+
dy2 = p4[1] - p3[1];
|
1451
|
+
|
1452
|
+
if (dx1 === 0 && dx2 === 0) {
|
1453
|
+
return null;
|
1454
|
+
}
|
1455
|
+
|
1456
|
+
if (dy1 === 0 && dy2 === 0) {
|
1457
|
+
return null;
|
1458
|
+
}
|
1459
|
+
|
1460
|
+
var k1 = dy1 / dx1;
|
1461
|
+
var k2 = dy2 / dx2;
|
1462
|
+
var b1 = p1[1] - k1 * p1[0];
|
1463
|
+
var b2 = p3[1] - k2 * p3[0];
|
1464
|
+
var x, y;
|
1465
|
+
|
1466
|
+
if (dx1 === 0) {
|
1467
|
+
x = p1[0];
|
1468
|
+
y = k2 * x + b2;
|
1469
|
+
} else if (dx2 === 0) {
|
1470
|
+
x = p3[0];
|
1471
|
+
y = k1 * x + b1;
|
1472
|
+
} else if (dy1 === 0) {
|
1473
|
+
y = p1[1];
|
1474
|
+
x = (y - b2) / k2;
|
1475
|
+
} else if (dy2 === 0) {
|
1476
|
+
y = p3[1];
|
1477
|
+
x = (y - b1) / k1;
|
1478
|
+
} else {
|
1479
|
+
x = (b2 - b1) / (k1 - k2);
|
1480
|
+
y = k1 * x + b1;
|
1481
|
+
}
|
1482
|
+
|
1483
|
+
return [x, y];
|
1484
|
+
}
|
1347
1485
|
|
1348
1486
|
function cylinder(point, options) {
|
1349
1487
|
if (options === void 0) {
|
@@ -3437,6 +3575,8 @@
|
|
3437
3575
|
exports.expandPaths = expandPaths;
|
3438
3576
|
exports.extrudePolygons = extrudePolygons;
|
3439
3577
|
exports.extrudePolylines = extrudePolylines;
|
3578
|
+
exports.extrudeSlopes = extrudeSlopes;
|
3579
|
+
exports.leftOnLine = leftOnLine;
|
3440
3580
|
|
3441
3581
|
Object.defineProperty(exports, '__esModule', { value: true });
|
3442
3582
|
|