File:Transmission line animation.gif
Transmission_line_animation.gif (300 × 100像素,文件大小:112 KB,MIME类型:image/gif、循环、30帧、1.8秒)
摘要
描述Transmission line animation.gif |
English: A lossless transmission line, terminated at an impedance-matched load resistor (box on right). Red color indicates high voltage, and blue indicates low voltage. Black dots represent electrons. (See also File:Transmission_line_animation3.gif for a newer and simpler version.) |
日期 | |
来源 | 自己的作品 |
作者 | Sbyrnes321 |
许可协议
我,本作品著作权人,特此采用以下许可协议发表本作品:
本作品采用知识共享CC0 1.0 通用公有领域贡献许可协议授权。 | |
采用本宣告发表本作品的人,已在法律允许的范围内,通过在全世界放弃其对本作品拥有的著作权法规定的所有权利(包括所有相关权利),将本作品贡献至公有领域。您可以复制、修改、传播和表演本作品,将其用于商业目的,无需要求授权。
http://creativecommons.org/publicdomain/zero/1.0/deed.enCC0Creative Commons Zero, Public Domain Dedicationfalsefalse |
Source code
"""
(C) Steven Byrnes, 2013. This code is released under the MIT license
http://opensource.org/licenses/MIT
This code runs 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
import pygame as pg
from numpy import cos, pi, sin, asarray
import subprocess, os
directory_now = os.path.dirname(os.path.realpath(__file__))
frames_in_anim = 30
animation_loop_seconds = 2 #time in seconds for animation to loop one cycle
bgcolor = (255,255,255) #white
linecolor = (0,0,0) #outline of resistor is black
ecolor = (0,0,0) #electron color is black
img_height = 100
img_width = 300
#transmission line wire length and thickness, and y-coordinate of each wire
tl_length = img_width * 6//7
tl_thickness = 5
tl_top_y = img_height*4//9
tl_bot_y = img_height*5//9 - tl_thickness//2 #second term is to keep it symmetric
wavelength = 0.6 * tl_length
resistor_length = img_height//2
resistor_width = resistor_length//3
resistor_center = (img_width - resistor_width*3//2, img_height//2)
top_lead_path = [(tl_length, tl_top_y + tl_thickness-1),
(tl_length, img_height//9),
(resistor_center[0], img_height//9),
resistor_center]
bot_lead_path = [(x,img_height-y+1) for (x,y) in top_lead_path]
lead_thickness = 2
def rgb_from_V(V):
"""
voltage V varies -1 to +1. Return a color as a function of V.
Color is a 3-tuple red,green,blue, each 0 to 255.
"""
return (100+100*V, 100 - 100*V, 100-100*V)
def tup_round(tup):
"""
round each element of a tuple to nearest integer
"""
return tuple(int(round(x)) for x in tup)
def make_wire_surf(phase_at_left):
"""
make a pygame surface representing a colored wire. startphase is phase
at left side of the wire.
"""
imgarray = [[rgb_from_V(cos(phase_at_left + 2*pi*x/wavelength))
for y in range(tl_thickness)] for x in range(tl_length)]
return pg.surfarray.make_surface(asarray(imgarray))
def make_resistor_surf(phase_at_top):
"""
make a pygame surface representing the resistor. topphase is phase at top
"""
imgarray = [[rgb_from_V(cos(phase_at_top) * (1 - 2*y/resistor_length))
for y in range(resistor_length)]
for x in range(resistor_width)]
surf = pg.surfarray.make_surface(asarray(imgarray))
pg.draw.rect(surf,linecolor,surf.get_rect(),1) #1-pixel black outline
return surf
def e_path(param, phase_top_left):
"""
as param goes 0 to 1, this returns {'pos': (x, y), 'phase':phi},
where (x,y) is the coordinates of the corresponding point on the electron
dot path, and phi is the phase for an electron at that point on the path.
phase_top_left is phase of the left side of the top wire.
"""
d = 3 #pixels between electron path and corresponding wires
path_length = ( 2*(tl_length - d) #transmission lines
+ 2*(img_height//3) #left vertical leads
+ 2*(resistor_center[0] - tl_length + 2*d + lead_thickness)
+ 2*(resistor_length//2 - img_height//9) #right vertical leads
+ resistor_length) #through resistor
howfar = param * path_length
#move right across top transmission line
if howfar < tl_length - d:
x = howfar
y = tl_top_y - d
phase = phase_top_left + 2 * pi * x / wavelength
return {'pos':(x,y), 'phase':phase}
howfar -= (tl_length - d)
#move up lead
if howfar < img_height//3:
x = tl_length - d
y = tl_top_y - d - howfar
phase = phase_top_left + 2 * pi * tl_length / wavelength
return {'pos':(x,y), 'phase':phase}
howfar -= img_height//3
#move right to above resistor
if howfar < (resistor_center[0]- tl_length) + 2*d + lead_thickness:
x = tl_length - d + howfar
y = img_height//9 - d
phase = phase_top_left + 2 * pi * tl_length / wavelength
return {'pos':(x,y), 'phase':phase}
howfar -= (resistor_center[0] - tl_length) + 2*d + lead_thickness
#move down to top of resistor
if howfar < (resistor_length//2 - img_height//9):
x = resistor_center[0] + d + lead_thickness
y = img_height//9 - d + howfar
phase = phase_top_left + 2 * pi * tl_length / wavelength
return {'pos':(x,y), 'phase':phase}
howfar -= (resistor_length//2 - img_height//9)
#move down resistor
if howfar < resistor_length:
x = resistor_center[0] + resistor_width//2 + d
y = resistor_center[1] - resistor_length//2 + howfar
phase = phase_top_left + 2 * pi * tl_length / wavelength
return {'pos':(x,y), 'phase':phase}
howfar -= resistor_length
#beyond here use the mirror symmetry
flipdata = e_path(1-param, phase_top_left)
flipdata['pos'] = (flipdata['pos'][0], img_height - flipdata['pos'][1] + 2)
return flipdata
def main():
#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)]
for frame in range(frames_in_anim):
phase_top_left = -2 * pi * frame / frames_in_anim
phase_top_right = phase_top_left + 2 * pi * tl_length / wavelength
#initialize surface
surf = pg.Surface((img_width,img_height))
surf.fill(bgcolor);
#draw transmission line
top_wire_surf = make_wire_surf(phase_top_left)
bottom_wire_surf = make_wire_surf(phase_top_left + pi)
surf.blit(top_wire_surf, (0, tl_top_y))
surf.blit(bottom_wire_surf, (0, tl_bot_y))
#draw lead wires
color = rgb_from_V(cos(phase_top_right))
pg.draw.lines(surf,color,False,top_lead_path,lead_thickness)
color = rgb_from_V(cos(phase_top_right + pi))
pg.draw.lines(surf,color,False,bot_lead_path,lead_thickness)
#draw resistor
resistor_surf = make_resistor_surf(phase_top_right)
surf.blit(resistor_surf, (resistor_center[0] - resistor_width//2,
resistor_center[1] - resistor_length//2))
#draw electrons
num_electrons = 100
equilibrium_params = [x/(num_electrons-1) for x in range(num_electrons)]
phases = [e_path(a, phase_top_left)['phase'] for a in equilibrium_params]
now_params = [equilibrium_params[i] + sin(phases[i])/(1.3*num_electrons)
for i in range(num_electrons)]
coords = [e_path(a, phase_top_left)['pos'] for a in now_params]
for coord in coords:
pg.draw.circle(surf, ecolor, tup_round(coord), 2, 0)
pg.image.save(surf, 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)
main()
此文件中描述的项目
描繪內容
某些值没有维基数据项目
30 7 2012
文件历史
点击某个日期/时间查看对应时刻的文件。
日期/时间 | 缩略图 | 大小 | 用户 | 备注 | |
---|---|---|---|---|---|
当前 | 2014年2月24日 (一) 14:50 | 300 × 100(112 KB) | Sbyrnes321 | smaller file size, by switching from images2gif.py to imagemagick | |
2012年7月30日 (一) 13:40 | 300 × 100(258 KB) | Sbyrnes321 |
文件用途
以下2个页面使用本文件:
全域文件用途
以下其他wiki使用此文件:
- ar.wikipedia.org上的用途
- ca.wikipedia.org上的用途
- en.wikipedia.org上的用途
- fa.wikipedia.org上的用途
- hi.wikipedia.org上的用途
- it.wikipedia.org上的用途