@eturnity/eturnity_maths 7.16.0-qa-dev03.0 → 7.16.0-qa-dev03.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 +60 -17
package/package.json
CHANGED
package/src/geometry.js
CHANGED
|
@@ -150,14 +150,14 @@ export function getDegreeVectors(u,v){
|
|
|
150
150
|
return getDegree(u,{x:0,y:0,z:0},v)
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
153
|
+
export function getDegree(H, I, J) {
|
|
154
|
+
let distanceFunction = get3DDistanceBetweenPoints
|
|
155
|
+
if(H.z==undefined || I.z==undefined || J.z==undefined || isNaN(H.z) || isNaN(I.z) || isNaN(J.z) ){
|
|
156
|
+
distanceFunction=getDistanceBetweenPoints
|
|
157
|
+
}
|
|
158
|
+
const a = distanceFunction(H, I)
|
|
159
|
+
const b = distanceFunction(I, J)
|
|
160
|
+
const c = distanceFunction(H, J)
|
|
161
161
|
|
|
162
162
|
|
|
163
163
|
let angle = (Math.acos((a * a + b * b - c * c) / (2 * a * b)) * 180) / Math.PI
|
|
@@ -967,24 +967,33 @@ export function getIndexesOfBiggestTriangleWithFixedIndexes(points,fixedIndexes,
|
|
|
967
967
|
if(points.length<3){
|
|
968
968
|
throw new Error('not enough points to make a triangle')
|
|
969
969
|
}
|
|
970
|
+
fixedIndexes=[...new Set(fixedIndexes)]
|
|
971
|
+
if(fixedIndexes.length>=3){
|
|
972
|
+
return getIndexesOfBiggestTriangleWithFixedIndexes(points,[],fixedIndexes)
|
|
973
|
+
}
|
|
974
|
+
|
|
970
975
|
let preferedAndFixedIndexes=[...fixedIndexes,...preferedIndexes]
|
|
971
976
|
preferedAndFixedIndexes=[...new Set(preferedAndFixedIndexes)]
|
|
972
|
-
console.log('preferedIndexes',preferedIndexes,'fixedIndexes',fixedIndexes)
|
|
973
977
|
let maxArea = -1
|
|
974
978
|
let maxNumberOfPreferedOrFixedIndexes = -1
|
|
975
979
|
let maxTriangle = [ 0, 1, 2]
|
|
976
|
-
|
|
977
|
-
if(fixedIndexes.length>=3){
|
|
978
|
-
return getIndexesOfBiggestTriangleWithFixedIndexes(points,[],fixedIndexes)
|
|
979
|
-
}
|
|
980
|
+
|
|
980
981
|
for (let i = 0; i < points.length - 2; i++) {
|
|
981
982
|
for (let j = i + 1; j < points.length - 1; j++) {
|
|
982
983
|
for (let k = j + 1; k < points.length; k++) {
|
|
983
984
|
if(arrayIntersection(fixedIndexes,[i,j,k]).length==fixedIndexes.length){
|
|
984
985
|
const numberOfPreferedOrFixedIndexes = arrayIntersection(preferedAndFixedIndexes,[i,j,k]).length
|
|
985
986
|
if(numberOfPreferedOrFixedIndexes >= maxNumberOfPreferedOrFixedIndexes){
|
|
986
|
-
|
|
987
|
-
|
|
987
|
+
if(numberOfPreferedOrFixedIndexes > maxNumberOfPreferedOrFixedIndexes){
|
|
988
|
+
maxArea = -1
|
|
989
|
+
}
|
|
990
|
+
let area = triangleArea(points[i], points[j], points[k])
|
|
991
|
+
const selectedIndexes = preferedAndFixedIndexes.filter(i=>points[i].selected)
|
|
992
|
+
//give advantages to connected area
|
|
993
|
+
if(areConsecutiveIndexes(i,j,k,points.length) && isMiddleIndexPartOf(i,j,k,selectedIndexes)){
|
|
994
|
+
area=area*1.2
|
|
995
|
+
}
|
|
996
|
+
if (area >= maxArea) {
|
|
988
997
|
maxArea = area
|
|
989
998
|
maxNumberOfPreferedOrFixedIndexes = numberOfPreferedOrFixedIndexes
|
|
990
999
|
maxTriangle = [i, j, k]
|
|
@@ -1014,7 +1023,16 @@ export function getIndexesOfBiggestTriangleWithTwoFixedIndexes(points,fixedIndex
|
|
|
1014
1023
|
if(arrayIntersection(fixedIndexes,[i,j,k]).length==2){
|
|
1015
1024
|
const numberOfPreferedOrFixedIndexes = arrayIntersection(preferedAndFixedIndexes,[i,j,k]).length
|
|
1016
1025
|
if(numberOfPreferedOrFixedIndexes >= maxNumberOfPreferedOrFixedIndexes){
|
|
1017
|
-
|
|
1026
|
+
if(numberOfPreferedOrFixedIndexes > maxNumberOfPreferedOrFixedIndexes){
|
|
1027
|
+
maxArea = -1
|
|
1028
|
+
}
|
|
1029
|
+
let area = triangleArea(points[i], points[j], points[k])
|
|
1030
|
+
|
|
1031
|
+
//give advantages to connected area
|
|
1032
|
+
const selectedIndexes = preferedAndFixedIndexes.filter(i=>points[i].selected)
|
|
1033
|
+
if(areConsecutiveIndexes(i,j,k,points.length) && isMiddleIndexPartOf(i,j,k,selectedIndexes)){
|
|
1034
|
+
area=area*1.2
|
|
1035
|
+
}
|
|
1018
1036
|
if (area > maxArea) {
|
|
1019
1037
|
maxArea = area
|
|
1020
1038
|
maxNumberOfPreferedOrFixedIndexes = numberOfPreferedOrFixedIndexes
|
|
@@ -1029,4 +1047,29 @@ export function getIndexesOfBiggestTriangleWithTwoFixedIndexes(points,fixedIndex
|
|
|
1029
1047
|
}
|
|
1030
1048
|
return maxTriangle
|
|
1031
1049
|
}
|
|
1032
|
-
|
|
1050
|
+
function isMiddleIndexPartOf(i,j,k,indexes){
|
|
1051
|
+
let midIndex=j
|
|
1052
|
+
if(i==0 && j!=1){
|
|
1053
|
+
midIndex = k
|
|
1054
|
+
}else if(i==0 && j==1 && k!=2){
|
|
1055
|
+
midIndex = i
|
|
1056
|
+
}
|
|
1057
|
+
return indexes.includes(midIndex)
|
|
1058
|
+
}
|
|
1059
|
+
function areConsecutiveIndexes(index1, index2, index3, totalVertices) {
|
|
1060
|
+
// Sort the indexes
|
|
1061
|
+
const sortedIndexes = [index1, index2, index3].sort()
|
|
1062
|
+
|
|
1063
|
+
// Check if the indexes form a continuous sequence
|
|
1064
|
+
if (sortedIndexes[2] - sortedIndexes[0] === 2) {
|
|
1065
|
+
return true // If consecutive
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
// Special case: If the sorted indexes wrap around from the last vertex to the first
|
|
1069
|
+
if ((sortedIndexes[0] === 0 && sortedIndexes[1] === totalVertices - 2 && sortedIndexes[2] === totalVertices - 1) ||
|
|
1070
|
+
(sortedIndexes[0] === 0 && sortedIndexes[1] === 1 && sortedIndexes[2] === totalVertices - 1)) {
|
|
1071
|
+
return true
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
return false // If not consecutive
|
|
1075
|
+
}
|