PROGRAMA DE DISEÑO MATLAB 7.0

Anuncio
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
Descargar