poly-extrude 0.3.0 → 0.4.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.4.0
3
3
  */
4
4
  (function (global, factory) {
5
5
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
@@ -1233,7 +1233,7 @@
1233
1233
  y: 0
1234
1234
  };
1235
1235
  function expandLine(line, options) {
1236
- var preAngle = 0;
1236
+ // let preAngle = 0;
1237
1237
  var radius = options.lineWidth / 2;
1238
1238
  var points = [],
1239
1239
  leftPoints = [],
@@ -1241,66 +1241,76 @@
1241
1241
  var len = line.length;
1242
1242
  var i = 0;
1243
1243
 
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;
1244
+ while (i < len) {
1245
+ var p1 = line[i],
1246
+ p2 = line[i + 1];
1247
+ var currentp = line[i]; // last vertex
1248
+
1249
+ if (i === len - 1) {
1250
+ p1 = line[len - 2];
1251
+ p2 = line[len - 1];
1252
+ }
1253
+
1254
+ var dy = p2[1] - p1[1],
1255
+ dx = p2[0] - p1[0];
1256
+ var rAngle = 0;
1250
1257
  var rad = Math.atan(dy / dx);
1251
- var angle = radToDeg(rad);
1252
- preAngle = angle;
1258
+ var angle = radToDeg(rad); // preAngle = angle;
1253
1259
 
1254
- if (i === 0) {
1255
- _rAngle = angle;
1256
- _rAngle -= 90;
1260
+ if (i === 0 || i === len - 1) {
1261
+ rAngle = angle;
1262
+ rAngle -= 90;
1257
1263
  } else {
1264
+ // 至少3个顶点才会触发
1258
1265
  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];
1266
+ TEMPV1.x = p0[0] - p1[0];
1267
+ TEMPV1.y = p0[1] - p1[1];
1268
+ TEMPV2.x = p2[0] - p1[0];
1269
+ TEMPV2.y = p2[1] - p1[1];
1263
1270
  var vAngle = getAngle(TEMPV1, TEMPV2);
1264
- _rAngle = angle - vAngle / 2;
1271
+ rAngle = angle - vAngle / 2;
1265
1272
  }
1266
1273
 
1267
- var _rRad = degToRad(_rAngle);
1274
+ var rRad = degToRad(rAngle);
1275
+ var p3 = currentp;
1276
+ var x = Math.cos(rRad) + p3[0],
1277
+ y = Math.sin(rRad) + p3[1];
1278
+ var p4 = [x, y];
1268
1279
 
1269
- var _calOffsetPoint = calOffsetPoint(_rRad, radius, _p),
1270
- _op = _calOffsetPoint[0],
1271
- _op2 = _calOffsetPoint[1];
1280
+ var _translateLine = translateLine(p1, p2, radius),
1281
+ line1 = _translateLine[0],
1282
+ line2 = _translateLine[1];
1272
1283
 
1273
- points.push(_op, _op2);
1284
+ var op1 = lineIntersection(line1[0], line1[1], p3, p4);
1285
+ var op2 = lineIntersection(line2[0], line2[1], p3, p4); // 平行,回头路
1274
1286
 
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
- }
1287
+ if (!op1 || !op2) {
1288
+ var len1 = points.length;
1289
+ var point1 = points[len1 - 2];
1290
+ var point2 = points[len1 - 1];
1282
1291
 
1283
- i++;
1284
- }
1292
+ if (!point1 || !point2) {
1293
+ continue;
1294
+ }
1295
+
1296
+ op1 = [point1[0], point1[1]];
1297
+ op2 = [point2[0], point2[1]];
1298
+ }
1285
1299
 
1286
- var rAngle = preAngle;
1287
- rAngle -= 90;
1288
- var rRad = degToRad(rAngle);
1289
- var p1 = line[len - 2];
1290
- var p2 = line[len - 1];
1300
+ op1[2] = currentp[2] || 0;
1301
+ op2[2] = currentp[2] || 0; // const [op1, op2] = calOffsetPoint(rRad, radius, p1);
1291
1302
 
1292
- var _calOffsetPoint2 = calOffsetPoint(rRad, radius, p2),
1293
- op1 = _calOffsetPoint2[0],
1294
- op2 = _calOffsetPoint2[1];
1303
+ points.push(op1, op2);
1295
1304
 
1296
- points.push(op1, op2);
1305
+ if (leftOnLine(op1, p1, p2)) {
1306
+ leftPoints.push(op1);
1307
+ rightPoints.push(op2);
1308
+ } else {
1309
+ leftPoints.push(op2);
1310
+ rightPoints.push(op1);
1311
+ }
1297
1312
 
1298
- if (leftOnLine(op1, p1, p2)) {
1299
- leftPoints.push(op1);
1300
- rightPoints.push(op2);
1301
- } else {
1302
- leftPoints.push(op2);
1303
- rightPoints.push(op1);
1313
+ i++;
1304
1314
  }
1305
1315
 
1306
1316
  return {
@@ -1308,21 +1318,7 @@
1308
1318
  leftPoints: leftPoints,
1309
1319
  rightPoints: rightPoints
1310
1320
  };
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
- }
1321
+ } // eslint-disable-next-line no-unused-vars
1326
1322
 
