// Uses Frink's ability to render accurately-sized graphics to draw Fresnel
// zone plates. You can print these out accurately on a laser printer with
// transparencies. A Fresnel Zone plate is almost like a printable lens.
// it takes advantage of quantum diffraction of light to focus light onto
// a target. They are freaking awesome.
//
// The main limitation of creating your own zone plates is that you have to
// be able to print at very high resolution to be able to focus visible light
// with a short focal length.
//
// http://zoneplate.lbl.gov/theory
// http://en.wikipedia.org/wiki/Zone_plate
// Draw a (printable, exactly-scaled) zone plate.
// * f is the focal length,
// * lambda is the target wavelength of light you want to focus
// * phase is 0 or 1. If phase=0, the center will be clear. If phase=1,
// the center will be dark. Surprisingly, both will focus the light at
// the geometric center of the target, even if the center is geometrically
// in shadow!
// * r is the radius of the zone plate to be drawn.
// * res is the limiting resolution of your printer. (This is at best half
// the actual resolution of your printer.) This affects the "max effective
// zones" that your printer can meaningfully render.
drawZonePlate[f=27 feet, lambda=700 nm, phase=0, r=3 in, res=600/in] :=
{
g = new graphics
// maxn is the number of zones that will be drawn
maxn = floor[-2 f lambda^-1 + 2 lambda^-2 (f^2 lambda^2 + lambda^2 r^2)^(1/2)]
if (maxn > 10000)
maxn=10000
// maxr is the radius that will actually be drawn
maxr = sqrt[maxn lambda f + maxn^2 lambda^2 / 4]
n = maxn
while n > 0
{
r = sqrt[n lambda f + n^2 lambda^2 / 4]
c = (n+phase) mod 2
g.color[c,c,c]
g.fillEllipseCenter[0 in, 0 in, 2 r, 2r]
n = n - 1
}
// maxEffectiveN is the maximum number of zones that can be meaningfully
// rendered (due to your printer's resolution limits)
maxEffectiveN = floor[(lambda (4 f + lambda) res^2 (4 - lambda^2 res^2) - 2 sqrt[(lambda^2 res^2 (-2 + lambda res) (2 + lambda res)(-4 + (-16 f^2 + lambda^2) res^2))]) / (2 lambda^2 res^2 (-4 + lambda^2 res^2))]
// maxEffectiveR is the maximum radius of the zone plate that will be
// meaningfully rendered (due to your printer's resolution limits)
maxEffectiveR = sqrt[maxEffectiveN lambda f + maxEffectiveN^2 lambda^2 / 4]
// maxEffectiveArea is the maximum area of the zone plate that will be
// meaningfully rendered (due to your printer's resolution limits)
maxEffectiveArea = pi maxEffectiveR^2
maxPower = maxEffectiveArea * 500 W/m^2
str = ""
g.color[0,0,0]
g.font["SansSerif", .5 cm]
str = str + "wavelength =" + format[lambda, "nm", 2] + "\n"
str = str + "focal length =" + format[f, "m", 3] + "\n"
str = str + "$maxn zones drawn" + "\n"
str = str + "diameter =" + format[2 maxr,"in",3] + "\n"
str = str + "Max effective zones=$maxEffectiveN\n"
str = str + "Max effective diameter=" + format[2 maxEffectiveR, "cm", 4] + "\n"
str = str + "Max effective area=" + format[maxEffectiveArea, "m^2", 6] + "\n"
str = str + "Max power=" + format[maxPower, "W", 3]
g.text[str, 0 cm, maxr, "center", "top"]
g.write["zoneplate.svg", 1200, 1200]
g.show[]
}
// Alter this line to match the focal length and wavelength you desire.
drawZonePlate[50 feet, 700. nm, 0, 3.5 in, 600/in]