<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Disco eléctricamente cargado de manera uniforme
Este código es una fusión/modificación de los códigos disponibles en
Step1:  Se configura la escena y el sistema coordenado
Step2:  Se configura la fuente del campo eléctrico
Para un disco de radio $R$ uniformemente cargado con densidad superficial $\sigma$
Step3:  Se representa la fuente del Campo Eléctrico
Step4:  Se evalúa el campo eléctrico en determinados puntos
<ASSISTANT_TASK:>
Python Code:
import vpython as vp
#Code
def charge_color(charge):
    if charge>0:
        charge_color = vp.color.red
    elif charge <0:
        charge_color = vp.color.blue
    else:
        charge_color = vp.color.white
    return charge_color
#
def getfield(position):
    r = position
    field = vp.vec(0,0,0)
    for charge in charges:
        qp = charge.q
        rp = charge.pos
        field = field + (r-rp)*kel*qp/vp.mag(r-rp)**3 # Electric Field
    return field
def plot_field(position):
    global field, magnitude
    vector_field = vp.arrow(shaftwidth=6e-15)
    field = getfield(position)
    magnitude = vp.mag(field)
    red = max(1-1e17/magnitude, 0)
    blue = min(1e17/magnitude, 1)
    if red >= blue:
        blue = blue/red
        red = 1.0
    else:
        red = red/blue
        blue = 1.0
    vector_field.pos = position
    vector_field.axis = scale*field
    vector_field.color = vp.vector(red,0,blue)
def mouse_to_field(vector_field):
    position = vp.scene.mouse.pos
    plot_field(position)
#
    p = (70*"="+"\n")
    p += "Haga clic o arrastre para trazar un vector de campo eléctrico producido.\n"
    p += "En una pantalla táctil, toque o mantenga presionado y luego arrastre.\n"
    p += "Las flechas que representan el campo son más azules si son de baja magnitud, más rojas si son altas.\n"#    p += 70*"="+"\n"
    p += ("rx = %2.20f m \n" %position.x)
    p += ("ry = %2.20f m\n" %position.y)
    p += ("rz = %2.20f m\n" %position.z)
    p += ("r = %2.20f m \n" %vp.mag(position))
    p += (70*"="+"\n")
    p += ("Ex = %2.2f N/C\n" %field.x)
    p += ("Ey = %2.2f N/C\n" %field.y)
    p += ("Ez = %2.2f N/C\n" %field.z)
    p += ("E = %2.2f N/C \n" %magnitude)
    p += (70*"="+"\n")
    vp.scene.caption = p
    
#For interactivity!
drag = False
vector_field = None
def down(ev):
    global vector_field, drag
    vector_field = vp.arrow(shaftwidth=6e-15)
    field = mouse_to_field(vector_field)
    drag = True
    
def move(ev):
    global vector_field, drag
    if not drag: return
    mouse_to_field(vector_field)
    
def up(ev):
    global vector_field, drag
    mouse_to_field(vector_field)
    drag = False