1327
1323
  var getAngle = function getAngle(_ref, _ref2) {
1328
1324
  var x1 = _ref.x,
@@ -1344,6 +1340,80 @@
1344
1340
  y = p[1];
1345
1341
  return (y1 - y2) * x + (x2 - x1) * y + x1 * y2 - x2 * y1 > 0;
1346
1342
  }
1343
+ /**
1344
+ * 平移线
1345
+ * @param {*} p1
1346
+ * @param {*} p2
1347
+ * @param {*} distance
1348
+ * @returns
1349
+ */
1350
+
1351
+
1352
+ function translateLine(p1, p2, distance) {
1353
+ var dy = p2[1] - p1[1],
1354
+ dx = p2[0] - p1[0];
1355
+ var rad = Math.atan2(dy, dx);
1356
+ var rad1 = rad + Math.PI / 2;
1357
+ var offsetX = Math.cos(rad1) * distance,
1358
+ offsetY = Math.sin(rad1) * distance;
1359
+ var tp1 = [p1[0] + offsetX, p1[1] + offsetY];
1360
+ var tp2 = [p2[0] + offsetX, p2[1] + offsetY];
1361
+ var rad2 = rad - Math.PI / 2;
1362
+ offsetX = Math.cos(rad2) * distance;
1363
+ offsetY = Math.sin(rad2) * distance;
1364
+ var tp3 = [p1[0] + offsetX, p1[1] + offsetY];
1365
+ var tp4 = [p2[0] + offsetX, p2[1] + offsetY];
1366
+ return [[tp1, tp2], [tp3, tp4]];
1367
+ }
1368
+ /**
1369
+ * 直线交点
1370
+ * @param {*} p1
1371
+ * @param {*} p2
1372
+ * @param {*} p3
1373
+ * @param {*} p4
1374
+ * @returns
1375
+ */
1376
+
1377
+
1378
+ function lineIntersection(p1, p2, p3, p4) {
1379
+ var dx1 = p2[0] - p1[0],
1380
+ dy1 = p2[1] - p1[1];
1381
+ var dx2 = p4[0] - p3[0],
1382
+ dy2 = p4[1] - p3[1];
1383
+
1384
+ if (dx1 === 0 && dx2 === 0) {
1385
+ return null;
1386
+ }
1387
+
1388
+ if (dy1 === 0 && dy2 === 0) {
1389
+ return null;
1390
+ }
1391
+
1392
+ var k1 = dy1 / dx1;
1393
+ var k2 = dy2 / dx2;
1394
+ var b1 = p1[1] - k1 * p1[0];
1395
+ var b2 = p3[1] - k2 * p3[0];
1396
+ var x, y;
1397
+
1398
+ if (dx1 === 0) {
1399
+ x = p1[0];
1400
+ y = k2 * x + b2;
1401
+ } else if (dx2 === 0) {
1402
+ x = p3[0];
1403
+ y = k1 * x + b1;
1404
+ } else if (dy1 === 0) {
1405
+ y = p1[1];
1406
+ x = (y - b2) / k2;
1407
+ } else if (dy2 === 0) {
1408
+ y = p3[1];
1409
+ x = (y - b1) / k1;
1410
+ } else {
1411
+ x = (b2 - b1) / (k1 - k2);
1412
+ y = k1 * x + b1;
1413
+ }
1414
+
1415
+ return [x, y];
1416
+ }
1347
1417
 
1348
1418
  function cylinder(point, options) {
1349
1419
  if (options === void 0) {