var('x,y,t')
F=vector([-y,x])
#F=vector([2*x+y,-x+2*y]) #Uncomment this line for a different field.
r=vector([5*cos(t), 5*sin(t)])
tstart=0
tend=2*pi

vector_field_bounds = ((x,-6,6), (y,-6,6))


# Let's make a function right off to evaluate an integral over this curve.
def line_integral(integrand):
    return RR(numerical_integral((integrand).subs(x=r[0], y=r[1]), tstart, tend)[0])

dr=diff(r,t)
dW=F(x=r[0], y=r[1])*dr # Multiplying two vectors together gives the dot product
W=line_integral(dW)

nds(t) = (dr[1], -dr[0])
dFlux=F(x=r[0], y=r[1])*nds
Flux=line_integral(dFlux)


# TABLE
show(table([
[r"$\vec F(x,y)$", F],
[r"$\vec r(t)$", r],
[r"$t$ range", (t, tstart, tend)],
[r"$d\vec r$", dr],
[r"$\vec F(\vec r(t))$", F(x=r[0], y=r[1])],
[r"$dW=\vec F \cdot d\vec r$", dW],
[r"$W=\int dW=\int \vec F \cdot d\vec r$", W],
[r"$\vec n ds$", nds(t)],
[r"$dFlux=F\cdot n ds = M dy - N dx$", dFlux(t)],
[r"Flux=$\int dFlux=\int F\cdot n ds = \int Mdy-Ndx$", Flux]
]))

# PLOT
@interact
def _(state=["flow","flux"]):
    p=plot_vector_field(F, *vector_field_bounds)
    p+= parametric_plot(r, (t, tstart, tend),thickness=3)
    if state=="flow":
        for i in srange(tstart, tend, (tend-tstart)/18):
            p += arrow(r(t=i), (r+ .5*dr)(t=i),color='red')
    elif state=="flux":
        for i in srange(tstart, tend, (tend-tstart)/18):
            p += arrow(r(t=i), (r+ .5*nds)(t=i),color='green')

    show(p, aspect_ratio=1)