Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,19 +0,0 @@
|
|||
generic
|
||||
type Float_Type is digits <>;
|
||||
Gravitation : Float_Type;
|
||||
package Pendulums is
|
||||
type Pendulum is private;
|
||||
function New_Pendulum (Length : Float_Type;
|
||||
Theta0 : Float_Type) return Pendulum;
|
||||
function Get_X (From : Pendulum) return Float_Type;
|
||||
function Get_Y (From : Pendulum) return Float_Type;
|
||||
procedure Update_Pendulum (Item : in out Pendulum; Time : in Duration);
|
||||
private
|
||||
type Pendulum is record
|
||||
Length : Float_Type;
|
||||
Theta : Float_Type;
|
||||
X : Float_Type;
|
||||
Y : Float_Type;
|
||||
Velocity : Float_Type;
|
||||
end record;
|
||||
end Pendulums;
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
with Ada.Numerics.Generic_Elementary_Functions;
|
||||
package body Pendulums is
|
||||
package Math is new Ada.Numerics.Generic_Elementary_Functions (Float_Type);
|
||||
|
||||
function New_Pendulum (Length : Float_Type;
|
||||
Theta0 : Float_Type) return Pendulum is
|
||||
Result : Pendulum;
|
||||
begin
|
||||
Result.Length := Length;
|
||||
Result.Theta := Theta0 / 180.0 * Ada.Numerics.Pi;
|
||||
Result.X := Math.Sin (Theta0) * Length;
|
||||
Result.Y := Math.Cos (Theta0) * Length;
|
||||
Result.Velocity := 0.0;
|
||||
return Result;
|
||||
end New_Pendulum;
|
||||
|
||||
function Get_X (From : Pendulum) return Float_Type is
|
||||
begin
|
||||
return From.X;
|
||||
end Get_X;
|
||||
|
||||
function Get_Y (From : Pendulum) return Float_Type is
|
||||
begin
|
||||
return From.Y;
|
||||
end Get_Y;
|
||||
|
||||
procedure Update_Pendulum (Item : in out Pendulum; Time : in Duration) is
|
||||
Acceleration : constant Float_Type := Gravitation / Item.Length *
|
||||
Math.Sin (Item.Theta);
|
||||
begin
|
||||
Item.X := Math.Sin (Item.Theta) * Item.Length;
|
||||
Item.Y := Math.Cos (Item.Theta) * Item.Length;
|
||||
Item.Velocity := Item.Velocity +
|
||||
Acceleration * Float_Type (Time);
|
||||
Item.Theta := Item.Theta +
|
||||
Item.Velocity * Float_Type (Time);
|
||||
end Update_Pendulum;
|
||||
end Pendulums;
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
with Ada.Text_IO;
|
||||
with Ada.Calendar;
|
||||
with Pendulums;
|
||||
|
||||
procedure Main is
|
||||
package Float_Pendulum is new Pendulums (Float, -9.81);
|
||||
use Float_Pendulum;
|
||||
use type Ada.Calendar.Time;
|
||||
|
||||
My_Pendulum : Pendulum := New_Pendulum (10.0, 30.0);
|
||||
Now, Before : Ada.Calendar.Time;
|
||||
begin
|
||||
Before := Ada.Calendar.Clock;
|
||||
loop
|
||||
Delay 0.1;
|
||||
Now := Ada.Calendar.Clock;
|
||||
Update_Pendulum (My_Pendulum, Now - Before);
|
||||
Before := Now;
|
||||
-- output positions relative to origin
|
||||
-- replace with graphical output if wanted
|
||||
Ada.Text_IO.Put_Line (" X: " & Float'Image (Get_X (My_Pendulum)) &
|
||||
" Y: " & Float'Image (Get_Y (My_Pendulum)));
|
||||
end loop;
|
||||
end Main;
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glut.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#define length 5
|
||||
|
|
@ -10,68 +10,66 @@ double alpha, accl, omega = 0, E;
|
|||
struct timeval tv;
|
||||
|
||||
double elappsed() {
|
||||
struct timeval now;
|
||||
gettimeofday(&now, 0);
|
||||
int ret = (now.tv_sec - tv.tv_sec) * 1000000
|
||||
+ now.tv_usec - tv.tv_usec;
|
||||
tv = now;
|
||||
return ret / 1.e6;
|
||||
struct timeval now;
|
||||
gettimeofday(&now, 0);
|
||||
int ret = (now.tv_sec - tv.tv_sec) * 1000000 + now.tv_usec - tv.tv_usec;
|
||||
tv = now;
|
||||
return ret / 1.e6;
|
||||
}
|
||||
|
||||
void resize(int w, int h)
|
||||
{
|
||||
glViewport(0, 0, w, h);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
void resize(int w, int h) {
|
||||
glViewport(0, 0, w, h);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, w, h, 0, -1, 1);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, w, h, 0, -1, 1);
|
||||
}
|
||||
|
||||
void render()
|
||||
{
|
||||
double x = 320 + 300 * sin(alpha), y = 300 * cos(alpha);
|
||||
resize(640, 320);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
void render() {
|
||||
double x = 320 + 300 * sin(alpha), y = 300 * cos(alpha);
|
||||
resize(640, 320);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glBegin(GL_LINES);
|
||||
glVertex2d(320, 0);
|
||||
glVertex2d(x, y);
|
||||
glEnd();
|
||||
glFlush();
|
||||
glBegin(GL_LINES);
|
||||
glVertex2d(320, 0);
|
||||
glVertex2d(x, y);
|
||||
glEnd();
|
||||
glFlush();
|
||||
|
||||
double us = elappsed();
|
||||
alpha += (omega + us * accl / 2) * us;
|
||||
omega += accl * us;
|
||||
double us = elappsed();
|
||||
alpha += (omega + us * accl / 2) * us;
|
||||
omega += accl * us;
|
||||
|
||||
/* don't let precision error go out of hand */
|
||||
if (length * g * (1 - cos(alpha)) >= E) {
|
||||
alpha = (alpha < 0 ? -1 : 1) * acos(1 - E / length / g);
|
||||
omega = 0;
|
||||
}
|
||||
accl = -g / length * sin(alpha);
|
||||
/* don't let precision error go out of hand */
|
||||
if (length * g * (1 - cos(alpha)) >= E) {
|
||||
alpha = (alpha < 0 ? -1 : 1) * acos(1 - E / length / g);
|
||||
omega = 0;
|
||||
}
|
||||
accl = -g / length * sin(alpha);
|
||||
}
|
||||
|
||||
void init_gfx(int *c, char **v)
|
||||
{
|
||||
glutInit(c, v);
|
||||
glutInitDisplayMode(GLUT_RGB);
|
||||
glutInitWindowSize(640, 320);
|
||||
glutIdleFunc(render);
|
||||
glutCreateWindow("Pendulum");
|
||||
void init_gfx(int *c, char **v) {
|
||||
glutInit(c, v);
|
||||
glutInitDisplayMode(GLUT_RGB);
|
||||
glutInitWindowSize(640, 320);
|
||||
int winid = glutCreateWindow("Pendulum");
|
||||
glutSetWindow(winid);
|
||||
glutDisplayFunc(render);
|
||||
glutIdleFunc(render);
|
||||
glutReshapeFunc(resize);
|
||||
}
|
||||
|
||||
int main(int c, char **v)
|
||||
{
|
||||
alpha = 4 * atan2(1, 1) / 2.1;
|
||||
E = length * g * (1 - cos(alpha));
|
||||
int main(int c, char **v) {
|
||||
alpha = 4 * atan2(1, 1) / 2.1;
|
||||
E = length * g * (1 - cos(alpha));
|
||||
|
||||
accl = -g / length * sin(alpha);
|
||||
omega = 0;
|
||||
accl = -g / length * sin(alpha);
|
||||
omega = 0;
|
||||
|
||||
gettimeofday(&tv, 0);
|
||||
init_gfx(&c, v);
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
gettimeofday(&tv, 0);
|
||||
init_gfx(&c, v);
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,57 +0,0 @@
|
|||
include graphics.e
|
||||
include misc.e
|
||||
|
||||
constant dt = 1E-3
|
||||
constant g = 50
|
||||
|
||||
sequence vc
|
||||
sequence suspension
|
||||
atom len
|
||||
|
||||
procedure draw_pendulum(atom color, atom len, atom alfa)
|
||||
sequence point
|
||||
point = (len*{sin(alfa),cos(alfa)} + suspension)
|
||||
draw_line(color, {suspension, point})
|
||||
ellipse(color,0,point-{10,10},point+{10,10})
|
||||
end procedure
|
||||
|
||||
function wait()
|
||||
atom t0
|
||||
t0 = time()
|
||||
while time() = t0 do
|
||||
if get_key() != -1 then
|
||||
return 1
|
||||
end if
|
||||
end while
|
||||
return 0
|
||||
end function
|
||||
|
||||
procedure animation()
|
||||
atom alfa, omega, epsilon
|
||||
|
||||
if graphics_mode(18) then
|
||||
end if
|
||||
|
||||
vc = video_config()
|
||||
suspension = {vc[VC_XPIXELS]/2,vc[VC_YPIXELS]/2}
|
||||
len = vc[VC_YPIXELS]/2-20
|
||||
|
||||
alfa = PI/2
|
||||
omega = 0
|
||||
|
||||
while 1 do
|
||||
draw_pendulum(BRIGHT_WHITE,len,alfa)
|
||||
if wait() then
|
||||
exit
|
||||
end if
|
||||
draw_pendulum(BLACK,len,alfa)
|
||||
epsilon = -len*sin(alfa)*g
|
||||
omega += dt*epsilon
|
||||
alfa += dt*omega
|
||||
end while
|
||||
|
||||
if graphics_mode(-1) then
|
||||
end if
|
||||
end procedure
|
||||
|
||||
animation()
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
option explicit
|
||||
|
||||
const dt = 0.15
|
||||
const length=23
|
||||
dim ans0:ans0=chr(27)&"["
|
||||
dim Veloc,Accel,angle,olr,olc,r,c
|
||||
const r0=1
|
||||
const c0=40
|
||||
cls
|
||||
angle=0.7
|
||||
while 1
|
||||
wscript.sleep(50)
|
||||
Accel = -.9 * sin(Angle)
|
||||
Veloc = Veloc + Accel * dt
|
||||
Angle = Angle + Veloc * dt
|
||||
|
||||
r = r0 + int(cos(Angle) * Length)
|
||||
c = c0+ int(2*sin(Angle) * Length)
|
||||
cls
|
||||
draw_line r,c,r0,c0
|
||||
toxy r,c,"O"
|
||||
|
||||
olr=r :olc=c
|
||||
wend
|
||||
|
||||
sub cls() wscript.StdOut.Write ans0 &"2J"&ans0 &"?25l":end sub
|
||||
sub toxy(r,c,s) wscript.StdOut.Write ans0 & r & ";" & c & "f" & s :end sub
|
||||
|
||||
Sub draw_line(r1,c1, r2,c2) 'Bresenham's line drawing
|
||||
Dim x,y,xf,yf,dx,dy,sx,sy,err,err2
|
||||
x =r1 : y =c1
|
||||
xf=r2 : yf=c2
|
||||
dx=Abs(xf-x) : dy=Abs(yf-y)
|
||||
If x<xf Then sx=+1: Else sx=-1
|
||||
If y<yf Then sy=+1: Else sy=-1
|
||||
err=dx-dy
|
||||
Do
|
||||
toxy x,y,"."
|
||||
If x=xf And y=yf Then Exit Do
|
||||
err2=err+err
|
||||
If err2>-dy Then err=err-dy: x=x+sx
|
||||
If err2< dx Then err=err+dx: y=y+sy
|
||||
Loop
|
||||
End Sub 'draw_line
|
||||
Loading…
Add table
Add a link
Reference in a new issue