PROGRAMA DE DISEÑO MATLAB 7.0 1 2 HOJA EXCEL DE LECTURA Y PROCESAMIENTO DE DATOS DE FICHEROS MATLAB Aspecto de la hoja Excel que lee y procesa los datos de los ficheros generados con MATLAB. Se observa que el error en la longitud de arco calculado con la integral elíptica y sumando la distancia entre puntos es menor de 0.0025 mm. A continuación se expone el listado de la macro de Excel junto con una representación gráfica respecto de donde van colocados los 35 dientes del ejemplo: Sub eliptico() Dim f, g, c, i, j, nZ As Integer Dim Dx, Dy, Er, L, Lr, Ls, L1, x1, x2, x, y As Double Columns("A:D").Select Selection.ClearContents Range("D3").Select Open "F:\elipseDAT.txt" For Input As 1 f=1 While Not EOF(1) Input #1, x: f=f+1 Cells(f, 6) = x: Wend Close f=0 Open "F:\elipseX.txt" For Input As 1 3 Open "F:\elipseY.txt" For Input As 2 While Not EOF(1) Input #1, x: Input #2, y f=f+1 Cells(f, 1) = x: Cells(f, 2) = y Wend Close 'Quita puntos repetidos g=0 For c = 1 To f + 1 g=g+1 Cells(g, 3) = Cells(c, 1): Cells(g, 4) = Cells(c, 2) For i = c + 1 To f + 1 If Cells(c, 1) = Cells(i, 1) Then c=c+1 End If Next i Next c 'Reproduce toda la elipse 'Primer cuadrante f=g For c = g - 1 To 1 Step -1 f=f+1 Cells(f, 3) = -Cells(c, 3): Cells(f, 4) = Cells(c, 4) Next c 'cuarto y tercero g=f For c = f - 1 To 2 Step -1 g=g+1 Cells(g, 3) = Cells(c, 3): Cells(g, 4) = -Cells(c, 4) Next c longitud: 'Logitud 'El último coincide con el primero g = g + 1: L = 0 Cells(g, 3) = Cells(1, 3): Cells(g, 4) = Cells(1, 4) For c = 1 To g - 1 x1 = Cells(c, 3): y1 = Cells(c, 4): x2 = Cells(c + 1, 3): y2 = Cells(c + 1, 4) 'MsgBox (Str(c) + "/" + Str(g) + " " + Str(x1) + " " + Str(x2) + " " + Str(y1) + " " + Str(y2)) 'If Cells(c, 3) = 0 Then Exit For 'Solamente la cuarta parte (puntos exportados) L = L + Sqr((x2 - x1) ^ 2 + (y2 - y1) ^ 2) Next c Cells(1, 6) = L curvatura: 4 'Puntos para el cálculo del radio de curvatura equivalente Columns("G:J").Select Selection.ClearContents Range("D3").Select nZ = Cells(3, 6): Lr = 2 * Cells(11, 6) 'Longitud de arco primitivo (paso circunferencial) f = 0: f = f + 1: Cells(f, 7) = Cells(f, 3): Cells(f, 8) = Cells(f, 4) c=0 For i = 1 To nZ - 1 'Recorre un diente menos 'Pues se hace el espacio anteúltimo y el último es lo que queda L=0 Do c=c+1 If Str(Cells(c, 3)) = "" Then Exit Do x1 = Cells(c, 3): y1 = Cells(c, 4): x2 = Cells(c + 1, 3): y2 = Cells(c + 1, 4) Dx = x2 - x1: Dy = y2 - y1: Ls = Sqr(Dx ^ 2 + Dy ^ 2): L = L + Ls If L >= Lr Then If L > Lr Then 'Calcula un nuevo x2 sobre el segmento (x1,y1)-(x2-y2) Er = L - Lr 'Er es siempre menor que Ls Er<Ls x = x2 - Er * Dx / Ls: y2 = y1 - Er * Dy / Ls 'Este punto tiene que formar parte de la tabla pues es el 'primero para el siguiente tramo ff$ = "C" + LTrim(RTrim(Str(c + 1))) + ":D" + LTrim(RTrim(Str(c + 1))) Range(ff$).Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Cells(c + 1, 3) = x2: Cells(c + 1, 4) = y2 'La c no aumenta, el nuevo elemento ocupa su lugar Else 'No hace falta hacer nada, se queda la x2 y2 End If f = f + 1: Cells(f, 7) = x2: Cells(f, 8) = y2 Exit Do End If Loop Next i radio: 'Radios de curvatura y posición del centro de la circunferencia primitiva del diente. a = Cells(8, 6): b = Cells(9, 6): f = 35 For c = 1 To f 'f es igual al número de dientes (lógico) x = Cells(c, 7): y = Cells(c, 8) Cells(c, 9) = ((a ^ 4 * y ^ 4 + b ^ 4 * x ^ 4) ^ (3 / 2)) / a ^ 4 / b ^ 4 Next c End Sub 5 6