Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,99 +0,0 @@
|
|||
with Ada.Numerics.Elementary_Functions;
|
||||
with Ada.Calendar.Formatting;
|
||||
with Ada.Calendar.Time_Zones;
|
||||
|
||||
with SDL.Video.Windows.Makers;
|
||||
with SDL.Video.Renderers.Makers;
|
||||
with SDL.Events.Events;
|
||||
|
||||
procedure Draw_A_Clock is
|
||||
use Ada.Calendar;
|
||||
use Ada.Calendar.Formatting;
|
||||
Window : SDL.Video.Windows.Window;
|
||||
Renderer : SDL.Video.Renderers.Renderer;
|
||||
Event : SDL.Events.Events.Events;
|
||||
Offset : Time_Zones.Time_Offset;
|
||||
|
||||
procedure Draw_Clock (Stamp : Time)
|
||||
is
|
||||
use SDL.C;
|
||||
use Ada.Numerics.Elementary_Functions;
|
||||
Radi : constant array (0 .. 59) of int := (0 | 15 | 30 | 45 => 2,
|
||||
5 | 10 | 20 | 25 | 35 | 40 | 50 | 55 => 1,
|
||||
others => 0);
|
||||
Diam : constant array (0 .. 59) of int := (0 | 15 | 30 | 45 => 5,
|
||||
5 | 10 | 20 | 25 | 35 | 40 | 50 | 55 => 3,
|
||||
others => 1);
|
||||
Width : constant int := Window.Get_Surface.Size.Width;
|
||||
Height : constant int := Window.Get_Surface.Size.Height;
|
||||
Radius : constant Float := Float (int'Min (Width, Height));
|
||||
R_1 : constant Float := 0.48 * Radius;
|
||||
R_2 : constant Float := 0.35 * Radius;
|
||||
R_3 : constant Float := 0.45 * Radius;
|
||||
R_4 : constant Float := 0.47 * Radius;
|
||||
Hour : constant Hour_Number := Formatting.Hour (Stamp, Offset);
|
||||
Minute : constant Minute_Number := Formatting.Minute (Stamp, Offset);
|
||||
Second : constant Second_Number := Formatting.Second (Stamp);
|
||||
|
||||
function To_X (A : Float; R : Float) return int is
|
||||
(Width / 2 + int (R * Sin (A, 60.0)));
|
||||
|
||||
function To_Y (A : Float; R : Float) return int is
|
||||
(Height / 2 - int (R * Cos (A, 60.0)));
|
||||
|
||||
begin
|
||||
SDL.Video.Renderers.Makers.Create (Renderer, Window.Get_Surface);
|
||||
Renderer.Set_Draw_Colour ((0, 0, 150, 255));
|
||||
Renderer.Fill (Rectangle => (0, 0, Width, Height));
|
||||
Renderer.Set_Draw_Colour ((200, 200, 200, 255));
|
||||
for A in 0 .. 59 loop
|
||||
Renderer.Fill (Rectangle => (To_X (Float (A), R_1) - Radi (A),
|
||||
To_Y (Float (A), R_1) - Radi (A), Diam (A), Diam (A)));
|
||||
end loop;
|
||||
Renderer.Set_Draw_Colour ((200, 200, 0, 255));
|
||||
Renderer.Draw (Line => ((Width / 2, Height / 2),
|
||||
(To_X (5.0 * (Float (Hour) + Float (Minute) / 60.0), R_2),
|
||||
To_Y (5.0 * (Float (Hour) + Float (Minute) / 60.0), R_2))));
|
||||
Renderer.Draw (Line => ((Width / 2, Height / 2),
|
||||
(To_X (Float (Minute) + Float (Second) / 60.0, R_3),
|
||||
To_Y (Float (Minute) + Float (Second) / 60.0, R_3))));
|
||||
Renderer.Set_Draw_Colour ((220, 0, 0, 255));
|
||||
Renderer.Draw (Line => ((Width / 2, Height / 2),
|
||||
(To_X (Float (Second), R_4),
|
||||
To_Y (Float (Second), R_4))));
|
||||
Renderer.Fill (Rectangle => (Width / 2 - 3, Height / 2 - 3, 7, 7));
|
||||
end Draw_Clock;
|
||||
|
||||
function Poll_Quit return Boolean is
|
||||
use type SDL.Events.Event_Types;
|
||||
begin
|
||||
while SDL.Events.Events.Poll (Event) loop
|
||||
if Event.Common.Event_Type = SDL.Events.Quit then
|
||||
return True;
|
||||
end if;
|
||||
end loop;
|
||||
return False;
|
||||
end Poll_Quit;
|
||||
|
||||
begin
|
||||
Offset := Time_Zones.UTC_Time_Offset;
|
||||
|
||||
if not SDL.Initialise (Flags => SDL.Enable_Screen) then
|
||||
return;
|
||||
end if;
|
||||
|
||||
SDL.Video.Windows.Makers.Create (Win => Window,
|
||||
Title => "Draw a clock",
|
||||
Position => SDL.Natural_Coordinates'(X => 10, Y => 10),
|
||||
Size => SDL.Positive_Sizes'(300, 300),
|
||||
Flags => SDL.Video.Windows.Resizable);
|
||||
loop
|
||||
Draw_Clock (Clock);
|
||||
Window.Update_Surface;
|
||||
delay 0.200;
|
||||
exit when Poll_Quit;
|
||||
end loop;
|
||||
|
||||
Window.Finalize;
|
||||
SDL.Finalise;
|
||||
end Draw_A_Clock;
|
||||
|
|
@ -7,7 +7,7 @@ title Sample Batch Clock
|
|||
setlocal enabledelayedexpansion
|
||||
chcp 65001
|
||||
|
||||
::Set the characters...
|
||||
::Set the characters...
|
||||
set "#0_1=█████"
|
||||
set "#0_2=█ █"
|
||||
set "#0_3=█ █"
|
||||
|
|
@ -75,26 +75,26 @@ set "#C_4=█"
|
|||
set "#C_5= "
|
||||
|
||||
:clock_loop
|
||||
::Clear display [leaving a whitespace]...
|
||||
::Clear display [leaving a whitespace]...
|
||||
for /l %%C in (1,1,5) do set "display%%C= "
|
||||
|
||||
::Get current time [all spaces will be replaced to zero]...
|
||||
::Also, all colons will be replaced to "C" because colon has a function in variables...
|
||||
::Get current time [all spaces will be replaced to zero]...
|
||||
::Also, all colons will be replaced to "C" because colon has a function in variables...
|
||||
set "curr_time=%time: =0%"
|
||||
set "curr_time=%curr_time::=C%"
|
||||
|
||||
::Process the numbers to display [we will now use the formats we SET above]...
|
||||
::Process the numbers to display [we will now use the formats we SET above]...
|
||||
for /l %%T in (0,1,7) do (
|
||||
::Check for each number and colons...
|
||||
for %%N in (0 1 2 3 4 5 6 7 8 9 C) do (
|
||||
if "!curr_time:~%%T,1!"=="%%N" (
|
||||
::Now, barbeque each formatted char in 5 rows...
|
||||
for /l %%D in (1,1,5) do set "display%%D=!display%%D!!#%%N_%%D! "
|
||||
)
|
||||
)
|
||||
::Check for each number and colons...
|
||||
for %%N in (0 1 2 3 4 5 6 7 8 9 C) do (
|
||||
if "!curr_time:~%%T,1!"=="%%N" (
|
||||
::Now, barbeque each formatted char in 5 rows...
|
||||
for /l %%D in (1,1,5) do set "display%%D=!display%%D!!#%%N_%%D! "
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
::Refresh the clock...
|
||||
::Refresh the clock...
|
||||
cls
|
||||
echo.
|
||||
echo.[%display1%]
|
||||
|
|
|
|||
|
|
@ -19,15 +19,15 @@ public:
|
|||
void set( int a, int b ) { x = a; y = b; }
|
||||
void rotate( float angle_r )
|
||||
{
|
||||
float _x = static_cast<float>( x ),
|
||||
_y = static_cast<float>( y ),
|
||||
s = sinf( angle_r ),
|
||||
c = cosf( angle_r ),
|
||||
a = _x * c - _y * s,
|
||||
b = _x * s + _y * c;
|
||||
float _x = static_cast<float>( x ),
|
||||
_y = static_cast<float>( y ),
|
||||
s = sinf( angle_r ),
|
||||
c = cosf( angle_r ),
|
||||
a = _x * c - _y * s,
|
||||
b = _x * s + _y * c;
|
||||
|
||||
x = static_cast<int>( a );
|
||||
y = static_cast<int>( b );
|
||||
x = static_cast<int>( a );
|
||||
y = static_cast<int>( b );
|
||||
}
|
||||
int x, y;
|
||||
};
|
||||
|
|
@ -38,94 +38,94 @@ public:
|
|||
myBitmap() : pen( NULL ), brush( NULL ), clr( 0 ), wid( 1 ) {}
|
||||
~myBitmap()
|
||||
{
|
||||
DeleteObject( pen );
|
||||
DeleteObject( brush );
|
||||
DeleteDC( hdc );
|
||||
DeleteObject( bmp );
|
||||
DeleteObject( pen );
|
||||
DeleteObject( brush );
|
||||
DeleteDC( hdc );
|
||||
DeleteObject( bmp );
|
||||
}
|
||||
|
||||
bool create( int w, int h )
|
||||
{
|
||||
BITMAPINFO bi;
|
||||
ZeroMemory( &bi, sizeof( bi ) );
|
||||
bi.bmiHeader.biSize = sizeof( bi.bmiHeader );
|
||||
bi.bmiHeader.biBitCount = sizeof( DWORD ) * 8;
|
||||
bi.bmiHeader.biCompression = BI_RGB;
|
||||
bi.bmiHeader.biPlanes = 1;
|
||||
bi.bmiHeader.biWidth = w;
|
||||
bi.bmiHeader.biHeight = -h;
|
||||
BITMAPINFO bi;
|
||||
ZeroMemory( &bi, sizeof( bi ) );
|
||||
bi.bmiHeader.biSize = sizeof( bi.bmiHeader );
|
||||
bi.bmiHeader.biBitCount = sizeof( DWORD ) * 8;
|
||||
bi.bmiHeader.biCompression = BI_RGB;
|
||||
bi.bmiHeader.biPlanes = 1;
|
||||
bi.bmiHeader.biWidth = w;
|
||||
bi.bmiHeader.biHeight = -h;
|
||||
|
||||
HDC dc = GetDC( GetConsoleWindow() );
|
||||
bmp = CreateDIBSection( dc, &bi, DIB_RGB_COLORS, &pBits, NULL, 0 );
|
||||
if( !bmp ) return false;
|
||||
HDC dc = GetDC( GetConsoleWindow() );
|
||||
bmp = CreateDIBSection( dc, &bi, DIB_RGB_COLORS, &pBits, NULL, 0 );
|
||||
if( !bmp ) return false;
|
||||
|
||||
hdc = CreateCompatibleDC( dc );
|
||||
SelectObject( hdc, bmp );
|
||||
ReleaseDC( GetConsoleWindow(), dc );
|
||||
hdc = CreateCompatibleDC( dc );
|
||||
SelectObject( hdc, bmp );
|
||||
ReleaseDC( GetConsoleWindow(), dc );
|
||||
|
||||
width = w; height = h;
|
||||
return true;
|
||||
width = w; height = h;
|
||||
return true;
|
||||
}
|
||||
|
||||
void clear( BYTE clr = 0 )
|
||||
{
|
||||
memset( pBits, clr, width * height * sizeof( DWORD ) );
|
||||
memset( pBits, clr, width * height * sizeof( DWORD ) );
|
||||
}
|
||||
|
||||
void setBrushColor( DWORD bClr )
|
||||
{
|
||||
if( brush ) DeleteObject( brush );
|
||||
brush = CreateSolidBrush( bClr );
|
||||
SelectObject( hdc, brush );
|
||||
if( brush ) DeleteObject( brush );
|
||||
brush = CreateSolidBrush( bClr );
|
||||
SelectObject( hdc, brush );
|
||||
}
|
||||
|
||||
void setPenColor( DWORD c )
|
||||
{
|
||||
clr = c;
|
||||
createPen();
|
||||
clr = c;
|
||||
createPen();
|
||||
}
|
||||
|
||||
void setPenWidth( int w )
|
||||
{
|
||||
wid = w;
|
||||
createPen();
|
||||
wid = w;
|
||||
createPen();
|
||||
}
|
||||
|
||||
void saveBitmap( string path )
|
||||
{
|
||||
BITMAPFILEHEADER fileheader;
|
||||
BITMAPINFO infoheader;
|
||||
BITMAP bitmap;
|
||||
DWORD wb;
|
||||
BITMAPFILEHEADER fileheader;
|
||||
BITMAPINFO infoheader;
|
||||
BITMAP bitmap;
|
||||
DWORD wb;
|
||||
|
||||
GetObject( bmp, sizeof( bitmap ), &bitmap );
|
||||
DWORD* dwpBits = new DWORD[bitmap.bmWidth * bitmap.bmHeight];
|
||||
|
||||
GetObject( bmp, sizeof( bitmap ), &bitmap );
|
||||
DWORD* dwpBits = new DWORD[bitmap.bmWidth * bitmap.bmHeight];
|
||||
|
||||
ZeroMemory( dwpBits, bitmap.bmWidth * bitmap.bmHeight * sizeof( DWORD ) );
|
||||
ZeroMemory( &infoheader, sizeof( BITMAPINFO ) );
|
||||
ZeroMemory( &fileheader, sizeof( BITMAPFILEHEADER ) );
|
||||
ZeroMemory( &infoheader, sizeof( BITMAPINFO ) );
|
||||
ZeroMemory( &fileheader, sizeof( BITMAPFILEHEADER ) );
|
||||
|
||||
infoheader.bmiHeader.biBitCount = sizeof( DWORD ) * 8;
|
||||
infoheader.bmiHeader.biCompression = BI_RGB;
|
||||
infoheader.bmiHeader.biPlanes = 1;
|
||||
infoheader.bmiHeader.biSize = sizeof( infoheader.bmiHeader );
|
||||
infoheader.bmiHeader.biHeight = bitmap.bmHeight;
|
||||
infoheader.bmiHeader.biWidth = bitmap.bmWidth;
|
||||
infoheader.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * sizeof( DWORD );
|
||||
infoheader.bmiHeader.biBitCount = sizeof( DWORD ) * 8;
|
||||
infoheader.bmiHeader.biCompression = BI_RGB;
|
||||
infoheader.bmiHeader.biPlanes = 1;
|
||||
infoheader.bmiHeader.biSize = sizeof( infoheader.bmiHeader );
|
||||
infoheader.bmiHeader.biHeight = bitmap.bmHeight;
|
||||
infoheader.bmiHeader.biWidth = bitmap.bmWidth;
|
||||
infoheader.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * sizeof( DWORD );
|
||||
|
||||
fileheader.bfType = 0x4D42;
|
||||
fileheader.bfOffBits = sizeof( infoheader.bmiHeader ) + sizeof( BITMAPFILEHEADER );
|
||||
fileheader.bfSize = fileheader.bfOffBits + infoheader.bmiHeader.biSizeImage;
|
||||
fileheader.bfType = 0x4D42;
|
||||
fileheader.bfOffBits = sizeof( infoheader.bmiHeader ) + sizeof( BITMAPFILEHEADER );
|
||||
fileheader.bfSize = fileheader.bfOffBits + infoheader.bmiHeader.biSizeImage;
|
||||
|
||||
GetDIBits( hdc, bmp, 0, height, ( LPVOID )dwpBits, &infoheader, DIB_RGB_COLORS );
|
||||
GetDIBits( hdc, bmp, 0, height, ( LPVOID )dwpBits, &infoheader, DIB_RGB_COLORS );
|
||||
|
||||
HANDLE file = CreateFile( path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
||||
WriteFile( file, &fileheader, sizeof( BITMAPFILEHEADER ), &wb, NULL );
|
||||
WriteFile( file, &infoheader.bmiHeader, sizeof( infoheader.bmiHeader ), &wb, NULL );
|
||||
WriteFile( file, dwpBits, bitmap.bmWidth * bitmap.bmHeight * 4, &wb, NULL );
|
||||
CloseHandle( file );
|
||||
HANDLE file = CreateFile( path.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
||||
WriteFile( file, &fileheader, sizeof( BITMAPFILEHEADER ), &wb, NULL );
|
||||
WriteFile( file, &infoheader.bmiHeader, sizeof( infoheader.bmiHeader ), &wb, NULL );
|
||||
WriteFile( file, dwpBits, bitmap.bmWidth * bitmap.bmHeight * 4, &wb, NULL );
|
||||
CloseHandle( file );
|
||||
|
||||
delete [] dwpBits;
|
||||
delete [] dwpBits;
|
||||
}
|
||||
|
||||
HDC getDC() const { return hdc; }
|
||||
|
|
@ -135,9 +135,9 @@ public:
|
|||
private:
|
||||
void createPen()
|
||||
{
|
||||
if( pen ) DeleteObject( pen );
|
||||
pen = CreatePen( PS_SOLID, wid, clr );
|
||||
SelectObject( hdc, pen );
|
||||
if( pen ) DeleteObject( pen );
|
||||
pen = CreatePen( PS_SOLID, wid, clr );
|
||||
SelectObject( hdc, pen );
|
||||
}
|
||||
|
||||
HBITMAP bmp;
|
||||
|
|
@ -154,16 +154,16 @@ class clock
|
|||
public:
|
||||
clock()
|
||||
{
|
||||
_bmp.create( BMP_SIZE, BMP_SIZE );
|
||||
_bmp.clear( 100 );
|
||||
_bmp.setPenWidth( 2 );
|
||||
_ang = DegToRadian( 6 );
|
||||
_bmp.create( BMP_SIZE, BMP_SIZE );
|
||||
_bmp.clear( 100 );
|
||||
_bmp.setPenWidth( 2 );
|
||||
_ang = DegToRadian( 6 );
|
||||
}
|
||||
|
||||
|
||||
void setNow()
|
||||
{
|
||||
GetLocalTime( &_sysTime );
|
||||
draw();
|
||||
GetLocalTime( &_sysTime );
|
||||
draw();
|
||||
}
|
||||
|
||||
float DegToRadian( float degree ) { return degree * ( PI / 180.0f ); }
|
||||
|
|
@ -173,70 +173,70 @@ public:
|
|||
private:
|
||||
void drawTicks( HDC dc )
|
||||
{
|
||||
vector2 line;
|
||||
_bmp.setPenWidth( 1 );
|
||||
for( int x = 0; x < 60; x++ )
|
||||
{
|
||||
line.set( 0, 50 );
|
||||
line.rotate( static_cast<float>( x + 30 ) * _ang );
|
||||
MoveToEx( dc, CENTER - static_cast<int>( 2.5f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.5f * static_cast<float>( line.y ) ), NULL );
|
||||
LineTo( dc, CENTER - static_cast<int>( 2.81f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.81f * static_cast<float>( line.y ) ) );
|
||||
}
|
||||
vector2 line;
|
||||
_bmp.setPenWidth( 1 );
|
||||
for( int x = 0; x < 60; x++ )
|
||||
{
|
||||
line.set( 0, 50 );
|
||||
line.rotate( static_cast<float>( x + 30 ) * _ang );
|
||||
MoveToEx( dc, CENTER - static_cast<int>( 2.5f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.5f * static_cast<float>( line.y ) ), NULL );
|
||||
LineTo( dc, CENTER - static_cast<int>( 2.81f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.81f * static_cast<float>( line.y ) ) );
|
||||
}
|
||||
|
||||
_bmp.setPenWidth( 3 );
|
||||
for( int x = 0; x < 60; x += 5 )
|
||||
{
|
||||
line.set( 0, 50 );
|
||||
line.rotate( static_cast<float>( x + 30 ) * _ang );
|
||||
MoveToEx( dc, CENTER - static_cast<int>( 2.5f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.5f * static_cast<float>( line.y ) ), NULL );
|
||||
LineTo( dc, CENTER - static_cast<int>( 2.81f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.81f * static_cast<float>( line.y ) ) );
|
||||
}
|
||||
_bmp.setPenWidth( 3 );
|
||||
for( int x = 0; x < 60; x += 5 )
|
||||
{
|
||||
line.set( 0, 50 );
|
||||
line.rotate( static_cast<float>( x + 30 ) * _ang );
|
||||
MoveToEx( dc, CENTER - static_cast<int>( 2.5f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.5f * static_cast<float>( line.y ) ), NULL );
|
||||
LineTo( dc, CENTER - static_cast<int>( 2.81f * static_cast<float>( line.x ) ), CENTER - static_cast<int>( 2.81f * static_cast<float>( line.y ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
void drawHands( HDC dc )
|
||||
{
|
||||
float hp = DegToRadian( ( 30.0f * static_cast<float>( _sysTime.wMinute ) ) / 60.0f );
|
||||
int h = ( _sysTime.wHour > 12 ? _sysTime.wHour - 12 : _sysTime.wHour ) * 5;
|
||||
|
||||
_bmp.setPenWidth( 3 );
|
||||
_bmp.setPenColor( RGB( 0, 0, 255 ) );
|
||||
drawHand( dc, HOUR_LEN, ( _ang * static_cast<float>( 30 + h ) ) + hp );
|
||||
float hp = DegToRadian( ( 30.0f * static_cast<float>( _sysTime.wMinute ) ) / 60.0f );
|
||||
int h = ( _sysTime.wHour > 12 ? _sysTime.wHour - 12 : _sysTime.wHour ) * 5;
|
||||
|
||||
_bmp.setPenColor( RGB( 0, 128, 0 ) );
|
||||
drawHand( dc, MIN_LEN, _ang * static_cast<float>( 30 + _sysTime.wMinute ) );
|
||||
_bmp.setPenWidth( 3 );
|
||||
_bmp.setPenColor( RGB( 0, 0, 255 ) );
|
||||
drawHand( dc, HOUR_LEN, ( _ang * static_cast<float>( 30 + h ) ) + hp );
|
||||
|
||||
_bmp.setPenWidth( 2 );
|
||||
_bmp.setPenColor( RGB( 255, 0, 0 ) );
|
||||
drawHand( dc, SEC_LEN, _ang * static_cast<float>( 30 + _sysTime.wSecond ) );
|
||||
_bmp.setPenColor( RGB( 0, 128, 0 ) );
|
||||
drawHand( dc, MIN_LEN, _ang * static_cast<float>( 30 + _sysTime.wMinute ) );
|
||||
|
||||
_bmp.setPenWidth( 2 );
|
||||
_bmp.setPenColor( RGB( 255, 0, 0 ) );
|
||||
drawHand( dc, SEC_LEN, _ang * static_cast<float>( 30 + _sysTime.wSecond ) );
|
||||
}
|
||||
|
||||
void drawHand( HDC dc, int len, float ang )
|
||||
{
|
||||
vector2 line;
|
||||
line.set( 0, len );
|
||||
line.rotate( ang );
|
||||
MoveToEx( dc, CENTER, CENTER, NULL );
|
||||
LineTo( dc, line.x + CENTER, line.y + CENTER );
|
||||
vector2 line;
|
||||
line.set( 0, len );
|
||||
line.rotate( ang );
|
||||
MoveToEx( dc, CENTER, CENTER, NULL );
|
||||
LineTo( dc, line.x + CENTER, line.y + CENTER );
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
HDC dc = _bmp.getDC();
|
||||
HDC dc = _bmp.getDC();
|
||||
|
||||
_bmp.setBrushColor( RGB( 250, 250, 250 ) );
|
||||
Ellipse( dc, 0, 0, BMP_SIZE, BMP_SIZE );
|
||||
_bmp.setBrushColor( RGB( 230, 230, 230 ) );
|
||||
Ellipse( dc, 10, 10, BMP_SIZE - 10, BMP_SIZE - 10 );
|
||||
_bmp.setBrushColor( RGB( 250, 250, 250 ) );
|
||||
Ellipse( dc, 0, 0, BMP_SIZE, BMP_SIZE );
|
||||
_bmp.setBrushColor( RGB( 230, 230, 230 ) );
|
||||
Ellipse( dc, 10, 10, BMP_SIZE - 10, BMP_SIZE - 10 );
|
||||
|
||||
drawTicks( dc );
|
||||
drawHands( dc );
|
||||
drawTicks( dc );
|
||||
drawHands( dc );
|
||||
|
||||
_bmp.setPenColor( 0 ); _bmp.setBrushColor( 0 );
|
||||
Ellipse( dc, CENTER - 5, CENTER - 5, CENTER + 5, CENTER + 5 );
|
||||
_bmp.setPenColor( 0 ); _bmp.setBrushColor( 0 );
|
||||
Ellipse( dc, CENTER - 5, CENTER - 5, CENTER + 5, CENTER + 5 );
|
||||
|
||||
_wdc = GetDC( _hwnd );
|
||||
BitBlt( _wdc, 0, 0, BMP_SIZE, BMP_SIZE, dc, 0, 0, SRCCOPY );
|
||||
ReleaseDC( _hwnd, _wdc );
|
||||
_wdc = GetDC( _hwnd );
|
||||
BitBlt( _wdc, 0, 0, BMP_SIZE, BMP_SIZE, dc, 0, 0, SRCCOPY );
|
||||
ReleaseDC( _hwnd, _wdc );
|
||||
}
|
||||
|
||||
myBitmap _bmp;
|
||||
|
|
@ -252,67 +252,67 @@ public:
|
|||
wnd() { _inst = this; }
|
||||
int wnd::Run( HINSTANCE hInst )
|
||||
{
|
||||
_hInst = hInst;
|
||||
_hwnd = InitAll();
|
||||
SetTimer( _hwnd, MY_TIMER, 1000, NULL );
|
||||
_clock.setHWND( _hwnd );
|
||||
_hInst = hInst;
|
||||
_hwnd = InitAll();
|
||||
SetTimer( _hwnd, MY_TIMER, 1000, NULL );
|
||||
_clock.setHWND( _hwnd );
|
||||
|
||||
ShowWindow( _hwnd, SW_SHOW );
|
||||
UpdateWindow( _hwnd );
|
||||
ShowWindow( _hwnd, SW_SHOW );
|
||||
UpdateWindow( _hwnd );
|
||||
|
||||
MSG msg;
|
||||
ZeroMemory( &msg, sizeof( msg ) );
|
||||
while( msg.message != WM_QUIT )
|
||||
{
|
||||
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) != 0 )
|
||||
{
|
||||
TranslateMessage( &msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
}
|
||||
return UnregisterClass( "_MY_CLOCK_", _hInst );
|
||||
MSG msg;
|
||||
ZeroMemory( &msg, sizeof( msg ) );
|
||||
while( msg.message != WM_QUIT )
|
||||
{
|
||||
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) != 0 )
|
||||
{
|
||||
TranslateMessage( &msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
}
|
||||
return UnregisterClass( "_MY_CLOCK_", _hInst );
|
||||
}
|
||||
private:
|
||||
void wnd::doPaint( HDC dc ) { _clock.setNow(); }
|
||||
void wnd::doTimer() { _clock.setNow(); }
|
||||
static int WINAPI wnd::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
switch( msg )
|
||||
{
|
||||
case WM_DESTROY: PostQuitMessage( 0 ); break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC dc = BeginPaint( hWnd, &ps );
|
||||
_inst->doPaint( dc );
|
||||
EndPaint( hWnd, &ps );
|
||||
return 0;
|
||||
}
|
||||
case WM_TIMER: _inst->doTimer(); break;
|
||||
default:
|
||||
return DefWindowProc( hWnd, msg, wParam, lParam );
|
||||
}
|
||||
return 0;
|
||||
switch( msg )
|
||||
{
|
||||
case WM_DESTROY: PostQuitMessage( 0 ); break;
|
||||
case WM_PAINT:
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC dc = BeginPaint( hWnd, &ps );
|
||||
_inst->doPaint( dc );
|
||||
EndPaint( hWnd, &ps );
|
||||
return 0;
|
||||
}
|
||||
case WM_TIMER: _inst->doTimer(); break;
|
||||
default:
|
||||
return DefWindowProc( hWnd, msg, wParam, lParam );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
HWND InitAll()
|
||||
{
|
||||
WNDCLASSEX wcex;
|
||||
ZeroMemory( &wcex, sizeof( wcex ) );
|
||||
wcex.cbSize = sizeof( WNDCLASSEX );
|
||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wcex.lpfnWndProc = ( WNDPROC )WndProc;
|
||||
wcex.hInstance = _hInst;
|
||||
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
|
||||
wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
|
||||
wcex.lpszClassName = "_MY_CLOCK_";
|
||||
WNDCLASSEX wcex;
|
||||
ZeroMemory( &wcex, sizeof( wcex ) );
|
||||
wcex.cbSize = sizeof( WNDCLASSEX );
|
||||
wcex.style = CS_HREDRAW | CS_VREDRAW;
|
||||
wcex.lpfnWndProc = ( WNDPROC )WndProc;
|
||||
wcex.hInstance = _hInst;
|
||||
wcex.hCursor = LoadCursor( NULL, IDC_ARROW );
|
||||
wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
|
||||
wcex.lpszClassName = "_MY_CLOCK_";
|
||||
|
||||
RegisterClassEx( &wcex );
|
||||
RegisterClassEx( &wcex );
|
||||
|
||||
RECT rc = { 0, 0, BMP_SIZE, BMP_SIZE };
|
||||
AdjustWindowRect( &rc, WS_SYSMENU | WS_CAPTION, FALSE );
|
||||
int w = rc.right - rc.left, h = rc.bottom - rc.top;
|
||||
return CreateWindow( "_MY_CLOCK_", ".: Clock -- PJorente :.", WS_SYSMENU, CW_USEDEFAULT, 0, w, h, NULL, NULL, _hInst, NULL );
|
||||
RECT rc = { 0, 0, BMP_SIZE, BMP_SIZE };
|
||||
AdjustWindowRect( &rc, WS_SYSMENU | WS_CAPTION, FALSE );
|
||||
int w = rc.right - rc.left, h = rc.bottom - rc.top;
|
||||
return CreateWindow( "_MY_CLOCK_", ".: Clock -- PJorente :.", WS_SYSMENU, CW_USEDEFAULT, 0, w, h, NULL, NULL, _hInst, NULL );
|
||||
}
|
||||
|
||||
static wnd* _inst;
|
||||
|
|
|
|||
|
|
@ -9,85 +9,85 @@ const char * shades = " .:-*ca&#%@";
|
|||
|
||||
/* distance of (x, y) from line segment (0, 0)->(x0, y0) */
|
||||
double dist(double x, double y, double x0, double y0) {
|
||||
double l = (x * x0 + y * y0) / (x0 * x0 + y0 * y0);
|
||||
double l = (x * x0 + y * y0) / (x0 * x0 + y0 * y0);
|
||||
|
||||
if (l > 1) {
|
||||
x -= x0;
|
||||
y -= y0;
|
||||
} else if (l >= 0) {
|
||||
x -= l * x0;
|
||||
y -= l * y0;
|
||||
}
|
||||
return sqrt(x * x + y * y);
|
||||
if (l > 1) {
|
||||
x -= x0;
|
||||
y -= y0;
|
||||
} else if (l >= 0) {
|
||||
x -= l * x0;
|
||||
y -= l * y0;
|
||||
}
|
||||
return sqrt(x * x + y * y);
|
||||
}
|
||||
|
||||
enum { sec = 0, min, hur }; // for subscripts
|
||||
|
||||
void draw(int size)
|
||||
{
|
||||
# define for_i for(int i = 0; i < size; i++)
|
||||
# define for_j for(int j = 0; j < size * 2; j++)
|
||||
# define for_i for(int i = 0; i < size; i++)
|
||||
# define for_j for(int j = 0; j < size * 2; j++)
|
||||
|
||||
double angle, cx = size / 2.;
|
||||
double sx[3], sy[3], sw[3];
|
||||
double fade[] = { 1, .35, .35 }; /* opacity of each arm */
|
||||
struct timeval tv;
|
||||
struct tm *t;
|
||||
double angle, cx = size / 2.;
|
||||
double sx[3], sy[3], sw[3];
|
||||
double fade[] = { 1, .35, .35 }; /* opacity of each arm */
|
||||
struct timeval tv;
|
||||
struct tm *t;
|
||||
|
||||
/* set width of each arm */
|
||||
sw[sec] = size * .02;
|
||||
sw[min] = size * .03;
|
||||
sw[hur] = size * .05;
|
||||
/* set width of each arm */
|
||||
sw[sec] = size * .02;
|
||||
sw[min] = size * .03;
|
||||
sw[hur] = size * .05;
|
||||
|
||||
every_second:
|
||||
gettimeofday(&tv, 0);
|
||||
t = localtime(&tv.tv_sec);
|
||||
gettimeofday(&tv, 0);
|
||||
t = localtime(&tv.tv_sec);
|
||||
|
||||
angle = t->tm_sec * PI / 30;
|
||||
sy[sec] = -cx * cos(angle);
|
||||
sx[sec] = cx * sin(angle);
|
||||
angle = t->tm_sec * PI / 30;
|
||||
sy[sec] = -cx * cos(angle);
|
||||
sx[sec] = cx * sin(angle);
|
||||
|
||||
angle = (t->tm_min + t->tm_sec / 60.) / 30 * PI;
|
||||
sy[min] = -cx * cos(angle) * .8;
|
||||
sx[min] = cx * sin(angle) * .8;
|
||||
angle = (t->tm_min + t->tm_sec / 60.) / 30 * PI;
|
||||
sy[min] = -cx * cos(angle) * .8;
|
||||
sx[min] = cx * sin(angle) * .8;
|
||||
|
||||
angle = (t->tm_hour + t->tm_min / 60.) / 6 * PI;
|
||||
sy[hur] = -cx * cos(angle) * .6;
|
||||
sx[hur] = cx * sin(angle) * .6;
|
||||
angle = (t->tm_hour + t->tm_min / 60.) / 6 * PI;
|
||||
sy[hur] = -cx * cos(angle) * .6;
|
||||
sx[hur] = cx * sin(angle) * .6;
|
||||
|
||||
printf("\033[s"); /* save cursor position */
|
||||
for_i {
|
||||
printf("\033[%d;0H", i); /* goto row i, col 0 */
|
||||
double y = i - cx;
|
||||
for_j {
|
||||
double x = (j - 2 * cx) / 2;
|
||||
printf("\033[s"); /* save cursor position */
|
||||
for_i {
|
||||
printf("\033[%d;0H", i); /* goto row i, col 0 */
|
||||
double y = i - cx;
|
||||
for_j {
|
||||
double x = (j - 2 * cx) / 2;
|
||||
|
||||
int pix = 0;
|
||||
/* calcs how far the "pixel" is from each arm and set
|
||||
* shade, with some anti-aliasing. It's ghetto, but much
|
||||
* easier than a real scanline conversion.
|
||||
*/
|
||||
for (int k = hur; k >= sec; k--) {
|
||||
double d = dist(x, y, sx[k], sy[k]);
|
||||
if (d < sw[k] - .5)
|
||||
pix = 10 * fade[k];
|
||||
else if (d < sw[k] + .5)
|
||||
pix = (5 + (sw[k] - d) * 10) * fade[k];
|
||||
}
|
||||
putchar(shades[pix]);
|
||||
}
|
||||
}
|
||||
printf("\033[u"); /* restore cursor pos so you can bg the job -- value unclear */
|
||||
int pix = 0;
|
||||
/* calcs how far the "pixel" is from each arm and set
|
||||
* shade, with some anti-aliasing. It's ghetto, but much
|
||||
* easier than a real scanline conversion.
|
||||
*/
|
||||
for (int k = hur; k >= sec; k--) {
|
||||
double d = dist(x, y, sx[k], sy[k]);
|
||||
if (d < sw[k] - .5)
|
||||
pix = 10 * fade[k];
|
||||
else if (d < sw[k] + .5)
|
||||
pix = (5 + (sw[k] - d) * 10) * fade[k];
|
||||
}
|
||||
putchar(shades[pix]);
|
||||
}
|
||||
}
|
||||
printf("\033[u"); /* restore cursor pos so you can bg the job -- value unclear */
|
||||
|
||||
fflush(stdout);
|
||||
sleep(1); /* sleep 1 can at times miss a second, but will catch up next update */
|
||||
goto every_second;
|
||||
fflush(stdout);
|
||||
sleep(1); /* sleep 1 can at times miss a second, but will catch up next update */
|
||||
goto every_second;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int s;
|
||||
if (argc <= 1 || (s = atoi(argv[1])) <= 0) s = 20;
|
||||
draw(s);
|
||||
return 0;
|
||||
int s;
|
||||
if (argc <= 1 || (s = atoi(argv[1])) <= 0) s = 20;
|
||||
draw(s);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,12 +3,12 @@ startshape START
|
|||
TIME_IN_SECONDS = 60
|
||||
|
||||
shape START {
|
||||
SECOND_HAND[r (TIME_IN_SECONDS*-6)]
|
||||
CIRCLE[s 50 50]
|
||||
SECOND_HAND[r (TIME_IN_SECONDS*-6)]
|
||||
CIRCLE[s 50 50]
|
||||
}
|
||||
|
||||
|
||||
shape SECOND_HAND
|
||||
{
|
||||
TRIANGLE [[z 1 s 1 30 y 0.26 b 1]]
|
||||
TRIANGLE [[z 1 s 1 30 y 0.26 b 1]]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,88 +1,88 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"golang.org/x/net/websocket"
|
||||
"flag"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"math"
|
||||
"net/http"
|
||||
"time"
|
||||
"golang.org/x/net/websocket"
|
||||
"flag"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"math"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
Portnum string
|
||||
Hostsite string
|
||||
Portnum string
|
||||
Hostsite string
|
||||
)
|
||||
|
||||
type PageSettings struct {
|
||||
Host string
|
||||
Port string
|
||||
Host string
|
||||
Port string
|
||||
}
|
||||
|
||||
const (
|
||||
Canvaswidth = 512
|
||||
Canvasheight = 512
|
||||
//color constants
|
||||
HourColor = "#ff7373" // pinkish
|
||||
MinuteColor = "#00b7e4" //light blue
|
||||
SecondColor = "#b58900" //gold
|
||||
Canvaswidth = 512
|
||||
Canvasheight = 512
|
||||
//color constants
|
||||
HourColor = "#ff7373" // pinkish
|
||||
MinuteColor = "#00b7e4" //light blue
|
||||
SecondColor = "#b58900" //gold
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.StringVar(&Portnum, "Port", "1234", "Port to host server.")
|
||||
flag.StringVar(&Hostsite, "Site", "localhost", "Site hosting server")
|
||||
flag.Parse()
|
||||
http.HandleFunc("/", webhandler)
|
||||
http.Handle("/ws", websocket.Handler(wshandle))
|
||||
err := http.ListenAndServe(Hostsite+":"+Portnum, nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
fmt.Println("server running")
|
||||
flag.StringVar(&Portnum, "Port", "1234", "Port to host server.")
|
||||
flag.StringVar(&Hostsite, "Site", "localhost", "Site hosting server")
|
||||
flag.Parse()
|
||||
http.HandleFunc("/", webhandler)
|
||||
http.Handle("/ws", websocket.Handler(wshandle))
|
||||
err := http.ListenAndServe(Hostsite+":"+Portnum, nil)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
fmt.Println("server running")
|
||||
}
|
||||
|
||||
func webhandler(w http.ResponseWriter, r *http.Request) {
|
||||
wsurl := PageSettings{Host: Hostsite, Port: Portnum}
|
||||
template, _ := template.ParseFiles("clock.html")
|
||||
template.Execute(w, wsurl)
|
||||
wsurl := PageSettings{Host: Hostsite, Port: Portnum}
|
||||
template, _ := template.ParseFiles("clock.html")
|
||||
template.Execute(w, wsurl)
|
||||
}
|
||||
|
||||
//Given a websocket connection,
|
||||
//serves updating time function
|
||||
func wshandle(ws *websocket.Conn) {
|
||||
for {
|
||||
hour, min, sec := time.Now().Clock()
|
||||
hourx, houry := HourCords(hour, Canvasheight/2)
|
||||
minx, miny := MinSecCords(min, Canvasheight/2)
|
||||
secx, secy := MinSecCords(sec, Canvasheight/2)
|
||||
msg := "CLEAR\n"
|
||||
msg += fmt.Sprintf("HOUR %d %d %s\n", hourx, houry, HourColor)
|
||||
msg += fmt.Sprintf("MIN %d %d %s\n", minx, miny, MinuteColor)
|
||||
msg += fmt.Sprintf("SEC %d %d %s", secx, secy, SecondColor)
|
||||
io.WriteString(ws, msg)
|
||||
time.Sleep(time.Second / 60.0)
|
||||
}
|
||||
for {
|
||||
hour, min, sec := time.Now().Clock()
|
||||
hourx, houry := HourCords(hour, Canvasheight/2)
|
||||
minx, miny := MinSecCords(min, Canvasheight/2)
|
||||
secx, secy := MinSecCords(sec, Canvasheight/2)
|
||||
msg := "CLEAR\n"
|
||||
msg += fmt.Sprintf("HOUR %d %d %s\n", hourx, houry, HourColor)
|
||||
msg += fmt.Sprintf("MIN %d %d %s\n", minx, miny, MinuteColor)
|
||||
msg += fmt.Sprintf("SEC %d %d %s", secx, secy, SecondColor)
|
||||
io.WriteString(ws, msg)
|
||||
time.Sleep(time.Second / 60.0)
|
||||
}
|
||||
}
|
||||
|
||||
//Given current minute or second time(i.e 30 min, 60 minutes)
|
||||
//and the radius, returns pair of cords to draw line to
|
||||
func MinSecCords(ctime int, radius int) (int, int) {
|
||||
//converts min/sec to angle and then to radians
|
||||
//converts min/sec to angle and then to radians
|
||||
|
||||
theta := ((float64(ctime)*6 - 90) * (math.Pi / 180))
|
||||
x := float64(radius) * math.Cos(theta)
|
||||
y := float64(radius) * math.Sin(theta)
|
||||
return int(x) + 256, int(y) + 256
|
||||
theta := ((float64(ctime)*6 - 90) * (math.Pi / 180))
|
||||
x := float64(radius) * math.Cos(theta)
|
||||
y := float64(radius) * math.Sin(theta)
|
||||
return int(x) + 256, int(y) + 256
|
||||
}
|
||||
|
||||
//Given current hour time(i.e. 12, 8) and the radius,
|
||||
//returns pair of cords to draw line to
|
||||
func HourCords(ctime int, radius int) (int, int) {
|
||||
//converts hours to angle and then to radians
|
||||
theta := ((float64(ctime)*30 - 90) * (math.Pi / 180))
|
||||
x := float64(radius) * math.Cos(theta)
|
||||
y := float64(radius) * math.Sin(theta)
|
||||
return int(x) + 256, int(y) + 256
|
||||
//converts hours to angle and then to radians
|
||||
theta := ((float64(ctime)*30 - 90) * (math.Pi / 180))
|
||||
x := float64(radius) * math.Cos(theta)
|
||||
y := float64(radius) * math.Sin(theta)
|
||||
return int(x) + 256, int(y) + 256
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,10 +10,10 @@
|
|||
var hourhand;
|
||||
function wsConnect()
|
||||
{
|
||||
//get contexts for drawing
|
||||
//get contexts for drawing
|
||||
//var canvas = document.getElementById( "canvas" );
|
||||
//ctx = canvas.getContext( '2d' );
|
||||
var canvas = document.getElementById("rim");
|
||||
var canvas = document.getElementById("rim");
|
||||
//draw circle for rim
|
||||
rim = canvas.getContext('2d');
|
||||
rim.beginPath();
|
||||
|
|
@ -83,19 +83,19 @@
|
|||
|
||||
<body>
|
||||
<h2>Clock</h2>
|
||||
|
||||
|
||||
<canvas id="rim" width="512" height="512" style="position: absolute; left: 0; top: 0; z-index: 0;">
|
||||
Sorry, your browser does not support Canvas
|
||||
</canvas>
|
||||
<canvas id="hourhand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 1;">
|
||||
<canvas id="hourhand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 1;">
|
||||
Sorry, your browser does not support Canvas
|
||||
</canvas>
|
||||
<canvas id="minutehand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 2;">
|
||||
<canvas id="minutehand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 2;">
|
||||
Sorry, your browser does not support Canvas
|
||||
</canvas>
|
||||
<canvas id="secondhand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 3;">
|
||||
<canvas id="secondhand" width="512" height="512"style="position: absolute; left: 0; top: 0; z-index: 3;">
|
||||
Sorry, your browser does not support Canvas
|
||||
</canvas>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -1,47 +1,47 @@
|
|||
var sec_old = 0;
|
||||
function update_clock() {
|
||||
var t = new Date();
|
||||
var arms = [t.getHours(), t.getMinutes(), t.getSeconds()];
|
||||
if (arms[2] == sec_old) return;
|
||||
sec_old = arms[2];
|
||||
var t = new Date();
|
||||
var arms = [t.getHours(), t.getMinutes(), t.getSeconds()];
|
||||
if (arms[2] == sec_old) return;
|
||||
sec_old = arms[2];
|
||||
|
||||
var c = document.getElementById('clock');
|
||||
var ctx = c.getContext('2d');
|
||||
ctx.fillStyle = "rgb(0,200,200)";
|
||||
ctx.fillRect(0, 0, c.width, c.height);
|
||||
ctx.fillStyle = "white";
|
||||
ctx.fillRect(3, 3, c.width - 6, c.height - 6);
|
||||
ctx.lineCap = 'round';
|
||||
var c = document.getElementById('clock');
|
||||
var ctx = c.getContext('2d');
|
||||
ctx.fillStyle = "rgb(0,200,200)";
|
||||
ctx.fillRect(0, 0, c.width, c.height);
|
||||
ctx.fillStyle = "white";
|
||||
ctx.fillRect(3, 3, c.width - 6, c.height - 6);
|
||||
ctx.lineCap = 'round';
|
||||
|
||||
var orig = { x: c.width / 2, y: c.height / 2 };
|
||||
arms[1] += arms[2] / 60;
|
||||
arms[0] += arms[1] / 60;
|
||||
draw_arm(ctx, orig, arms[0] * 30, c.width/2.5 - 15, c.width / 20, "green");
|
||||
draw_arm(ctx, orig, arms[1] * 6, c.width/2.2 - 10, c.width / 30, "navy");
|
||||
draw_arm(ctx, orig, arms[2] * 6, c.width/2.0 - 6, c.width / 100, "maroon");
|
||||
var orig = { x: c.width / 2, y: c.height / 2 };
|
||||
arms[1] += arms[2] / 60;
|
||||
arms[0] += arms[1] / 60;
|
||||
draw_arm(ctx, orig, arms[0] * 30, c.width/2.5 - 15, c.width / 20, "green");
|
||||
draw_arm(ctx, orig, arms[1] * 6, c.width/2.2 - 10, c.width / 30, "navy");
|
||||
draw_arm(ctx, orig, arms[2] * 6, c.width/2.0 - 6, c.width / 100, "maroon");
|
||||
}
|
||||
|
||||
function draw_arm(ctx, orig, deg, len, w, style)
|
||||
{
|
||||
ctx.save();
|
||||
ctx.lineWidth = w;
|
||||
ctx.lineCap = 'round';
|
||||
ctx.translate(orig.x, orig.y);
|
||||
ctx.rotate((deg - 90) * Math.PI / 180);
|
||||
ctx.strokeStyle = style;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(-len / 10, 0);
|
||||
ctx.lineTo(len, 0);
|
||||
ctx.stroke();
|
||||
ctx.restore();
|
||||
ctx.save();
|
||||
ctx.lineWidth = w;
|
||||
ctx.lineCap = 'round';
|
||||
ctx.translate(orig.x, orig.y);
|
||||
ctx.rotate((deg - 90) * Math.PI / 180);
|
||||
ctx.strokeStyle = style;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(-len / 10, 0);
|
||||
ctx.lineTo(len, 0);
|
||||
ctx.stroke();
|
||||
ctx.restore();
|
||||
}
|
||||
|
||||
function init_clock() {
|
||||
var clock = document.createElement('canvas');
|
||||
clock.width = 100;
|
||||
clock.height = 100;
|
||||
clock.id = "clock";
|
||||
document.body.appendChild(clock);
|
||||
var clock = document.createElement('canvas');
|
||||
clock.width = 100;
|
||||
clock.height = 100;
|
||||
clock.id = "clock";
|
||||
document.body.appendChild(clock);
|
||||
|
||||
window.setInterval(update_clock, 200);
|
||||
window.setInterval(update_clock, 200);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,89 +5,89 @@ cls, 0
|
|||
window 6, window
|
||||
|
||||
Module Led_Clock{
|
||||
Escape Off
|
||||
Smooth off
|
||||
Dim D(-1 to 9)
|
||||
D(-1)=(0,0,0,0,0,0,0)
|
||||
D(0)=(1,1,1,0,1,1,1)
|
||||
D(1)=(0,0,1,0,0,1,0)
|
||||
D(2)=(1,0,1,1,1,0,1)
|
||||
D(3)=(1,0,1,1,0,1,1)
|
||||
D(4)=(0,1,1,1,0,1,0)
|
||||
D(5)=(1,1,0,1,0,1,1)
|
||||
D(6)=(1,1,0,1,1,1,1)
|
||||
D(7)=(1,0,1,0,0,1,0)
|
||||
D(8)=(1,1,1,1,1,1,1)
|
||||
D(9)=(1,1,1,1,0,1,1)
|
||||
N=240
|
||||
XX=(scale.x-N*75) div 2
|
||||
YY=scale.y-N*22
|
||||
NN=N
|
||||
BackColor=0
|
||||
CLS BackColor, 0
|
||||
Back {CLS BackColor,0}
|
||||
desktop 255, BackColor
|
||||
Forecolor=12
|
||||
C=BackColor-Forecolor
|
||||
pen BackColor
|
||||
for i=0 to 9: cc=d(i): cc*=c:next
|
||||
m=1
|
||||
move XX+N*23.2, YY+N*5.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*23.2,YY+N*13.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*49.2,YY+N*5.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*49.2,YY+N*13.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
dsk=True
|
||||
every 1000/2 {
|
||||
k=now
|
||||
k1=val(str$(k, "hh"))
|
||||
k2=val(str$(k, "nn"))
|
||||
k3=val(str$(k, "ss"))
|
||||
LED(XX, D(k1 div 10))
|
||||
LED(XX+N*12, D(k1 mod 10))
|
||||
LED(XX+N*26, D(k2 div 10))
|
||||
LED(XX+N*38, D(k2 mod 10))
|
||||
LED(XX+N*52, D(k3 div 10))
|
||||
LED(XX+N*64, D(k3 mod 10))
|
||||
refresh 1000
|
||||
if keypress(32) then
|
||||
dsk~
|
||||
if dsk then desktop 255 else desktop 255, BackColor
|
||||
end if
|
||||
if keypress(27) or mouse=2 then exit
|
||||
}
|
||||
desktop 255
|
||||
pen 14
|
||||
refresh 50
|
||||
mode 16
|
||||
wait 1000
|
||||
Escape On
|
||||
Escape Off
|
||||
Smooth off
|
||||
Dim D(-1 to 9)
|
||||
D(-1)=(0,0,0,0,0,0,0)
|
||||
D(0)=(1,1,1,0,1,1,1)
|
||||
D(1)=(0,0,1,0,0,1,0)
|
||||
D(2)=(1,0,1,1,1,0,1)
|
||||
D(3)=(1,0,1,1,0,1,1)
|
||||
D(4)=(0,1,1,1,0,1,0)
|
||||
D(5)=(1,1,0,1,0,1,1)
|
||||
D(6)=(1,1,0,1,1,1,1)
|
||||
D(7)=(1,0,1,0,0,1,0)
|
||||
D(8)=(1,1,1,1,1,1,1)
|
||||
D(9)=(1,1,1,1,0,1,1)
|
||||
N=240
|
||||
XX=(scale.x-N*75) div 2
|
||||
YY=scale.y-N*22
|
||||
NN=N
|
||||
BackColor=0
|
||||
CLS BackColor, 0
|
||||
Back {CLS BackColor,0}
|
||||
desktop 255, BackColor
|
||||
Forecolor=12
|
||||
C=BackColor-Forecolor
|
||||
pen BackColor
|
||||
for i=0 to 9: cc=d(i): cc*=c:next
|
||||
m=1
|
||||
move XX+N*23.2, YY+N*5.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*23.2,YY+N*13.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*49.2,YY+N*5.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
move XX+N*49.2,YY+N*13.2
|
||||
polygon BackColor-C, N,-N, N,N, -N, N, -N, -N
|
||||
dsk=True
|
||||
every 1000/2 {
|
||||
k=now
|
||||
k1=val(str$(k, "hh"))
|
||||
k2=val(str$(k, "nn"))
|
||||
k3=val(str$(k, "ss"))
|
||||
LED(XX, D(k1 div 10))
|
||||
LED(XX+N*12, D(k1 mod 10))
|
||||
LED(XX+N*26, D(k2 div 10))
|
||||
LED(XX+N*38, D(k2 mod 10))
|
||||
LED(XX+N*52, D(k3 div 10))
|
||||
LED(XX+N*64, D(k3 mod 10))
|
||||
refresh 1000
|
||||
if keypress(32) then
|
||||
dsk~
|
||||
if dsk then desktop 255 else desktop 255, BackColor
|
||||
end if
|
||||
if keypress(27) or mouse=2 then exit
|
||||
}
|
||||
desktop 255
|
||||
pen 14
|
||||
refresh 50
|
||||
mode 16
|
||||
wait 1000
|
||||
Escape On
|
||||
|
||||
sub LED(XX, S())
|
||||
move XX+N*1.2, YY+NN
|
||||
\\ LED - UPPER
|
||||
polygon BackColor-S(0), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
\\ LED | LEFT UPPER
|
||||
move XX+N*1.2-N*1.2, YY+N*1.2+NN
|
||||
polygon BackColor-S(1), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
move XX+N*1.2+N*7.2, YY+N*1.2+NN
|
||||
\\ LED | RIGHT UPPER
|
||||
polygon BackColor-S(2), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
move XX+N*1.2, YY+N*8.4+NN
|
||||
\\ LED - MIDDLE
|
||||
polygon BackColor-S(3), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
\\ LED | LEFT BOTTOM
|
||||
move XX+N*1.2-N*1.2, YY+N*9.6+NN
|
||||
polygon BackColor-S(4), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
\\ LED | RIGHT BOTTOM
|
||||
move XX+N*1.2+N*7.2, YY+N*9.6+NN
|
||||
polygon BackColor-S(5), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
\\ LED - BOTTOM
|
||||
move XX+N*1.2, YY+N*16.8+NN
|
||||
polygon BackColor-S(6), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
end sub
|
||||
sub LED(XX, S())
|
||||
move XX+N*1.2, YY+NN
|
||||
\\ LED - UPPER
|
||||
polygon BackColor-S(0), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
\\ LED | LEFT UPPER
|
||||
move XX+N*1.2-N*1.2, YY+N*1.2+NN
|
||||
polygon BackColor-S(1), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
move XX+N*1.2+N*7.2, YY+N*1.2+NN
|
||||
\\ LED | RIGHT UPPER
|
||||
polygon BackColor-S(2), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
move XX+N*1.2, YY+N*8.4+NN
|
||||
\\ LED - MIDDLE
|
||||
polygon BackColor-S(3), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
\\ LED | LEFT BOTTOM
|
||||
move XX+N*1.2-N*1.2, YY+N*9.6+NN
|
||||
polygon BackColor-S(4), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
\\ LED | RIGHT BOTTOM
|
||||
move XX+N*1.2+N*7.2, YY+N*9.6+NN
|
||||
polygon BackColor-S(5), N,-N,N,N,0,N*6,-N, N, -N, -N, 0, -N*6
|
||||
\\ LED - BOTTOM
|
||||
move XX+N*1.2, YY+N*16.8+NN
|
||||
polygon BackColor-S(6), N,-N,N*6,0, N,N, -N, N,-N*6,0, -N, -N
|
||||
end sub
|
||||
}
|
||||
Led_Clock
|
||||
|
|
|
|||
|
|
@ -21,6 +21,6 @@ display(4).sprites.push hand
|
|||
|
||||
// main loop
|
||||
while true
|
||||
hand.rotation = 90 - floor(time) % 60 * 6
|
||||
wait
|
||||
hand.rotation = 90 - floor(time) % 60 * 6
|
||||
wait
|
||||
end while
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
REM Series 3a and Series 5 use different modes. This version runs on Series 3a. For Series 5, remove the "2" in the gCLOCK line.
|
||||
|
||||
PROC main:
|
||||
gCLOCK ON,$29
|
||||
GET
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
use utf8; # interpret source code as UTF8
|
||||
binmode STDOUT, ':utf8'; # allow printing wide chars without warning
|
||||
$|++; # disable output buffering
|
||||
|
||||
my ($rows, $cols) = split /\s+/, `stty size`;
|
||||
my $x = int($rows / 2 - 1);
|
||||
my $y = int($cols / 2 - 16);
|
||||
|
||||
my @chars = map {[ /(...)/g ]}
|
||||
("┌─┐ ╷╶─┐╶─┐╷ ╷┌─╴┌─╴╶─┐┌─┐┌─┐ ",
|
||||
"│ │ │┌─┘╶─┤└─┤└─┐├─┐ │├─┤└─┤ : ",
|
||||
"└─┘ ╵└─╴╶─┘ ╵╶─┘└─┘ ╵└─┘╶─┘ ");
|
||||
|
||||
while (1) {
|
||||
my @indices = map { ord($_) - ord('0') } split //,
|
||||
sprintf("%02d:%02d:%02d", (localtime(time))[2,1,0]);
|
||||
|
||||
clear();
|
||||
for (0 .. $#chars) {
|
||||
position($x + $_, $y);
|
||||
print "@{$chars[$_]}[@indices]";
|
||||
}
|
||||
position(1, 1);
|
||||
|
||||
sleep 1;
|
||||
}
|
||||
|
||||
sub clear { print "\e[H\e[J" }
|
||||
sub position { printf "\e[%d;%dH", shift, shift }
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
Red [
|
||||
Needs: 'View
|
||||
Purpose: {simple analog clock based on Nenad Rakocevic's eve-clock.red,
|
||||
Needs: 'View
|
||||
Purpose: {simple analog clock based on Nenad Rakocevic's eve-clock.red,
|
||||
see http://www.red-lang.org/2016/07/eve-style-clock-demo-in-red-livecoded.html}
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
' --------------------------------------------
|
||||
' clock. I got nothing but time
|
||||
' ---------------------------------------------
|
||||
n = 12 ' num of points
|
||||
r = 95 ' radius
|
||||
pi = 22/7
|
||||
alpha = pi * 2 / n
|
||||
n = 12 ' num of points
|
||||
r = 95 ' radius
|
||||
pi = 22/7
|
||||
alpha = pi * 2 / n
|
||||
dim points(n)
|
||||
graphic #g2, 200, 200
|
||||
' --------------------------------------
|
||||
|
|
@ -22,58 +22,58 @@ graphic #g2, 200, 200
|
|||
#g2 place(90,185)
|
||||
#g2 "\6"
|
||||
for i = 0 to n - 1
|
||||
theta = alpha * i
|
||||
px = cos( theta ) * r
|
||||
py = sin( theta ) * r
|
||||
px = px + 100
|
||||
py = py + 100
|
||||
#g2 place(px,py)
|
||||
#g2 circle(2)
|
||||
theta = alpha * i
|
||||
px = cos( theta ) * r
|
||||
py = sin( theta ) * r
|
||||
px = px + 100
|
||||
py = py + 100
|
||||
#g2 place(px,py)
|
||||
#g2 circle(2)
|
||||
next i
|
||||
|
||||
[shoTime]
|
||||
' -------------------------
|
||||
' clear previous sec,min,hr
|
||||
' -------------------------
|
||||
r = 63
|
||||
p = se
|
||||
r = 63
|
||||
p = se
|
||||
#g2 color("white")
|
||||
gosub [h2Dot]
|
||||
r = 50
|
||||
p = mi
|
||||
r = 50
|
||||
p = mi
|
||||
#g2 color("white")
|
||||
gosub [h2Dot]
|
||||
r = 30 ' radius
|
||||
p = hr * 5
|
||||
r = 30 ' radius
|
||||
p = hr * 5
|
||||
#g2 color("white")
|
||||
gosub [h2Dot]
|
||||
|
||||
' -------------------------
|
||||
' Show new time
|
||||
' -------------------------
|
||||
a$ = time$()
|
||||
hr = val(word$(a$,1,":"))
|
||||
mi = val(word$(a$,2,":"))
|
||||
se = val(word$(a$,3,":"))
|
||||
a$ = time$()
|
||||
hr = val(word$(a$,1,":"))
|
||||
mi = val(word$(a$,2,":"))
|
||||
se = val(word$(a$,3,":"))
|
||||
|
||||
' put time on the clock - gimme a hand
|
||||
#g2 size(4)
|
||||
' second hand
|
||||
n = 60
|
||||
r = 63
|
||||
p = se
|
||||
n = 60
|
||||
r = 63
|
||||
p = se
|
||||
#g2 color("blue")
|
||||
gosub [h2Dot]
|
||||
|
||||
' minute hand
|
||||
r = 50
|
||||
p = mi
|
||||
r = 50
|
||||
p = mi
|
||||
#g2 color("green")
|
||||
gosub [h2Dot]
|
||||
|
||||
' hour hand
|
||||
r = 30 ' radius
|
||||
p = hr * 5
|
||||
r = 30 ' radius
|
||||
p = hr * 5
|
||||
#g2 color("red")
|
||||
gosub [h2Dot]
|
||||
|
||||
|
|
@ -82,13 +82,13 @@ end
|
|||
|
||||
' a one liner
|
||||
[h2Dot]
|
||||
alpha = pi * 2 / n
|
||||
i = p - 15
|
||||
theta = alpha * i
|
||||
px = cos( theta ) * r
|
||||
py = sin( theta ) * r
|
||||
px = px + 100
|
||||
py = py + 100
|
||||
alpha = pi * 2 / n
|
||||
i = p - 15
|
||||
theta = alpha * i
|
||||
px = cos( theta ) * r
|
||||
py = sin( theta ) * r
|
||||
px = px + 100
|
||||
py = py + 100
|
||||
#g2 place(px,py)
|
||||
#g2 circle(2)
|
||||
#g2 line(100,100,px,py)
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ proc updateClock t {
|
|||
set m [expr {$m + $s/60.0}]
|
||||
set h [expr {($h % 12 + $m/60.0) * 5}]
|
||||
foreach tag {hour minute second} value [list $h $m $s] len {50 80 80} {
|
||||
.c coords $tag 100 100 \
|
||||
[expr {100 + $len*sin($value/30.0*3.14159)}] \
|
||||
[expr {100 - $len*cos($value/30.0*3.14159)}]
|
||||
.c coords $tag 100 100 \
|
||||
[expr {100 + $len*sin($value/30.0*3.14159)}] \
|
||||
[expr {100 - $len*cos($value/30.0*3.14159)}]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -26,8 +26,8 @@ proc ticker {} {
|
|||
set t [clock seconds]
|
||||
after 250 ticker
|
||||
if {$t != $time} {
|
||||
set time $t
|
||||
updateClock $t
|
||||
set time $t
|
||||
updateClock $t
|
||||
}
|
||||
}
|
||||
ticker
|
||||
|
|
|
|||
|
|
@ -7,164 +7,164 @@ import math
|
|||
import time
|
||||
|
||||
const (
|
||||
// All coordinates are designed for a clock size of this many pixel.
|
||||
// You cannot change the size of the clock by adjusting this value.
|
||||
design_size = 700
|
||||
center = 350
|
||||
// All coordinates are designed for a clock size of this many pixel.
|
||||
// You cannot change the size of the clock by adjusting this value.
|
||||
design_size = 700
|
||||
center = 350
|
||||
|
||||
// Half the width of a tic-mark.
|
||||
tw = 9
|
||||
// Height of a minute tic-mark. (hour is twice, 3-hour is thrice)
|
||||
th = 25
|
||||
// Padding of tic-mark to window border
|
||||
tp = 10
|
||||
// Half the width of a tic-mark.
|
||||
tw = 9
|
||||
// Height of a minute tic-mark. (hour is twice, 3-hour is thrice)
|
||||
th = 25
|
||||
// Padding of tic-mark to window border
|
||||
tp = 10
|
||||
|
||||
tic_color = gx.Color{
|
||||
r: 50
|
||||
g: 50
|
||||
b: 50
|
||||
}
|
||||
hand_color = gx.black
|
||||
second_hand_color = gx.red
|
||||
tic_color = gx.Color{
|
||||
r: 50
|
||||
g: 50
|
||||
b: 50
|
||||
}
|
||||
hand_color = gx.black
|
||||
second_hand_color = gx.red
|
||||
)
|
||||
|
||||
struct App {
|
||||
minutes_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw,
|
||||
tp + 1 * th, center - tw, tp + 1 * th]
|
||||
hours_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw, tp + 2 * th,
|
||||
center - tw, tp + 2 * th]
|
||||
hours3_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw, tp + 3 * th,
|
||||
center - tw, tp + 3 * th]
|
||||
minutes_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw,
|
||||
tp + 1 * th, center - tw, tp + 1 * th]
|
||||
hours_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw, tp + 2 * th,
|
||||
center - tw, tp + 2 * th]
|
||||
hours3_tic []f32 = [f32(center - tw), tp, center + tw, tp, center + tw, tp, center + tw, tp + 3 * th,
|
||||
center - tw, tp + 3 * th]
|
||||
|
||||
hour_hand []f32 = [f32(329), 161, 350, 140, 371, 161, 371, 413, 329, 413]
|
||||
minute_hand []f32 = [f32(334.25), 40.25, 350, 24.5, 365.75, 40.25, 365.75, 427, 334.25, 427]
|
||||
second_hand []f32 = [f32(345.8), 38.5, 350, 34.3, 354.2000, 38.5, 358.75, 427, 341.25, 427]
|
||||
mut:
|
||||
gg &gg.Context = unsafe { nil }
|
||||
draw_flag bool = true
|
||||
dpi_scale f32 = 1.0
|
||||
hour_hand []f32 = [f32(329), 161, 350, 140, 371, 161, 371, 413, 329, 413]
|
||||
minute_hand []f32 = [f32(334.25), 40.25, 350, 24.5, 365.75, 40.25, 365.75, 427, 334.25, 427]
|
||||
second_hand []f32 = [f32(345.8), 38.5, 350, 34.3, 354.2000, 38.5, 358.75, 427, 341.25, 427]
|
||||
mut:
|
||||
gg &gg.Context = unsafe { nil }
|
||||
draw_flag bool = true
|
||||
dpi_scale f32 = 1.0
|
||||
}
|
||||
|
||||
fn on_frame(mut app App) {
|
||||
if !app.draw_flag {
|
||||
return
|
||||
}
|
||||
app.gg.begin()
|
||||
if !app.draw_flag {
|
||||
return
|
||||
}
|
||||
app.gg.begin()
|
||||
|
||||
for i in 0 .. 60 { // draw minute tics
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.minutes_tic, tic_color,
|
||||
i * 6)
|
||||
}
|
||||
for i in 0 .. 12 { // hours
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hours_tic, tic_color, i * 30)
|
||||
}
|
||||
for i in 0 .. 4 { // 3 hours
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hours3_tic, tic_color,
|
||||
i * 90)
|
||||
}
|
||||
for i in 0 .. 60 { // draw minute tics
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.minutes_tic, tic_color,
|
||||
i * 6)
|
||||
}
|
||||
for i in 0 .. 12 { // hours
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hours_tic, tic_color, i * 30)
|
||||
}
|
||||
for i in 0 .. 4 { // 3 hours
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hours3_tic, tic_color,
|
||||
i * 90)
|
||||
}
|
||||
|
||||
n := time.now()
|
||||
n := time.now()
|
||||
|
||||
// draw hour hand
|
||||
i := f32(n.hour) + f32(n.minute) / 60.0
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hour_hand, hand_color, i * 30)
|
||||
// draw hour hand
|
||||
i := f32(n.hour) + f32(n.minute) / 60.0
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.hour_hand, hand_color, i * 30)
|
||||
|
||||
// draw minute hand
|
||||
mut j := f32(n.minute)
|
||||
if n.second == 59 { // make minute hand move smoothly
|
||||
j += f32(math.sin(f32(n.microsecond) / 1e6 * math.pi / 2.0))
|
||||
}
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.minute_hand, hand_color, j * 6)
|
||||
// draw minute hand
|
||||
mut j := f32(n.minute)
|
||||
if n.second == 59 { // make minute hand move smoothly
|
||||
j += f32(math.sin(f32(n.microsecond) / 1e6 * math.pi / 2.0))
|
||||
}
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.minute_hand, hand_color, j * 6)
|
||||
|
||||
// draw second hand with smooth transition
|
||||
k := f32(n.second) + f32(math.sin(f32(n.microsecond) / 1e6 * math.pi / 2.0))
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.second_hand, second_hand_color,
|
||||
0 + k * 6)
|
||||
// draw second hand with smooth transition
|
||||
k := f32(n.second) + f32(math.sin(f32(n.microsecond) / 1e6 * math.pi / 2.0))
|
||||
draw_convex_poly_rotate(mut app.gg, app.dpi_scale, app.second_hand, second_hand_color,
|
||||
0 + k * 6)
|
||||
|
||||
app.gg.end()
|
||||
app.gg.end()
|
||||
}
|
||||
|
||||
// Rotate a polygon round the centerpoint
|
||||
[manualfree]
|
||||
fn draw_convex_poly_rotate(mut ctx gg.Context, dpi_scale f32, points []f32, c gx.Color, angle f32) {
|
||||
sa := math.sin(math.pi * angle / 180.0)
|
||||
ca := math.cos(math.pi * angle / 180.0)
|
||||
sa := math.sin(math.pi * angle / 180.0)
|
||||
ca := math.cos(math.pi * angle / 180.0)
|
||||
|
||||
mut rotated_points := []f32{cap: points.len}
|
||||
for i := 0; i < points.len / 2; i++ {
|
||||
x := points[2 * i]
|
||||
y := points[2 * i + 1]
|
||||
xn := f32((x - center) * ca - (y - center) * sa)
|
||||
yn := f32((x - center) * sa + (y - center) * ca)
|
||||
rotated_points << (xn + center) * dpi_scale
|
||||
rotated_points << (yn + center) * dpi_scale
|
||||
}
|
||||
ctx.draw_convex_poly(rotated_points, c)
|
||||
unsafe { rotated_points.free() }
|
||||
mut rotated_points := []f32{cap: points.len}
|
||||
for i := 0; i < points.len / 2; i++ {
|
||||
x := points[2 * i]
|
||||
y := points[2 * i + 1]
|
||||
xn := f32((x - center) * ca - (y - center) * sa)
|
||||
yn := f32((x - center) * sa + (y - center) * ca)
|
||||
rotated_points << (xn + center) * dpi_scale
|
||||
rotated_points << (yn + center) * dpi_scale
|
||||
}
|
||||
ctx.draw_convex_poly(rotated_points, c)
|
||||
unsafe { rotated_points.free() }
|
||||
}
|
||||
|
||||
fn (mut app App) resize() {
|
||||
size := gg.window_size()
|
||||
// avoid calls when minimized
|
||||
if size.width < 2 && size.height < 2 {
|
||||
return
|
||||
}
|
||||
w := f32(size.width) / design_size
|
||||
h := f32(size.height) / design_size
|
||||
app.dpi_scale = if w < h { w } else { h }
|
||||
size := gg.window_size()
|
||||
// avoid calls when minimized
|
||||
if size.width < 2 && size.height < 2 {
|
||||
return
|
||||
}
|
||||
w := f32(size.width) / design_size
|
||||
h := f32(size.height) / design_size
|
||||
app.dpi_scale = if w < h { w } else { h }
|
||||
}
|
||||
|
||||
fn on_event(e &gg.Event, mut app App) {
|
||||
match e.typ {
|
||||
.resized, .resumed {
|
||||
app.resize()
|
||||
}
|
||||
.iconified {
|
||||
app.draw_flag = false
|
||||
}
|
||||
.restored {
|
||||
app.draw_flag = true
|
||||
app.resize()
|
||||
}
|
||||
else {
|
||||
if e.typ == .key_down {
|
||||
match e.key_code {
|
||||
.q {
|
||||
println('Good bye.')
|
||||
// do we need to free anything here?
|
||||
app.gg.quit()
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
match e.typ {
|
||||
.resized, .resumed {
|
||||
app.resize()
|
||||
}
|
||||
.iconified {
|
||||
app.draw_flag = false
|
||||
}
|
||||
.restored {
|
||||
app.draw_flag = true
|
||||
app.resize()
|
||||
}
|
||||
else {
|
||||
if e.typ == .key_down {
|
||||
match e.key_code {
|
||||
.q {
|
||||
println('Good bye.')
|
||||
// do we need to free anything here?
|
||||
app.gg.quit()
|
||||
}
|
||||
else {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn on_init(mut app App) {
|
||||
app.resize()
|
||||
app.resize()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println("Press 'q' to quit.")
|
||||
mut font_path := os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'RobotoMono-Regular.ttf'))
|
||||
$if android {
|
||||
font_path = 'fonts/RobotoMono-Regular.ttf'
|
||||
}
|
||||
println("Press 'q' to quit.")
|
||||
mut font_path := os.resource_abs_path(os.join_path('..', 'assets', 'fonts', 'RobotoMono-Regular.ttf'))
|
||||
$if android {
|
||||
font_path = 'fonts/RobotoMono-Regular.ttf'
|
||||
}
|
||||
|
||||
mut app := &App{}
|
||||
mut app := &App{}
|
||||
|
||||
app.gg = gg.new_context(
|
||||
width: design_size
|
||||
height: design_size
|
||||
window_title: 'Clock!'
|
||||
bg_color: gx.white
|
||||
user_data: app
|
||||
frame_fn: on_frame
|
||||
event_fn: on_event
|
||||
init_fn: on_init
|
||||
font_path: font_path
|
||||
)
|
||||
app.gg = gg.new_context(
|
||||
width: design_size
|
||||
height: design_size
|
||||
window_title: 'Clock!'
|
||||
bg_color: gx.white
|
||||
user_data: app
|
||||
frame_fn: on_frame
|
||||
event_fn: on_event
|
||||
init_fn: on_init
|
||||
font_path: font_path
|
||||
)
|
||||
|
||||
app.gg.run()
|
||||
app.gg.run()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,70 +0,0 @@
|
|||
'ANSI Clock
|
||||
|
||||
'ansi escape functions
|
||||
ans0=chr(27)&"["
|
||||
sub cls() wscript.StdOut.Write ans0 &"2J"&ans0 &"?25l":end sub
|
||||
sub torc(r,c,s) wscript.StdOut.Write ans0 & r & ";" & c & "f" & s :end sub
|
||||
|
||||
'bresenham
|
||||
Sub draw_line(r1,c1, r2,c2,c)
|
||||
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
|
||||
torc x,y,c
|
||||
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
|
||||
|
||||
const pi180=0.017453292519943
|
||||
'center of the clock
|
||||
const r0=13
|
||||
const c0=26
|
||||
|
||||
'angles
|
||||
nangi=-30*pi180
|
||||
aangi=-6*pi180
|
||||
ang0=90*pi180
|
||||
|
||||
'lengths of hands
|
||||
lh=7
|
||||
lm=9
|
||||
ls=9
|
||||
ln=12
|
||||
|
||||
|
||||
while 1
|
||||
cls
|
||||
|
||||
'dial
|
||||
angn=ang0+nangi
|
||||
for i=1 to 12
|
||||
torc r0-cint(ln*sin(angn)),cint(c0+2*ln*cos(angn)),i
|
||||
angn=angn+nangi
|
||||
next
|
||||
|
||||
'get time and display it in numbers
|
||||
t=now()
|
||||
torc 1,1, hour(t) &":"& minute(t) &":"& second(t)
|
||||
|
||||
'angle for each hand
|
||||
angh=ang0+hour(t) *nangi
|
||||
angm=ang0+minute(t) *aangi
|
||||
angS=ang0+second(t) *aangi
|
||||
|
||||
'draw them
|
||||
draw_line r0,c0,cint(r0-ls*sin(angs)),cint(c0+2*ls*cos(angs)),"."
|
||||
draw_line r0,c0,cint(r0-lm*sin(angm)),cint(c0+2*lm*cos(angm)),"*"
|
||||
draw_line r0,c0,cint(r0-lh*sin(angh)),cint(c0+2*lh*cos(angh)),"W"
|
||||
torc r0,c0,"O"
|
||||
|
||||
'wait one second
|
||||
wscript.sleep(1000)
|
||||
wend
|
||||
|
|
@ -27,142 +27,142 @@ clockface()
|
|||
|
||||
do
|
||||
|
||||
hour = val(mid$(time$,1,2))
|
||||
mins = val(mid$(time$,4,2))
|
||||
sec = val(mid$(time$,7,2))
|
||||
|
||||
updatehand("sec")
|
||||
updatehand("mins")
|
||||
updatehand("hour")
|
||||
hour = val(mid$(time$,1,2))
|
||||
mins = val(mid$(time$,4,2))
|
||||
sec = val(mid$(time$,7,2))
|
||||
|
||||
pause .25
|
||||
updatehand("sec")
|
||||
updatehand("mins")
|
||||
updatehand("hour")
|
||||
|
||||
pause .25
|
||||
|
||||
loop
|
||||
|
||||
sub updatehand(hand$)
|
||||
|
||||
switch(hand$)
|
||||
case "sec"
|
||||
h_len = shand
|
||||
angle = sec * 6
|
||||
width = 6
|
||||
color 255,0,0
|
||||
ox = osx
|
||||
oy = osy
|
||||
oxm1 = osxm1
|
||||
oxm2 = osxm2
|
||||
oym1 = osym1
|
||||
oym2 = osym2
|
||||
break
|
||||
case "mins"
|
||||
h_len = mhand
|
||||
angle = mins * 6 + int(sec/10)
|
||||
width = 12
|
||||
color 0,255,0
|
||||
ox = omx
|
||||
oy = omy
|
||||
oxm1 = omxm1
|
||||
oxm2 = omxm2
|
||||
oym1 = omym1
|
||||
oym2 = omym2
|
||||
break
|
||||
case "hour"
|
||||
h_len = hhand
|
||||
angle = ((hour * 30) + (minutes / 12) * 6) + int(mins/2)
|
||||
width = 15
|
||||
color 0,0,255
|
||||
ox = ohx
|
||||
oy = ohy
|
||||
oxm1 = ohxm1
|
||||
oxm2 = ohxm2
|
||||
oym1 = ohym1
|
||||
oym2 = ohym2
|
||||
break
|
||||
end switch
|
||||
|
||||
h_angle1 = angle - width
|
||||
if h_angle1 < 0 then
|
||||
h_angle1 = h_angle1 + 360
|
||||
endif
|
||||
h_angle1 = h_angle1 / DEG_PER_RAD
|
||||
|
||||
h_angle2 = angle + width
|
||||
if h_angle2 > 360 then
|
||||
h_angle2 = h_angle2 - 360
|
||||
endif
|
||||
h_angle2 = h_angle2 / DEG_PER_RAD
|
||||
|
||||
angle = angle / DEG_PER_RAD
|
||||
|
||||
x = (hx + (sin(angle) * h_len))
|
||||
xm1 = (hx + (sin(h_angle1) * int(h_len * .2)))
|
||||
xm2 = (hx + (sin(h_angle2) * int(h_len * .2)))
|
||||
switch(hand$)
|
||||
case "sec"
|
||||
h_len = shand
|
||||
angle = sec * 6
|
||||
width = 6
|
||||
color 255,0,0
|
||||
ox = osx
|
||||
oy = osy
|
||||
oxm1 = osxm1
|
||||
oxm2 = osxm2
|
||||
oym1 = osym1
|
||||
oym2 = osym2
|
||||
break
|
||||
case "mins"
|
||||
h_len = mhand
|
||||
angle = mins * 6 + int(sec/10)
|
||||
width = 12
|
||||
color 0,255,0
|
||||
ox = omx
|
||||
oy = omy
|
||||
oxm1 = omxm1
|
||||
oxm2 = omxm2
|
||||
oym1 = omym1
|
||||
oym2 = omym2
|
||||
break
|
||||
case "hour"
|
||||
h_len = hhand
|
||||
angle = ((hour * 30) + (minutes / 12) * 6) + int(mins/2)
|
||||
width = 15
|
||||
color 0,0,255
|
||||
ox = ohx
|
||||
oy = ohy
|
||||
oxm1 = ohxm1
|
||||
oxm2 = ohxm2
|
||||
oym1 = ohym1
|
||||
oym2 = ohym2
|
||||
break
|
||||
end switch
|
||||
|
||||
y = (hy - (cos(angle) * h_len))
|
||||
ym1 = (hy - (cos(h_angle1) * int(h_len * .2)))
|
||||
ym2 = (hy - (cos(h_angle2) * int(h_len * .2)))
|
||||
h_angle1 = angle - width
|
||||
if h_angle1 < 0 then
|
||||
h_angle1 = h_angle1 + 360
|
||||
endif
|
||||
h_angle1 = h_angle1 / DEG_PER_RAD
|
||||
|
||||
clear line hx,hy,oxm1,oym1
|
||||
clear line hx,hy,oxm2,oym2
|
||||
clear line oxm1,oym1,ox,oy
|
||||
clear line oxm2,oym2,ox,oy
|
||||
line hx,hy,xm1,ym1
|
||||
line hx,hy,xm2,ym2
|
||||
line xm1,ym1,x,y
|
||||
line xm2,ym2,x,y
|
||||
|
||||
REM save off the old vals
|
||||
switch(hand$)
|
||||
case "sec"
|
||||
osx = x
|
||||
osy = y
|
||||
osxm1 = xm1
|
||||
osxm2 = xm2
|
||||
osym1 = ym1
|
||||
osym2 = ym2
|
||||
break
|
||||
case "mins"
|
||||
omx = x
|
||||
omy = y
|
||||
omxm1 = xm1
|
||||
omxm2 = xm2
|
||||
omym1 = ym1
|
||||
omym2 = ym2
|
||||
break
|
||||
case "hour"
|
||||
ohx = x
|
||||
ohy = y
|
||||
ohxm1 = xm1
|
||||
ohxm2 = xm2
|
||||
ohym1 = ym1
|
||||
ohym2 = ym2
|
||||
break
|
||||
end switch
|
||||
h_angle2 = angle + width
|
||||
if h_angle2 > 360 then
|
||||
h_angle2 = h_angle2 - 360
|
||||
endif
|
||||
h_angle2 = h_angle2 / DEG_PER_RAD
|
||||
|
||||
angle = angle / DEG_PER_RAD
|
||||
|
||||
x = (hx + (sin(angle) * h_len))
|
||||
xm1 = (hx + (sin(h_angle1) * int(h_len * .2)))
|
||||
xm2 = (hx + (sin(h_angle2) * int(h_len * .2)))
|
||||
|
||||
y = (hy - (cos(angle) * h_len))
|
||||
ym1 = (hy - (cos(h_angle1) * int(h_len * .2)))
|
||||
ym2 = (hy - (cos(h_angle2) * int(h_len * .2)))
|
||||
|
||||
clear line hx,hy,oxm1,oym1
|
||||
clear line hx,hy,oxm2,oym2
|
||||
clear line oxm1,oym1,ox,oy
|
||||
clear line oxm2,oym2,ox,oy
|
||||
line hx,hy,xm1,ym1
|
||||
line hx,hy,xm2,ym2
|
||||
line xm1,ym1,x,y
|
||||
line xm2,ym2,x,y
|
||||
|
||||
REM save off the old vals
|
||||
switch(hand$)
|
||||
case "sec"
|
||||
osx = x
|
||||
osy = y
|
||||
osxm1 = xm1
|
||||
osxm2 = xm2
|
||||
osym1 = ym1
|
||||
osym2 = ym2
|
||||
break
|
||||
case "mins"
|
||||
omx = x
|
||||
omy = y
|
||||
omxm1 = xm1
|
||||
omxm2 = xm2
|
||||
omym1 = ym1
|
||||
omym2 = ym2
|
||||
break
|
||||
case "hour"
|
||||
ohx = x
|
||||
ohy = y
|
||||
ohxm1 = xm1
|
||||
ohxm2 = xm2
|
||||
ohym1 = ym1
|
||||
ohym2 = ym2
|
||||
break
|
||||
end switch
|
||||
end sub
|
||||
|
||||
sub clockface()
|
||||
circle hx,hy,radius
|
||||
|
||||
htick = radius / 10
|
||||
mtick = htick / 2
|
||||
|
||||
for z=0 to 360 step 6
|
||||
REM Begin at zero deg and stop before 360 deg
|
||||
circle hx,hy,radius
|
||||
|
||||
REM draw the hour markers
|
||||
angle = z
|
||||
angle = angle / DEG_PER_RAD
|
||||
x2 = (hx + (sin(angle) * radius))
|
||||
y2 = (hy - (cos(angle) * radius))
|
||||
if mod(z,30) = 0 then
|
||||
tick = htick
|
||||
else
|
||||
tick = mtick
|
||||
endif
|
||||
x3 = (hx + (sin(angle) * (radius - tick)))
|
||||
y3 = (hy - (cos(angle) * (radius - tick)))
|
||||
color 255,0,0
|
||||
line x2,y2,x3,y3
|
||||
color 0,0,0
|
||||
next z
|
||||
htick = radius / 10
|
||||
mtick = htick / 2
|
||||
|
||||
for z=0 to 360 step 6
|
||||
REM Begin at zero deg and stop before 360 deg
|
||||
|
||||
REM draw the hour markers
|
||||
angle = z
|
||||
angle = angle / DEG_PER_RAD
|
||||
x2 = (hx + (sin(angle) * radius))
|
||||
y2 = (hy - (cos(angle) * radius))
|
||||
if mod(z,30) = 0 then
|
||||
tick = htick
|
||||
else
|
||||
tick = mtick
|
||||
endif
|
||||
x3 = (hx + (sin(angle) * (radius - tick)))
|
||||
y3 = (hy - (cos(angle) * (radius - tick)))
|
||||
color 255,0,0
|
||||
line x2,y2,x3,y3
|
||||
color 0,0,0
|
||||
next z
|
||||
end sub
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ var
|
|||
while(True){
|
||||
x:=Time.Date.ctime()[11,8] // or Time.Date.to24HString() (no seconds)
|
||||
.pump(List,fcn(n){ n.toAsc() - 0x30 }); //-->L(2,3,10,4,3,10,5,2)
|
||||
print("\e[H\e[J"); // home and clear screen on ANSI terminals
|
||||
print("\e[H\e[J"); // home and clear screen on ANSI terminals
|
||||
println(x.pump(String,t.get),"\n",x.pump(String,b.get));
|
||||
Atomic.sleep(1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue