File:Electron asymmetric motion animation.gif
Electron_asymmetric_motion_animation.gif (300 × 150 pixels, file size: 131 KB, MIME type: image/gif, looped, 60 frames, 1.8 s)
![]() | This is a file from the Wikimedia Commons. Information from its description page there is shown below. Commons is a freely licensed media file repository. You can help. |
Summary
DescriptionElectron asymmetric motion animation.gif | English: An electron (purple) is being pushed side-to-side by a sinusoidally-oscillating force. But because the electron is in an anharmonic potential (black curve), the electron motion is not sinusoidal. The three arrows show the Fourier series of the motion: The blue arrow corresponds to ordinary (linear) susceptibility, the green arrow corresponds to second-harmonic generation, and the red arrow corresponds to optical rectification. |
Date | |
Source | Own work |
Author | Sbyrnes321 |
Licensing
I, the copyright holder of this work, hereby publish it under the following license:
![]() ![]() | This file is made available under the Creative Commons CC0 1.0 Universal Public Domain Dedication. |
The person who associated a work with this deed has dedicated the work to the public domain by waiving all of their rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. http://creativecommons.org/publicdomain/zero/1.0/deed.enCC0Creative Commons Zero, Public Domain Dedicationfalsefalse |
Source code
""" (C) Steven Byrnes, 2014. This code is released under the MIT license http://opensource.org/licenses/MIT This code should work in Python 2.7 or 3.3. It requires imagemagick to be installed; that's how it assembles images into animated GIFs. """ from __future__ import division, print_function import pygame as pg from math import pi from cmath import exp import subprocess, os directory_now = os.path.dirname(os.path.realpath(__file__)) frames_in_anim = 60 animation_loop_seconds = 2 #time in seconds for animation to loop one cycle bgcolor = (255,255,255) #white potential_curve_color = (0,0,0) #black ecolor = (100,0,100) #electron is purple linear_color = (0, 0, 150) shg_color = (0, 150, 0) const_color = (150, 0, 0) eradius = 20 img_height = 500 img_width = 1000 top_arrow_y = 350 middle_arrow_y = 380 bottom_arrow_y = 410 arrow_width = 8 # Limits of the potential curve xmin = 100 xmax = 900 ymin = 40 ymax = 300 # pygame draws pixel-art, not smoothed. Therefore I am drawing it # bigger, then smoothly shrinking it down final_width = int(round(0.3 * img_width)) final_height = int(round(0.3 * img_height)) def potential_curve(x): """ My potential curve y as a function of x """ xscaled = (x-xmin) / (xmax - xmin) if xscaled < 0.2: yscaled = (0.2 - xscaled)**2 / (0.2**2) else: yscaled = (xscaled - 0.2)**2 / (0.8**2) # flip it, because higher y-coordinate is lower in pygame drawing yscaled = 1 - yscaled return ymin + (ymax - ymin) * yscaled curve_bottom_x = 0.79 * xmin + 0.21 * xmax curve_bottom_y = potential_curve(curve_bottom_x) def electron_curve(x): """ The path that the electron center travels along """ # xscaled = (x-xmin) / (xmax - xmin) y = min(potential_curve(x), potential_curve(x+eradius), potential_curve(x-eradius)) return y - eradius # Constants and function for calculating electron motion linear_coef = 0.3 shg_coef = 0.07 displacement = 0.32 def e_x(phase): """ x-position of electron as a function of phase (from 0 to 2pi) """ xscaled = (linear_coef * exp(1j * phase) + shg_coef * exp(2j * phase) + displacement).real return xmin + xscaled * (xmax - xmin) def draw_arrow(surf, tail_xy, head_xy, width=2, color=(0,0,0)): """ draw a horizontal arrow """ # tail_xy and head_xy are 2-tuples. Unpack them first tail_x, tail_y = tail_xy head_x, head_y = head_xy assert head_y == tail_y h = 16 # arrowhead height b = 18 # arrowhead half-base if tail_x < head_x: # rightward arrow triangle = [(head_x, head_y), (head_x - h, head_y - b), (head_x - h, head_y + b)] else: # leftward arrow triangle = [(head_x, head_y), (head_x + h, head_y - b), (head_x + h, head_y + b)] pg.draw.line(surf, color, (tail_x, tail_y), (head_x, head_y), width) pg.draw.polygon(surf, color, triangle, 0) def main(): """ function for creating the animated GIF """ # Make and save a drawing for each frame filename_list = [os.path.join(directory_now, 'temp' + str(n) + '.png') for n in range(frames_in_anim)] # Put the potential curve in the form of a list of points, to be drawn below xs = range(xmin, xmax + 1,1) ys = [potential_curve(x) for x in xs] potential_curve_path = zip(xs, ys) for frame in range(frames_in_anim): phase = 2 * pi * frame / frames_in_anim electron_x = e_x(phase) electron_y = electron_curve(electron_x) # initialize surface surf = pg.Surface((img_width,img_height)) surf.fill(bgcolor) # draw potential curve pg.draw.lines(surf, potential_curve_color, False, potential_curve_path, 10) # draw vertical line to first arrow pg.draw.line(surf, (0,0,0), (curve_bottom_x,curve_bottom_y), (curve_bottom_x, top_arrow_y), 3) # draw three arrows linear_term = (linear_coef * exp(1j * phase)).real * (xmax - xmin) shg_term = (shg_coef * exp(2j * phase)).real * (xmax - xmin) draw_arrow(surf, (curve_bottom_x, top_arrow_y), (curve_bottom_x + linear_term, top_arrow_y), width=arrow_width, color=linear_color) draw_arrow(surf, (curve_bottom_x + linear_term, middle_arrow_y), (curve_bottom_x + linear_term + shg_term, middle_arrow_y), width=arrow_width, color=shg_color) draw_arrow(surf, (curve_bottom_x + linear_term + shg_term, bottom_arrow_y), (electron_x, bottom_arrow_y), width=arrow_width, color=const_color) # draw electron pg.draw.circle(surf, ecolor, ((int(round(electron_x)), int(round(electron_y)))), eradius, 0) shrunk_surface = pg.transform.smoothscale(surf, (final_width, final_height)) pg.image.save(shrunk_surface, filename_list[frame]) seconds_per_frame = animation_loop_seconds / frames_in_anim frame_delay = str(int(seconds_per_frame * 100)) command_list = ['convert', '-delay', frame_delay, '-loop', '0'] + filename_list + ['anim.gif'] # Use the "convert" command (part of ImageMagick) to build the animation subprocess.call(command_list, cwd=directory_now) # Earlier, we saved an image file for each frame of the animation. Now # that the animation is assembled, we can (optionally) delete those files if True: for filename in filename_list: os.remove(filename) return main()
Captions
Add a one-line explanation of what this file represents
Items portrayed in this file
depicts
4 March 2014
image/gif
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 03:49, 5 March 2014 | ![]() | 300 × 150 (131 KB) | Sbyrnes321 | got rid of a vertical line |
03:31, 5 March 2014 | ![]() | 300 × 150 (132 KB) | Sbyrnes321 | User created page with UploadWizard |
File usage
The following 4 pages use this file:
Global file usage
The following other wikis use this file:
- Usage on ar.wikipedia.org
- Usage on bg.wikipedia.org
- Usage on fa.wikipedia.org
- Usage on fr.wikipedia.org
- Usage on pt.wikipedia.org
- Usage on tr.wikipedia.org
- Usage on uk.wikipedia.org
- Usage on zh.wikipedia.org