@eturnity/eturnity_maths 7.4.0-splitLine.1 → 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 +1 -1
- package/src/geometry.js +28 -12
package/package.json
CHANGED
package/src/geometry.js
CHANGED
|
@@ -952,29 +952,38 @@ 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
958
|
export function arrayIntersection(array1,array2){
|
|
959
959
|
return array1.filter(value => array2.includes(value));
|
|
960
960
|
}
|
|
961
|
-
export function
|
|
961
|
+
export function getIndexesOfBiggestTriangleWithFixedIndexes(points,fixedIndexes,preferedIndexes=[]){
|
|
962
962
|
if(points.length<3){
|
|
963
963
|
throw new Error("not enough points to make a triangle")
|
|
964
964
|
return
|
|
965
965
|
}
|
|
966
|
+
let preferedAndFixedIndexes=[...fixedIndexes,...preferedIndexes]
|
|
967
|
+
preferedAndFixedIndexes=[...new Set(preferedAndFixedIndexes)]
|
|
966
968
|
let maxArea = -1
|
|
969
|
+
let maxNumberOfPreferedOrFixedIndexes = -1
|
|
967
970
|
let maxTriangle = [ 0, 1, 2]
|
|
968
971
|
fixedIndexes=[...new Set(fixedIndexes)].slice(0,3)
|
|
969
972
|
if(fixedIndexes.length==3){return fixedIndexes}
|
|
973
|
+
//if(preferedAndFixedIndexes.length==3){return preferedAndFixedIndexes}
|
|
970
974
|
for (let i = 0; i < points.length - 2; i++) {
|
|
971
975
|
for (let j = i + 1; j < points.length - 1; j++) {
|
|
972
976
|
for (let k = j + 1; k < points.length; k++) {
|
|
973
977
|
if(arrayIntersection(fixedIndexes,[i,j,k]).length==fixedIndexes.length){
|
|
974
|
-
const
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
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
|
+
}
|
|
978
987
|
}
|
|
979
988
|
}
|
|
980
989
|
}
|
|
@@ -984,22 +993,29 @@ export function get3DDistanceBetweenPoints(firstPoint, secondPoint) {
|
|
|
984
993
|
}
|
|
985
994
|
return maxTriangle
|
|
986
995
|
}
|
|
987
|
-
export function
|
|
996
|
+
export function getIndexesOfBiggestTriangleWithTwoFixedIndexes(points,fixedIndexes,preferedIndexes=[]){
|
|
988
997
|
fixedIndexes=[...new Set(fixedIndexes)]
|
|
998
|
+
let preferedAndFixedIndexes=[...fixedIndexes,...preferedIndexes]
|
|
999
|
+
preferedAndFixedIndexes=[...new Set(preferedAndFixedIndexes)]
|
|
989
1000
|
if(points.length<3 || fixedIndexes.length<3){
|
|
990
1001
|
throw new Error("not enough points to make a triangle")
|
|
991
1002
|
return
|
|
992
1003
|
}
|
|
993
1004
|
let maxArea = -1
|
|
1005
|
+
let maxNumberOfPreferedOrFixedIndexes = -1
|
|
994
1006
|
let maxTriangle = [ 0, 1, 2]
|
|
995
1007
|
for (let i = 0; i < points.length - 2; i++) {
|
|
996
1008
|
for (let j = i + 1; j < points.length - 1; j++) {
|
|
997
1009
|
for (let k = j + 1; k < points.length; k++) {
|
|
998
1010
|
if(arrayIntersection(fixedIndexes,[i,j,k]).length==2){
|
|
999
|
-
|
|
1000
|
-
if
|
|
1001
|
-
|
|
1002
|
-
|
|
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
|
+
}
|
|
1003
1019
|
}
|
|
1004
1020
|
}
|
|
1005
1021
|
}
|