@eturnity/eturnity_maths 7.4.0-splitLine.0 → 7.4.0-splitLine.2
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/package.json
CHANGED
package/src/geometry.js
CHANGED
|
@@ -952,32 +952,76 @@ export function get3DDistanceBetweenPoints(firstPoint, secondPoint) {
|
|
|
952
952
|
let area = vectorLength(product)/2
|
|
953
953
|
return area
|
|
954
954
|
}
|
|
955
|
-
export function
|
|
956
|
-
return
|
|
955
|
+
export function getIndexesOfBiggestTriangle(points){
|
|
956
|
+
return getIndexesOfBiggestTriangleWithFixedIndexes(points,[])
|
|
957
957
|
}
|
|
958
|
-
export function
|
|
958
|
+
export function arrayIntersection(array1,array2){
|
|
959
|
+
return array1.filter(value => array2.includes(value));
|
|
960
|
+
}
|
|
961
|
+
export function getIndexesOfBiggestTriangleWithFixedIndexes(points,fixedIndexes,preferedIndexes=[]){
|
|
959
962
|
if(points.length<3){
|
|
960
963
|
throw new Error("not enough points to make a triangle")
|
|
961
964
|
return
|
|
962
965
|
}
|
|
966
|
+
let preferedAndFixedIndexes=[...fixedIndexes,...preferedIndexes]
|
|
967
|
+
preferedAndFixedIndexes=[...new Set(preferedAndFixedIndexes)]
|
|
963
968
|
let maxArea = -1
|
|
969
|
+
let maxNumberOfPreferedOrFixedIndexes = -1
|
|
964
970
|
let maxTriangle = [ 0, 1, 2]
|
|
965
|
-
fixedIndexes=[...new Set(
|
|
971
|
+
fixedIndexes=[...new Set(fixedIndexes)].slice(0,3)
|
|
966
972
|
if(fixedIndexes.length==3){return fixedIndexes}
|
|
973
|
+
//if(preferedAndFixedIndexes.length==3){return preferedAndFixedIndexes}
|
|
967
974
|
for (let i = 0; i < points.length - 2; i++) {
|
|
968
|
-
if(fixedIndexes.length==0 || fixedIndexes.includes(i)){
|
|
969
975
|
for (let j = i + 1; j < points.length - 1; j++) {
|
|
970
|
-
if(fixedIndexes.length<2 || fixedIndexes.includes(j)){
|
|
971
976
|
for (let k = j + 1; k < points.length; k++) {
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
977
|
+
if(arrayIntersection(fixedIndexes,[i,j,k]).length==fixedIndexes.length){
|
|
978
|
+
const numberOfPreferedOrFixedIndexes = arrayIntersection(preferedAndFixedIndexes,[i,j,k]).length
|
|
979
|
+
|
|
980
|
+
if(numberOfPreferedOrFixedIndexes >= maxNumberOfPreferedOrFixedIndexes){
|
|
981
|
+
const area = triangleArea(points[i], points[j], points[k]);
|
|
982
|
+
if (area > maxArea || (numberOfPreferedOrFixedIndexes > maxNumberOfPreferedOrFixedIndexes && (maxArea+1)/(area+1)<4 )) {
|
|
983
|
+
maxArea = area
|
|
984
|
+
maxNumberOfPreferedOrFixedIndexes = numberOfPreferedOrFixedIndexes
|
|
985
|
+
maxTriangle = [i, j, k]
|
|
986
|
+
}
|
|
987
|
+
}
|
|
976
988
|
}
|
|
977
989
|
}
|
|
978
|
-
|
|
990
|
+
|
|
979
991
|
}
|
|
980
|
-
|
|
992
|
+
|
|
993
|
+
}
|
|
994
|
+
return maxTriangle
|
|
995
|
+
}
|
|
996
|
+
export function getIndexesOfBiggestTriangleWithTwoFixedIndexes(points,fixedIndexes,preferedIndexes=[]){
|
|
997
|
+
fixedIndexes=[...new Set(fixedIndexes)]
|
|
998
|
+
let preferedAndFixedIndexes=[...fixedIndexes,...preferedIndexes]
|
|
999
|
+
preferedAndFixedIndexes=[...new Set(preferedAndFixedIndexes)]
|
|
1000
|
+
if(points.length<3 || fixedIndexes.length<3){
|
|
1001
|
+
throw new Error("not enough points to make a triangle")
|
|
1002
|
+
return
|
|
1003
|
+
}
|
|
1004
|
+
let maxArea = -1
|
|
1005
|
+
let maxNumberOfPreferedOrFixedIndexes = -1
|
|
1006
|
+
let maxTriangle = [ 0, 1, 2]
|
|
1007
|
+
for (let i = 0; i < points.length - 2; i++) {
|
|
1008
|
+
for (let j = i + 1; j < points.length - 1; j++) {
|
|
1009
|
+
for (let k = j + 1; k < points.length; k++) {
|
|
1010
|
+
if(arrayIntersection(fixedIndexes,[i,j,k]).length==2){
|
|
1011
|
+
const numberOfPreferedOrFixedIndexes = arrayIntersection(preferedAndFixedIndexes,[i,j,k]).length
|
|
1012
|
+
if(numberOfPreferedOrFixedIndexes >= maxNumberOfPreferedOrFixedIndexes){
|
|
1013
|
+
const area = triangleArea(points[i], points[j], points[k]);
|
|
1014
|
+
if (area > maxArea || (numberOfPreferedOrFixedIndexes > maxNumberOfPreferedOrFixedIndexes && (maxArea+1)/(area+1)<4 )) {
|
|
1015
|
+
maxArea = area
|
|
1016
|
+
maxNumberOfPreferedOrFixedIndexes = numberOfPreferedOrFixedIndexes
|
|
1017
|
+
maxTriangle = [i, j, k];
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
}
|
|
1024
|
+
|
|
981
1025
|
}
|
|
982
1026
|
return maxTriangle
|
|
983
1027
|
}
|
|
@@ -87,7 +87,7 @@ export function updateComputedGeometryPolygon(polygon) {
|
|
|
87
87
|
if(polygon.layer=="moduleField"){
|
|
88
88
|
let trimedOutline=[]
|
|
89
89
|
if(polygon.panels.length>0){
|
|
90
|
-
|
|
90
|
+
trimedOutline = getConcaveOutline(polygon.panels,polygon.panels[0].outline)
|
|
91
91
|
trimedOutline = trimedOutline.map(p=>{return{
|
|
92
92
|
x:p.x,
|
|
93
93
|
y:p.y,
|