Manipulate[pointField[_,_,0|0.]:=0;pointField[p_,pq_,q_]:=q(p-pq)/((p-pq).(p-pq))^(3/2);vectorField[p_,coords_,values_]:=Plus@@MapThread[pointField[p,#1,#2]&,{coords,values}];streamPlot[coords_,values_,plot_]:=StreamPlot[If[plot,vectorField[{x,y},coords,values],{0,0}],{x,0,1},{y,0,1},Prolog{MapThread[Text[#1,#2+{0,0.1},BackgroundIf[#1>0,Yellow,Green]]&,{values,coords}]},FrameLabel{"x","y"},ImagePadding{{45,10},{40,10}},ImageSize{400,400}];If[i=!=0&&i≤Length[coords],values[[i]]=charge];coords=If[Max[#]>1,Normalize[#],#]&/@coords;Which[Length[values]<Length[coords],AppendTo[values,0];duplicate=coords;i=Length[coords],Length[values]>Length[coords],values=Drop[values,First[Position[duplicate,First[Complement[duplicate,coords]]]]];duplicate=coords;i=0];Quiet@ControlActive[streamPlot[coords,values,False],streamPlot[coords,values,True]],Control[{{i,1,"point number"},Range[0,25]}],{{charge,1,"charge"},-10,10,.1,Appearance"Labeled"},{values,{{0}},ControlTypeNone},{duplicate,{{0,0}},ControlTypeNone},{{coords,{{0.25,0.5}}},{0,0},{1,1},Locator,LocatorAutoCreate{1,∞}},TrackedSymbolsTrue,SaveDefinitionsTrue,AutorunSequencing{1,2,3},ControllerLinkingFalse]