#!/usr/bin/env python3
from tkinter import Tk,Canvas
import numpy as np
#
cw=800
ch=800
Ox=cw/2
Oy=ch/2
# ..................................... create root window and canvas
root=Tk()
root.title('Dipole Field')
canvas=Canvas(root,width=cw,height=ch,background="#ffffff")
canvas.grid(row=0,column=0)
# .................................................. charge locations
y0plus=30.0
y0minus=-30.0
x0plus=x0minus=0.0
rad=3.0
# ....................................................... field lines
i=0
delta=2.0
while i<32:
  flin=[]
  alpha=i*2*np.pi/32.0
  x=x0plus+rad*np.cos(alpha)
  y=y0plus+rad*np.sin(alpha)
  flin.append(x)
  flin.append(y)
  while True:
    alpha=np.arctan2((y-y0plus),(x-x0plus))
    beta=np.arctan2((y-y0minus),(x-x0minus))
    Eplus=1.0/((x-x0plus)**2+(y-y0plus)**2)
    Eminus=-1.0/((x-x0minus)**2+(y-y0minus)**2)
    Ex=Eplus*np.cos(alpha)+Eminus*np.cos(beta)
    Ey=Eplus*np.sin(alpha)+Eminus*np.sin(beta)
    gamma=np.arctan2(Ey,Ex)
    x=x+delta*np.cos(gamma)
    y=y+delta*np.sin(gamma)
    flin.append(x)
    flin.append(y)
    if x>Ox or x<-Ox or y>Oy or y<0:
      break
  flin2=flin[:]
  flin2[1::2]=np.array(flin2[1::2])*-1
  flin[::2]=np.array(flin[::2])+Ox
  flin[1::2]=Oy-np.array(flin[1::2])
  canvas.create_line(flin,fill='black')
  flin2[::2]=np.array(flin2[::2])+Ox
  flin2[1::2]=Oy-np.array(flin2[1::2])
  canvas.create_line(flin2,fill='black')
  i+=1
# ..................................................................
canvas.create_line(0,Oy,cw,Oy,fill='black')
# ....................................................................
canvas.update()
canvas.postscript(file='DipoleField.eps',colormode='color')
root.mainloop()
  
