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.
Convertido para s e começando 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, que é definido pelo 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.
- código.vb#
Sub selection_test2 ()
- Dim linear_no As inteiro
- Dim superfícies_no como inteiro
- Dim loadcase_no As inteiro
- Dim d_tol As duplo
- line_no = 11
- superfícies_nº = 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.
- código.vb#
- ' obter linha
- Dim ILin como RFEM5.ILine
- Definir ILin = iModelData.GetLine (line_no, AtNo)
- Dim lin As RFEM5.RfLine
- lin = ILin.GetData
- ' obter nós da linha
- Dim n(0 a 1) como RFEM5.Node
- Dim ints() As inteiro
- ints = strToIntArr(lin.NodeList)
- Dim iNd as RFEM5.INode
- Definir iNd = iModelData.GetNode(ints(0), AtNo)
- n(0) = iNd.GetData
- Definir iNd = iModelData.GetNode(ints(UBound(ints, 1)), AtNo)
- n(1) = iNd.GetData
- Definir iNd = nada
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.
Com os pontos da linha agora dados
- código.vb#
- Dim v As RFEM5.Ponto3D
- vX = N(1).X - N(0).X
- vY = N(1).Y - N(0).Y
- vZ = N(1).Z - N(0).Z
- Dim A como RFEM5.Ponto3D
- AX = N(0).X
- AY = N(0).Y
- AZ = N(0).Z
- Dim v2 As duplo
- v2 = vX ^ 2 + vY ^ 2 + vZ ^ 2
- Dim P_res como RFEM5.Point3D
- Dim s As duplo
- Dim d As duplo
Torna-se 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).
- código.vb#
- ' obter resultados nos nós fe
- Dim iCalc como ICalculation2
- Set iCalc = iModel.GetCalculation
- Dim iRes como RFEM5.IResults
- Definir iRes = iCalc.GetResultsInFeNodes(LoadCaseType, loadcase_no)
- Dim superfíciesBaStr() As RFEM5.SurfaceBasicStresses
- superfíciesBaStr = iRes.GetSurfaceBasicStresses(surface_no, AtNo)
- ' percorrer as tensões e calcular a distância à linha
- Dim i As Integer
- Para i = 0 Até UBound(surfBaStr, 1)
- P_res.X = superfícieBaStr(i).Coordenadas.X
- P_res.Y = superfícieBaStr(i).Coordenadas.Y
- P_res.Z = superfícieBaStr(i).Coordenadas.Z
- ' calcular fator para equação de linha da interseção
- s = ((P_res.XA.X)*vX + (P_res.YA.Y)*vY + (P_res.ZA.Z)*vZ)/v2
- Se s <= 1 + d_tol E s >= 0 - d_tol Então
- ' calcular distância do ponto de interseção e do nó fe
- d = ((P_res.X-(A.X+s*vX))^2
- +(P_res.Y-(A.Y+s*vY))^2
- +(P_res.Z-(A.Z+s*vZ))^2)^0.5
- Se (d < d_tol) Então
- ' aqui pode processar o ponto de resultado encontrado
- End If
- End If
- I seguinte
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.
Conclusão
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.