vp.scene.bind("mousedown", down)
vp.scene.bind("mousemove", move)
vp.scene.bind("mouseup", up)
##
scale = 4e-14/1e17
#scale = 0.002 #Scale for Electric field
##
fund_charge = 1.602e-19 #C: Fundamental charge
kel = 8.99e9 #Nm^2C^-2: Electric Constant
scale
Explanation: Disco eléctricamente cargado de manera uniforme
Este código es una fusión/modificación de los códigos disponibles en:
* https://www.glowscript.org/#/user/GlowScriptDemos/folder/Examples/program/DipoleElectricField
* https://www.glowscript.org/#/user/wlane/folder/PHYS152/program/Charged-Sheet
A considerar:
* Para rotar la vista de la cámara: presione el botón derecho del mouse y arrastrelo por la pantalla (o presione Ctrl-Botón izquierdo del mouse y arrastrelo por la pantalla).
* Para hacer Zoom: presione ambos botones del mouse y arrastrelo por  la pantalla (o mueva la rueda del mouse).
* Pantalla táctil: deslice o gire con dos dedos; pellizcar/extender para hacer zoom.
End of explanation
s = "Campo Eléctrico de Disco uniformemente cargado."
vp.scene.title = s
vp.scene.background = vp.color.white
#vp.scene.width = 800
#vp.scene.height = 500
vp.scene.range = 2e-13
#Se dibuja SC con el que se trabajará
lenght_axis = 1e-13
shaftwidth = 6e-15
xaxis = vp.arrow(color=vp.color.black, pos=vp.vector(0,0,0), axis=lenght_axis*vp.vector(1,0,0), shaftwidth=shaftwidth)
xlabel = vp.label(pos=vp.vector(1.1*lenght_axis,0,0), text="x", color=vp.color.black, opacity=0, height=20, box=0 ,font='times')
yaxis = vp.arrow(color=vp.color.black, pos=vp.vector(0,0,0), axis=lenght_axis*vp.vector(0,1,0), shaftwidth=shaftwidth)
ylabel = vp.label(pos=vp.vector(0,1.1*lenght_axis,0), text="y", color=vp.color.black, opacity=0, height=20, box=0,font='times')
zaxis = vp.arrow(color=vp.color.black, pos=vp.vector(0,0,0), axis=lenght_axis*vp.vector(0,0,1), shaftwidth=shaftwidth)
zlabel = vp.label(pos=vp.vector(0,0,1.1*lenght_axis), text="z", color=vp.color.black, opacity=0, height=20, box=0,font='times')
Explanation: Se configura la escena y el sistema coordenado
End of explanation
#Parameters
Q = fund_charge # Total charge.
R = 1.0e-13 # Radius of disk.
N = 5000 # Number of point charges the disk will be made of.
A = vp.pi*R**2 # Area of the disk.
sigma = Q/A # Superficial density of charge
charge = Q/N # Single point charge.
a = A/N # Area occupied by a single point charge.
dx = vp.sqrt(a) # Distance between neighboring point charges.
print('A =', A, 'm^2')
print('sigma =', sigma, 'C/m^2')
print('q =', charge, 'C')
print('a =', a, 'm^2')
Explanation: Se configura la fuente del campo eléctrico
Para un disco de radio $R$ uniformemente cargado con densidad superficial $\sigma$:
El área $A$ del disco está dado por:
$$A = \int_{S}  dS = \int_{0}^{R} \int_{0}^{2\pi} \rho d\rho d\varphi = \pi R^2.$$
La carga total $Q$ satisface que:
$$Q = \int_{S} \sigma dS = \int_{0}^{R} \int_{0}^{2\pi} \sigma \rho d\rho d\varphi = \sigma \pi R^2 = \sigma A.$$
Si la carga total $Q$ es una suma discreta de $N$ cargas de intensidad $q$, entonces:
$$ Q = qN.$$
Además, si cada carga $q$ está distribuida ocupando un área $a$, entonces:
$$A = Na.$$
Si controlamos $Q$, $R$ y $N$, entonces:
$$ \sigma = \frac{Q}{\pi R^2}.$$
$$ q = \frac{Q}{N}.$$
$$ a = \frac{\pi R^2}{N}.$$
End of explanation
# Create a list of point charges.
charges = [] # An empty list.
x = 0
while (x <= R):
    y = 0
    ymax = vp.sqrt(R**2-x**2)
    while (y <= ymax):
        charges.append(vp.sphere(radius=0.1*dx, pos=vp.vector(x,y,0), q=charge, color=charge_color(charge)))
        charges.append(vp.sphere(radius=0.1*dx, pos=vp.vector(-x,y,0), q=charge, color=charge_color(charge)))
        charges.append(vp.sphere(radius=0.1*dx, pos=vp.vector(x,-y,0), q=charge, color=charge_color(charge)))
        charges.append(vp.sphere(radius=0.1*dx, pos=vp.vector(-x,-y,0), q=charge, color=charge_color(charge)))
        y = y + dx
    x = x + dx
Explanation: Se representa la fuente del Campo Eléctrico
End of explanation
d = 30*dx
r1 = vp.vector(0.7*R,0,d)
r2 = vp.vector(-0.7*R,0,d)
r3 = vp.vector(0,0,d)
r4 = vp.vector(0.7*R,0,-d)
r5 = vp.vector(-0.7*R,0,-d)
r6 = vp.vector(0,0,-d)
plot_field(r1)
plot_field(r2)
plot_field(r3)
plot_field(r4)
plot_field(r5)
plot_field(r6)
Explanation: Se evalúa el campo eléctrico en determinados puntos
End of explanation
<END_TASK>