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.
- package/dist/poly-extrude.js +132 -62
- package/dist/poly-extrude.js.map +1 -1
- package/dist/poly-extrude.min.js +2 -2
- package/dist/poly-extrude.mjs +132 -62
- package/package.json +3 -2
- package/src/polyline.js +100 -20
package/dist/poly-extrude.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* poly-extrude v0.
|
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
|
-
|
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
|
1245
|
-
var
|
1246
|
-
|
1247
|
-
var
|
1248
|
-
|
1249
|
-
|
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
|
-
|
1256
|
-
|
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] -
|
1260
|
-
TEMPV1.y = p0[1] -
|
1261
|
-
TEMPV2.x =
|
1262
|
-
TEMPV2.y =
|
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
|
-
|
1271
|
+
rAngle = angle - vAngle / 2;
|
1265
1272
|
}
|
1266
1273
|
|
1267
|
-
var
|
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
|
1270
|
-
|
1271
|
-
|
1280
|
+
var _translateLine = translateLine(p1, p2, radius),
|
1281
|
+
line1 = _translateLine[0],
|
1282
|
+
line2 = _translateLine[1];
|
1272
1283
|
|
1273
|
-
|
1284
|
+
var op1 = lineIntersection(line1[0], line1[1], p3, p4);
|
1285
|
+
var op2 = lineIntersection(line2[0], line2[1], p3, p4); // 平行,回头路
|
1274
1286
|
|
1275
|
-
if (
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
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
|
-
|
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
|
-
|
1287
|
-
|
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
|
-
|
1293
|
-
op1 = _calOffsetPoint2[0],
|
1294
|
-
op2 = _calOffsetPoint2[1];
|
1303
|
+
points.push(op1, op2);
|
1295
1304
|
|
1296
|
-
|
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
|
-
|
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) {
|