Fundamentação teórica para o cálculo da distância
Para encontrar os nós de EF que estão perto ou na linha, a distância do nó à linha deve ser calculada. É dado o ponto inicial e final da linha (N0 e N1) e o ponto P cuja distância à linha deve ser determinada. Uma maneira comum de calcular esta distância é estabelecer um plano que atravessa o ponto P e é perpendicular à linha reta. Para este efeito, primeiro tem de ser definida uma equação linear que se adeqúe. Neste caso, recomenda-se a utilização da forma de parâmetro, que contém um vetor de direção v. Pode utiliza-la para configurar a equação do plano.
Para o vetor de apoio A, é utilizado o ponto de partida (vetor de localização) da linha e para o vetor de direção v, é utilizada a diferença dos dois vetores de localização. A forma normal é utilizada como equação do plano pelo motivo já mencionado.
O vetor de apoio P é o ponto de resultado Pres a ser analisado. O vetor normal é o vetor de direção da linha reta porque o plano é ortogonal à linha reta. Antes de a distância ser calculada, é necessário determinar o fator s da linha onde o plano interseta a linha. Para este efeito, o vetor de localização X na equação do plano é substituído pela equação de linha reta.
Ajustado de acordo com s e com
Assim, é possível determinar o ponto de interseção S utilizando a Equação 1.
A distância d entre S e Pres é determinada através da quantidade vetorial da diferença entre os dois.
A Figura 01 mostra a representação esquemática de todos os elementos listados. A superfície azul é a superfície a ser analisada e a superfície vermelha representa o plano de corte, o qual foi configurado com o ponto Pres e o vetor de direção
Implementação do cálculo da distância num programa
Quando as fórmulas estiverem disponíveis, pode criar o programa correspondente. O EXCEL VBA é utilizado para a conversão. A Figura 02 mostra a numeração dos elementos.
Primeiro, é necessária uma ligação ao RFEM. Em seguida, obtém-se a interface para os dados do modelo. Uma vez que este procedimento já foi descrito em vários artigos (ver ligações), não será descrito em detalhe aqui. Abaixo está o código fonte para iniciar o programa.
Sub selection_test2 ()
Dim line_no As Integer
Dim surface_no As Integer
Dim loadcase_no As Integer
Dim d_tol As Double
line_no = 11
surface_no = 1
loadcase_no = 1
d_tol = 0,001
' get interface from the opened model and lock the licence/program
Dim iModel As RFEM5.IModel2
Set iModel = GetObject(, "RFEM5.Model")
iModel.GetApplication.LockLicense
On Error GoTo e
Dim iModelData As RFEM5.IModelData2
Set iModelData = iModel.GetModelData
Antes de iniciar o programa, define-se primeiro os parâmetros variáveis. Isso inclui o número da linha line_no da linha onde pretende procurar resultados e, claro, o número da superfície surface_no da superfície onde a linha está localizada. Além disso, é necessário o número do caso de carga loadcase_no ao qual os resultados pertencem. Uma vez que este é um cálculo numérico com precisão limitada, é necessária uma tolerância d_tol que especifique a distância máxima entre a linha e o nó. Neste exemplo, é utilizada uma tolerância de um milímetro.
Uma que a interface para os dados do modelo (IModelData) está agora disponível, pode procurar primeiro pela linha e, assim, também pelo seu ponto de inicial e final.
' get line
Dim ILin As RFEM5.ILine
Set ILin = iModelData.GetLine(line_no, AtNo)
Dim lin As RFEM5.RfLine
lin = ILin.GetData
' get nodes from line
Dim n(0 To 1) As RFEM5.Node
Dim ints() As Integer
ints = strToIntArr(lin.NodeList)
Dim iNd As RFEM5.INode
Set iNd = iModelData.GetNode(ints(0), AtNo)
n(0) = iNd.GetData
Set iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
n(1) = iNd.GetData
Set iNd = Nothing
O utilizador obtém os nós e a linha individualmente, diretamente através da interface (INode ou ILine). Para extrair os números dos nós da string (RfLine.NodeList), utilize a função strToIntArr descrita noutro artigo (ver ligações). Converte a string em um campo de tipo inteiro.
Dim v As RFEM5.Point3D
v.X = N(1).X - N(0).X
v.Y = N(1).Y - N(0).Y
v.Z = N(1).Z - N(0).Z
Dim A As RFEM5.Point3D
A.X = N(0).X
A.Y = N(0).Y
A.Z = N(0).Z
Dim v2 As Double
v2 = v.X ^ 2 + v.Y ^ 2 + v.Z ^ 2
Dim P_res As RFEM5.Point3D
Dim s As Double
Dim d As Double
O vetor de direção
Cálculo da distância num ciclo
Neste exemplo, foi selecionado o processamento dos resultados com base nos nós de EF. A verificação da distância realiza-se num ciclo sobre o campo desses resultados. Primeiro, tem de se obter estes resultados através da interface ICalculation2 e depois IResults. Dentro do ciclo, o ponto Pres é primeiro descrito com as coordenadas do valor resultante (por questões de clareza). Depois, pode ser realizado o cálculo direto da Equação (4). Após o cálculo de s, é possível verificar se o valor é inferior a zero ou superior a um porque esses valores se encontram fora ou antes e depois da linha reta. Se um valor estiver dentro deste intervalo, a distância é calculada com a Equação (6).
' get results in fe-nodes
Dim iCalc As ICalculation2
Set iCalc = iModel.GetCalculation
Dim iRes As RFEM5.IResults
Set iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
Dim surfBaStr() As RFEM5.SurfaceBasicStresses
surfBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
' loop through stresses and calculate distance to line
Dim i As Integer
For i = 0 To UBound(surfBaStr, 1)
P_res.X = surfBaStr(i).Coordinates.X
P_res.Y = surfBaStr(i).Coordinates.Y
P_res.Z = surfBaStr(i).Coordinates.Z
' calculate factor for line equation of intersection
s = ((P_res.X-A.X)*v.X + (P_res.Y-A.Y)*v.Y + (P_res.Z-A.Z)*v.Z) / v2
If s <= 1 + d_tol And s >= 0 - d_tol Then
' calculate distance of intersection point and fe-node
d = ((P_res.X-(A.X+s*v.X))^2
+(P_res.Y-(A.Y+s*v.Y))^2
+(P_res.Z-(A.Z+s*v.Z))^2)^0.5
If (d < d_tol) Then
' here you can process the found result point
End If
End If
Next i
A tolerância é aplicada tanto à verificação do fator s como à distância d, para que pequenas imprecisões não levem à exclusão de um resultado.
Resultados do programa
Os valores encontrados pelo programa são apresentados na tabela, com os valores arredondados para duas casas decimais.
σy + [N/mm²] | Fator s [-] |
---|---|
21,90 | 0,0 |
17,28 | 0,1 |
12,79 | 0,2 |
8,43 | 0,3 |
4,17 | 0,4 |
-0,04 | 0,5 |
-4,25 | 0,6 |
-8,51 | 0,7 |
-12,87 | 0,8 |
-17,36 | 0,9 |
-21,98 | 1,0 |
A título de comparação, os valores do diagrama de resultados na linha correspondente são apresentados na Figura 03.
É claramente evidente que os valores são os mesmos e existe uma correspondência de 100% ou que todos os valores foram encontrados na linha.
Resumo
Com o auxílio do cálculo de vetores, foi criado um programa capaz de encontrar nós ao longo de uma linha. Com este algoritmo, também é possível pesquisar não apenas os resultados, mas também todos os outros elementos geométricos. Isto é especialmente útil porque, obviamente, a seleção visual não é possível através da interface COM, mas é possível através de uma função de outra forma. Especialmente para os programas executados completamente em segundo plano, é possível realizar uma avaliação automática dos resultados.