Lewis structures
by sonone, Nov 11, 2020, 4:34 PM
As long awaited, I have completed a functional "package" to draw lewis structures! In this package, you can draw single electrons and electron pairs around an atom, single bonds, and double bonds. Here is the source code: Lewis structures v1.0
Here is a short tutorial:
Defining an atom:
To define an atom, you need to do three things: define the symbol, the position, and the angles that the electron groups are at (between 4 and 6). This is how you do it:
Here is an example of A hydrogen atom at (0,0), with electron groups at 0, 90, 180, and 270:
To get these values back, do
to get the symbol,
to get the position, and
to get any of the electron group positions.
Placing the atom:
Now that you have your atom defined, place it by doing
Putting valence electrons on the atom:
There are two things you need to keep in mind when placing the electrons, the first is how many electron groups you have, and second how many electrons go in each (0, 1, or 2). Say I have my atom
, and it has four electron groups, and I want 1 electron pair on each side. To do this, I simply put down
places the atom symbol too, so
can sometimes be omitted.
Drawing single and double bonds:
To draw a single bond between atoms
and
, you type
. You do the same for double bonds, except the function is
, not
. Double bonding only differs in that you can edit the distance between the two bonds by adding one more number to the function (between 0 an 1 inclusive).
Finally, here is a key to help remember the functions:
Here are a few things you can expect for the next version:
If there are any questions, comments, or suggestions, feel free to reply below!
size(70); struct atom { string symbol; pair place; real[] ep; static atom atom(string symbol, pair place ... real[] ep){ atom a=new atom; a.symbol=symbol; a.place=place; a.ep=ep; return a; } picture pap(){ picture pic; label(pic,atom.symbol,atom.place); return pic; } void pa(){ label(atom.symbol,atom.place); } void pe(... int[] v){ atom.pa(); for(int i=0; i<v.length; ++i){ real[] ori=atom.ep; if(v[i]==1){ label(rotate(atom.ep[i], atom.place)*"$\cdot$", atom.place, 2*dir(atom.ep[i])); } if(v[i]==2){ label(rotate(atom.ep[i],atom.place)*"$:$", atom.place, 2*dir(atom.ep[i])); } } } } path cutoff(path a, real frac){ return subpath(a,frac,1-frac); } path cutoff_begin(path a, real frac){ return subpath(a,frac,0); } path cutoff_end(path a, real frac){ return subpath(a,0,1-frac); } void sb(atom a, atom b, real f=.7){ draw(cutoff(a.place--b.place,.5-f*.5)); } void db(atom a, atom b, real l=.7, real h=.5){ pair a1,a2,b1,b2; path vec=a.place--b.place; a1=rotate(-90,a.place)*point(cutoff_end(vec,1-h*.1),1); a2=rotate(90,a.place)*point(cutoff_end(vec,1-h*.1),1); b1=rotate(90,b.place)*point(cutoff_begin(vec,1-h*.1),0); b2=rotate(-90,b.place)*point(cutoff_begin(vec,1-h*.1),0); draw(cutoff(a1--b1,.5-l*.5)^^cutoff(a2--b2,.5-l*.5)); }
Here is a short tutorial:
Defining an atom:
To define an atom, you need to do three things: define the symbol, the position, and the angles that the electron groups are at (between 4 and 6). This is how you do it:
atom myatom=atom.atom("<symbol>",<position>,<angles in a comma separated list>);
Here is an example of A hydrogen atom at (0,0), with electron groups at 0, 90, 180, and 270:
atom myatom=atom.atom("H",(0,0),0,90,180,270);
To get these values back, do


![$\verb-myatom.ep[<int>]-$](http://latex.artofproblemsolving.com/e/8/c/e8cf963da33c04c983a04cf4b1cf0b35292a5349.png)
Placing the atom:
Now that you have your atom defined, place it by doing
myatom.pa();This is essentially the same as
label(myatom.symbol, myatom,place);
Putting valence electrons on the atom:
There are two things you need to keep in mind when placing the electrons, the first is how many electron groups you have, and second how many electrons go in each (0, 1, or 2). Say I have my atom

myatom.pe(2,2,2,2);The first 2 corresponds to 0 degrees, the second 2 90 degrees, and so on. Also not that


Drawing single and double bonds:
To draw a single bond between atoms


sb(myatom,youratom);To edit the span of the bond, place a number between 0 an 1 inclusive after "youratom" like thus:



db(myatom, youratom, .7, .5);
Finally, here is a key to help remember the functions:
means "place atom"
means "place electron(s)"
means "single bond"
means "double bond"
Here are a few things you can expect for the next version:
- Triple bonds
- Ion brackets
- resonance structure arrow.
If there are any questions, comments, or suggestions, feel free to reply below!