Función recursiva para fusionar objetos 3D -- algorithm campo con vb.net camp codereview Relacionados El problema

Recursive function to merge 3D objects


1
vote

problema

Español

Tengo varios elementos 3D en Listori. Para este ejemplo:

Listori tiene A, B, C, D, E.

  A overlaps with C. B overlaps with D. D overlaps with E.   

Tengo una función recursiva que acepta Listori, verifique si cada elemento se superpone con el otro, y genera una lista final, que tiene AC , 9988776655544333 .

iteración 1: Coloque a través de cada elemento en Listori, genera ListNew que contiene AC , B5 , 9988776655544336 , 99887776655443377

iteración 2: Bucle a través de AC , B , A overlaps with C. B overlaps with D. D overlaps with E. 0 , A overlaps with C. B overlaps with D. D overlaps with E. 1 en ListNew, genera (nuevo) lista que contiene, A overlaps with C. B overlaps with D. D overlaps with E. 2 , A overlaps with C. B overlaps with D. D overlaps with E. 3 , A overlaps with C. B overlaps with D. D overlaps with E. 4

iteración 3: y así sucesivamente.

Este es el código de fragmento que comprueba si cada objeto 3D en una lista se superpone, y produce una nueva lista recursivamente.

  A overlaps with C. B overlaps with D. D overlaps with E. 5  

La función funciona bien con Listori con muy pocos artículos. Sin embargo, cuando hay miles de elementos 3D en Listori, las funciones llevan mucho tiempo para producir la lista.

  1. ¿Cómo aumento la velocidad de la función recursiva?
  2. ¿Hay otra forma de escribir un algoritmo que realiza la misma tarea anterior?

Hágame saber si necesita alguna información.

gracias.

Original en ingles

I have several 3D items in listOri. For this example:

listOri has A,B,C,D,E.

A overlaps with C. B overlaps with D. D overlaps with E. 

I have a recursive function which accepts listOri, check if each item overlaps with each other, and generates a final listNew which has AC, BDE.

Iteration 1: Loop through each item in listOri, generates listNew containing AC,B,D,E

Iteration 2: Loop through AC,B,D,E in listNew, generates (new) listNew containing, AC,BD,E

Iteration 3: and so on.

Here is the snippet code which check if each 3D object in a list overlaps, and produces a new list recursively.

 Private Function SimplifyModel2(ByVal listOri As List(Of Mesh3D)) As List(Of Mesh3D)       Dim listNew As New List(Of Mesh3D)(listOri)     Dim indexOut, indexIn, indexInner, PercentProgressCurrent As Integer     Dim currentMeshOutter, currentMeshInner As Mesh3D     Dim isExitForCalled As Boolean = False      totInnerLoops = totInnerLoops + 1   ' increment total number of inner loops      For indexOut = 0 To (listOri.Count - 1)         currentMeshOutter = listOri(indexOut)          indexInner = indexOut + 1         For indexIn = indexInner To (listOri.Count - indexInner)             currentMeshInner = listOri(indexIn)              If Is3DOverlap(currentMeshInner, currentMeshOutter) = True Then                 currentMeshOutter.CombineMerge(currentMeshInner)                 listNew.Remove(currentMeshInner)                 listNew.Remove(currentMeshOutter)                 listNew.Insert(0, currentMeshOutter)                  listNew = SimplifyModel2(listNew) ' recursively call the function                 isExitForCalled = True                 Exit For             End If         Next          If isExitForCalled = True Then             Exit For         End If     Next      indLoopExit = indLoopExit + 1      Return listNew End Function 

The function works well with listOri with very few items. However, when there are thousands of 3D items in listOri, the functions takes very long time to produce the listNew.

  1. How do I increase the speed of the recursive function?
  2. Is there another way to write an algorithm which performs the same task above?

Let me know if you need any information.

Thank you.

     

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

No creo que necesites recursión. Los artículos en su primer bucle siempre "comen" al otro por delante. Coloque todos los elementos, para cada artículo, si puede fusionarse en un elemento delante, en caso afirmativo, fusionar y eliminar el elemento que estaba por delante.

ahora VB almacena la parte "a" de A para el bucle en la memoria, por lo que deberá convertir su en lugar de hacerlo en lugar.

