Coordenadas – Rayo reflejado en perfil por tramos

Referencia: Optica – Rayo reflejado en plano inclinado

Para el análisis de rayo reflejado en un perfil de terreno, se realiza calculando el punto reflejado para cada tramo del perfil usando como base el algoritmo de rayo reflejado en plano inclinado.

Instrucciones en Python

# rayo incidente y reflejado
# en perfil por tramos
# blog.espol.edu.ec/girni
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
# posición de antenas tx, rx
xi = [1,11]
yi = [4,2]

# perfil suelo
sx = [1,4,8,11]
sy = [1,0.5,0.4,1]

# PROCEDIMIENTO
def reflejotramo(xi,yi,sx,sy):
    # posición de antenas tx, rx
    xa,xb = xi
    ya,yb = yi
    # perfil suelo
    xas,xbs = sx
    sa ,sb  = sy
    # pendiente de suelo
    ms = (sb-sa)/(xbs-xas)
    bs = sa-ms*xas
    # punto de reflejo
    numerador   = bs*(xa+xb)-(xa*yb+xb*ya)+2*ms*xa*xb
    denominador = 2*bs-(ya+yb)+ms*(xa+xb)
    xc = numerador/denominador
    sc = ms*xc+bs
    reflejado = []
    if xc>=xas and xc<=xbs:
        reflejado = [xc,sc]
    return(reflejado)

# analiza para cada tramo del suelo
n = len(sx)
xc = [] ; sc = []
for k in range(0,n-1,1):
    sxk = sx[k:k+2] # un tramo de suelo
    syk = sy[k:k+2]
    reflejado = reflejotramo(xi,yi,sxk,syk)
    if len(reflejado)>0:
        xc.append(reflejado[0])
        sc.append(reflejado[1])

# SALIDA
print('puntos reflejados:')
print('xc:',xc)
print('sc',sc)

# GRAFICA
# antenas puntos en el plano
plt.scatter([xi[0],xi[1]],
            [yi[0],yi[1]],
            label='antenas')
plt.plot([xi[0],xi[1]],
         [yi[0],yi[1]],
         color='green',
         linestyle='dashed',
         label='directo')
# analiza para cada tramo del suelo
nc = len(sc)
plt.scatter(xc,sc,color='orange',
            label='punto reflejo')
# lineas de rayos
for k in range(0,nc,1):
    # lado izquierdo
    plt.plot([xi[0],xc[k]],
             [yi[0],sc[k]],
             color='blue',
             linestyle='dashdot')
    # lado derecho
    plt.plot([xc[k],xi[1]],
             [sc[k],yi[1]],
             color='blue',
             linestyle='dashdot')
    # etiquetas anotadas
    #plt.annotate(' reflejo',[xc,sc])

# perfil de suelo
plt.plot(sx,sy,color='brown',
         label='perfil suelo')

# etiquetas
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('reflexión de rayos en suelo por tramos')
plt.grid()

plt.show()