Autoturn mequetrefe

Já ouviu falar do Autoturn?
Muito bom com certeza!!! Se não ouviu falar e faz projeto de acessos rodiviários deveria, hehehe.
Claro que ele tem uma versão demo etc e tal, mas as vezes só precisamos de uma análise rápida, com um veículo de projeto específico e não temos o Autoturn "full", nem mesmo o genérico dele... o que fazemos? Será que a curva que estamos calculando atenderá a superlargura requerida por um ônibus por exemplo?

É o que o programa abaixo faz, dado um eixo que representa a trajetória do eixo da frente de um veículo, calcula a trajetoria do eixo de traz.
Veja a figura:

Imagine uma rótula qualquer, será que a largura das vias é suficiente para um ônibus?
Usando o programa abaixo, ou o Autoturn, podemos desenhar a trajetória dos eixos deste veículo, a saber:
Distância entre eixos: 6.1m
Distância entre rodas: 2.6m

Alimentamos estes valores, e obtemos:

No desenho, a linha amarela é a trajetória do eixo da frente, que o motorista hipoteticamente irá seguir, verde é o caminho executado pelas rodas da frente e magenta o caminho percorrido pelas rodas de traz.
Assim, podemos ver que ele passa, apertado, mas passa!!

Claro que aí ainda temos de levar em conta raios internos mínimos das curvas, velocidade que o veículo fará a curva, etc... Ma pra começo de conversa, já é um indicativo!!
ver o programa...

(Setq trajetoria:disteixo 6.1
      trajetoria:delta 1
      trajetoria:layerfrente "trajeto-frente"
      trajetoria:layertraz "trajeto-traz"
      trajetoria:offset 2.6)

(defun c:trajetoria (/ ss ent pxf pxt angv1 tmp d total
             lst mlt mlf  pxf2 dirtrv alpha dsttrv
             angtrn angv2 rfront angtilt rback pback2
)
  

;salva variáveis de sistema, inicia  controle de erros
  (tbn:error-init (list (list "osmode" (getvar "osmode")) nil))
  

;pergunta pelos parâmetros... TODO: substituir por um dcl, muito chato assim
  (prompt "Selecione as trajetorias do eixo dianteiro:")
  (
setq  ss      (ssget  '((0 . "ARC,*[~M]LINE,LINE")))
         tmp      (getdist (strcat "\nQual a distancia entre eixos <" (rtos trajetoria:disteixo)">"))
         trajetoria:disteixo (if tmp tmp trajetoria:disteixo)
         tmp       (getdist (strcat "\nqual a distancia entre interpolações <" (rtos trajetoria:delta) ">"))
         trajetoria:delta  (if tmp tmp trajetoria:delta)
         tmp      (getstring (strcat "\nQual o layer desenhar a trajetoria frontal? <" trajetoria:layerfrente ">"))
         trajetoria:layerfrente (if (/= "" tmp) tmp trajetoria:layerfrente)
         tmp      (getstring (strcat "\nQual o layer desenhar a trajetoria trazeira? <" trajetoria:layertraz ">"))
         trajetoria:layertraz (if (/= "" tmp) tmp trajetoria:layertraz)
         tmp      (getdist (strcat "\nQual a ditancia entre rodas? <" (rtos trajetoria:offset)">"))
         trajetoria:offset (if tmp tmp trajetoria:offset))

;desliga o osnap
  (setvar "osmode" 0)
  (
repeat (if ss (sslength ss) 0)
    (
setq ent      (ssname ss 0)
          pxf      (vlax-curve-getstartpoint ent)
          angv1    (+ pi (get-tan-of-pt ent pxf)) ;tangente à curva no ponto PXF
          d        trajetoria:delta
          total
    (get-length-of ent) ;comprimento da trajetória
          lst      nil)
    (
ssdel ent ss)

;prezumindo que o estilo seja o standard nao alterado:
    (command "._mline" "j" "z" "s" trajetoria:offset
         (vlax-curve-getstartpoint ent))
    

;desenha a mlina do eixo dianteiro
    (while (< d total)
      (
setq pxt (vlax-curve-getpointatdist ent d)
        lst (cons pxt lst)
            d   (+ d trajetoria:delta))
      (
command pxt))

    (
setq pxt (vlax-curve-getendpoint ent)
      lst (cons pxt  lst))
    (
command pxt "")
    

;corrige o layer da primeira mline
    (remake-ent (entlast) 8 trajetoria:layerfrente)

;desenha a mline do eixo de traz
    (command "._mline" "j" "z" "s" trajetoria:offset
         (polar pxf angv1 trajetoria:disteixo))

;para cada ponto da mline dianteira, calcula o ponto do eixo trazeiro
    (foreach pxf2 (reverse lst)
      (
setq
;; angulo da traj do eixo da frente
    dirtrv   (angle pxf pxf2)
;; angulo das rodas frontais em relação ao veiculo
    alpha    (- angv1 dirtrv)
;; distance front wheels traveled this step
    dsttrv   (distance pxf pxf2)
;; angle vehicle turned this step
        angtrn   (* 2 (atan (/ (sin alpha)
                   (
- (/ (* 2 trajetoria:disteixo) dsttrv)
                  (
cos alpha)))))
        angv2    (+ angv1 angtrn)
;; average front wheel radius this step
        rfront   (/ dsttrv (* 2.0 (sin (/ angtrn 2.0))))
;; average wheel tilt or articulation angle this step
        angtilt  (asin (/ trajetoria:disteixo rfront))
;; average back wheel radius this step
    rback    (/ trajetoria:disteixo (tan angtilt))
    pback2   (polar pxf2 angv2 trajetoria:disteixo)
    pxf      pxf2
    pxt      pback2
    angv1    angv2
)
      (
command pxt))
    (
command "")
;corrige o layer da segunda mline
    (remake-ent (entlast) 8 trajetoria:layertraz))
  (
tbn:error-restore))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, get-tan-of-pt, get-length-of, remake-ent, tan, tbn:error-restore, asin

LinkWithin

Related Posts Plugin for WordPress, Blogger...