Si desea que su lista principal sea intacta, podría clonarla. Pero no olvide que parece que cada instancia se verá afectada en la lista de dos si lo hace.

  =4  
 

I don't think you need recursion. The items in your first loop always "eat" the other ahead of them. Loop all items, for each item check if it can merge into an item ahead of it, if yes, merge and remove the item that was ahead.

Now VB does store the "To" part of a for loop in memory, so you'll need to convert your For into Do loop instead.

If you want your main list to be untouched, you could clone it. But don't forget that it seems each instance will be affected in the two list if you do that.

Private Sub SimplifyModel2(ByVal listOri As List(Of Mesh3D))     Dim indexOut, indexIn As Integer     Dim currentMeshOutter, currentMeshInner As Mesh3D      indexOut = 0      Do While indexOut < istOri.Count         currentMeshOutter = listOri(indexOut)         indexIn = indexOut + 1          Do While indexIn < istOri.Count             currentMeshInner = listOri(indexIn)              If Is3DOverlap(currentMeshInner, currentMeshOutter) Then                 currentMeshOutter.CombineMerge(currentMeshInner)                 istOri.Remove(currentMeshInner)             Else                 indexIn += 1             End If         Loop          indexOut += 1     Loop  End Sub 
 
 

Relacionados problema

3  ¿Cómo reformatear este código para que no utilice 'SALIR PRUY' y 'SALIR POR'?  ( How to reformat this code so i dont use exit try and exit for ) 
Utilizo Sonarqube para ayudarme a intentar convertirme en un mejor programador para programar junto con los estándares de "mejores prácticas". Hay reglas co...

1  Asignó un recurso del sistema a una imagen basada en variable  ( Assigned a system resource to an image based on variable ) 
Tengo una aplicación de mapeo y el marcador que estoy usando se basa en el representante de campo asignado a esa visita. Mi código es solo un caso selecto bas...

4  Simplify ASP.NET StreamEtriter para APPENDTEXT a archivos  ( Simplify asp net streamwriter for appendtext to file ) 
¿Hay alguna manera de simplificar este código, por lo que no hay tantos 99887766555443388 var o = {}; o.window = o; $.isWindow(o); //returns `true`, even th...

5  WebMethod más lento en la ejecución que la aplicación de Windows del mismo código  ( Webmethod slower on execution than windows application of the same code ) 
He desarrollado una aplicación que interactúa con IBM ClearQuest. El problema es que cuando ejecuto todo localmente, como, ejecute el local de WebService y lu...

3  Manejar múltiples menú Haga clic en eventos en un submarino  ( Handle multiple menu click events in one sub ) 
Tengo múltiples menús que cambiarán los idiomas en un Sub que manejarán múltiples eventos de los menús, se está trabajando para mí en este momento, me pregunt...

3  ¿Es esta la forma correcta de exponer una configuración para una biblioteca de clase VB.NET?  ( Is this the correct way to expose a setting for a vb net class library ) 
Estoy definido en la pestaña Configuración de una biblioteca de clase VB.NET, algunas configuraciones de alojamiento de usuario. Quiero exponer estas configur...

2  Implementar el tipo de interfaz en la implementación de otra interfaz sin demasiado casting  ( Implement interface type in implementation of another interface without too much ) 
Tengo un grupo de pruebas que deben ejecutarse de manera similar (pero diferente) y tienen configuraciones, resultados, etc. que también son similares pero di...

2  Resolución de la pantalla  ( Screen resolution ) 
Estoy trabajando con una aplicación que tendrá sub formularios. La forma primaria se abre por encima de la bandeja del sistema, y ​​en el ratón, las ventanas ...

5  Model-View-Presenter  ( Model view presenter ) 
Trabajo en una aplicación .NET que sigue de forma muy apósito para un tipo de arquitectura de N-Tier (los objetos de negocios (no lógica) y el acceso a los da...

0  VB.NET - Manejo de errores en clase genérica para PDF Fusion  ( Vb net error handling in generic class for pdf merge ) 
Como parte de un proyecto en el que estoy trabajando, ha surgido un nuevo requisito para poder generar múltiples archivos PDF y luego fusionarlos antes de que...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos