Add illustration for Serway and Jewett v8's problem 23.50.
[course.git] / asymptote / ElectroMag.asy
1 /* Useful functions for drawing Physics 102 figures.
2  *
3  * Copyright (C) 2008-2009 W. Trevor King <wking@drexel.edu>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19
20 import geometry;
21 import Mechanics;
22
23
24 // ---------------------- Charges -------------------------
25
26 // charged particle
27 struct Charge {
28   pair center;
29   real q;
30   real radius;
31   pen outline;
32   pen fill;
33   Label L;
34   
35   void operator init(pair center=(0,0), real q=1, real radius=2mm, pen outline=currentpen, pen fill=red, Label L="") {
36     this.center = center;
37     this.q = q;
38     this.radius = radius;
39     this.outline = outline;
40     this.fill = fill;
41     this.L = L;
42   }
43   
44   void draw(picture pic=currentpicture) {
45     picture picF;
46     picture picL;
47     label(picL, L);
48     pair pLabelSize = 1.2 * (max(picL)-min(picL));
49     path c = scale(radius)*unitcircle;
50     filldraw(picF, c, fill, outline);
51     label(pic = picF,
52           L = L,
53           position = (0,-(radius+pLabelSize.y/2)));
54     add(pic, picF, center);
55   }
56 }
57
58 // positive charge
59 Charge pCharge(pair center=(0,0), real q=1, real radius=2mm, pen outline=currentpen, Label L="")
60 {
61   Charge c = Charge(center=center, q=q, radius=radius, outline=outline, L=L, fill=red);
62   return c;
63 }
64
65 // negative charge
66 Charge nCharge(pair center=(0,0), real q=-1, real radius=2mm, pen outline=currentpen, Label L="")
67 {
68   Charge c = Charge(center=center, q=q, radius=radius, outline=outline, L=L, fill=blue);
69   return c;
70 }
71
72 // neutral charge
73 Charge neutralCharge(pair center=(0,0), real radius=2mm, pen outline=currentpen, Label L="")
74 {
75   Charge c = Charge(center=center, q=0, radius=radius, outline=outline, L=L, fill=grey);
76   return c;
77 }
78
79 // auto-signed charge
80 Charge aCharge(pair center=(0,0), real q=1, real radius=2mm, pen outline=currentpen, Label L="")
81 {
82   Charge c;
83   if (q > 0) {
84     c = pCharge(center, q, radius, outline, L);
85   } else if (q < 0) {
86     c = nCharge(center, q, radius, outline, L);
87   } else {
88     c = neutralCharge(center, radius, outline, L);
89   }
90   return c;
91 }
92
93 // ---------------------- Vectors -------------------------
94
95 pen EFieldPen = rgb(1,0.5,0.2);    // orange
96 pen BFieldPen = rgb(0.1,1,0.2);    // green
97 pen CurrentPen = rgb(0.8,0.1,0.8); // purple
98
99 // electric field
100 Vector EField(pair center=(0,0), real mag=5mm, real dir=0, real phi=0, Label L="")
101 {
102   Vector v = Vector(center=center, mag=mag, dir=dir, phi=phi, L=L, outline=EFieldPen);
103   return v;
104 }
105
106 // magnetic field
107 Vector BField(pair center=(0,0), real mag=5mm, real dir=0, real phi=0, Label L="")
108 {
109   Vector v = Vector(center=center, mag=mag, dir=dir, phi=phi, L=L, outline=BFieldPen);
110   return v;
111 }
112
113 Vector Current(pair center=(0,0), real mag=5mm, real dir=0, real phi=0, Label L="")
114 {
115   Vector v = Vector(center=center, mag=mag, dir=dir, phi=phi, L=L, outline=CurrentPen);
116   return v;
117 }
118
119 // ---------------------- Forces -------------------------
120
121 // Force of a on b
122 Vector CoulombForce(Charge a, Charge b, Label L="", real scale=1mm, real unit=1mm)
123 {
124   pair r = b.center - a.center;
125   real mag, dir;
126   mag = ((a.q*b.q)*(scale/length(r))^2)*unit;
127   dir = degrees(r);
128   Vector v = Force(center=b.center, mag=mag, dir=dir, L=L);
129   return v;
130 }
131
132 void CoulombForces(Charge c[], real scale=1mm, real unit=1mm)
133 {
134   Vector F;
135   string s;
136   for (int i=0; i<c.length; i+=1) {
137     for(int j=0; j<c.length; j+=1) {
138       if (i==j) continue;
139       s = "$F_{" + format("%d", i+1) + "," + format("%d", j+1) + "}$";
140       F = CoulombForce(c[i], c[j], L=s, scale=scale, unit=unit);
141       F.draw();
142     }
143   }
144 }
145
146