@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/geometry.js +60 -17
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eturnity/eturnity_maths",
3
- "version": "7.16.0-qa-dev03.0",
3
+ "version": "7.16.0-qa-dev03.2",
4
4
  "author": "Eturnity Team",
5
5
  "main": "src/index.js",
6
6
  "private": false,
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
- 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)
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
- fixedIndexes=[...new Set(fixedIndexes)]
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
- const area = triangleArea(points[i], points[j], points[k])
987
- if (area > maxArea) {
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
- const area = triangleArea(points[i], points[j], points[k])
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
+ }