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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * poly-extrude v0.3.0
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] = z + z1; // top right
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] = z + z2; // bottom left
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
- var preAngle = 0;
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 - 1) {
1245
- var _p = line[i],
1246
- _p2 = line[i + 1];
1247
- var dy = _p2[1] - _p[1],
1248
- dx = _p2[0] - _p[0];
1249
- var _rAngle = 0;
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
- _rAngle = angle;
1256
- _rAngle -= 90;
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] - _p[0];
1260
- TEMPV1.y = p0[1] - _p[1];
1261
- TEMPV2.x = _p2[0] - _p[0];
1262
- TEMPV2.y = _p2[1] - _p[1];
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
- _rAngle = angle - vAngle / 2;
1340
+ rAngle = angle - vAngle / 2;
1265
1341
  }
1266
1342
 
1267
- var _rRad = degToRad(_rAngle);
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 _calOffsetPoint = calOffsetPoint(_rRad, radius, _p),
1270
- _op = _calOffsetPoint[0],
1271
- _op2 = _calOffsetPoint[1];
1349
+ var _translateLine = translateLine(p1, p2, radius),
1350
+ line1 = _translateLine[0],
1351
+ line2 = _translateLine[1];
1272
1352
 
1273
- points.push(_op, _op2);
1353
+ var op1 = lineIntersection(line1[0], line1[1], p3, p4);
1354
+ var op2 = lineIntersection(line2[0], line2[1], p3, p4); // 平行,回头路
1274
1355
 
1275
- if (leftOnLine(_op, _p, _p2)) {
1276
- leftPoints.push(_op);
1277
- rightPoints.push(_op2);
1278
- } else {
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
- i++;
1284
- }
1361
+ if (!point1 || !point2) {
1362
+ continue;
1363
+ }
1285
1364
 
1286
- var rAngle = preAngle;
1287
- rAngle -= 90;
1288
- var rRad = degToRad(rAngle);
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
- var _calOffsetPoint2 = calOffsetPoint(rRad, radius, p2),
1293
- op1 = _calOffsetPoint2[0],
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
- points.push(op1, op2);
1372
+ points.push(op1, op2);
1297
1373
 
1298
- if (leftOnLine(op1, p1, p2)) {
1299
- leftPoints.push(op1);
1300
- rightPoints.push(op2);
1301
- } else {
1302
- leftPoints.push(op2);
1303
- rightPoints.push(op1);
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