Initial commit
This commit is contained in:
22
Harmonograph.sln
Normal file
22
Harmonograph.sln
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 2013
|
||||||
|
VisualStudioVersion = 12.0.0.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.0.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Harmonograph", "Harmonograph\Harmonograph.csproj", "{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
174
Harmonograph/GraphWindow.cs
Normal file
174
Harmonograph/GraphWindow.cs
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Xml;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using OpenTK;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
using OpenTK.Graphics.OpenGL;
|
||||||
|
using OpenTK.Input;
|
||||||
|
|
||||||
|
namespace Harmonograph
|
||||||
|
{
|
||||||
|
public class GraphWindow : GameWindow
|
||||||
|
{
|
||||||
|
private const double Tau = Math.PI * 2;
|
||||||
|
private const double Pi = Math.PI;
|
||||||
|
|
||||||
|
public HarmonographSolver Solver { get; } = new HarmonographSolver()
|
||||||
|
{
|
||||||
|
new PendulumSolver(Vector2d.UnitX * 1.5, 4.01, 0, 0.005),
|
||||||
|
new PendulumSolver(Vector2d.UnitY, 5.01, 0, 0.005),
|
||||||
|
new PendulumSolver(Vector2d.UnitX, 1.01, 0, 0.005),
|
||||||
|
new PendulumSolver(Vector2d.UnitY / 2, -1.01, 1, 0.005),
|
||||||
|
};
|
||||||
|
|
||||||
|
public double ViewHeight { get; set; }
|
||||||
|
public double DisplayRate { get; set; }
|
||||||
|
public int Cycles { get; set; }
|
||||||
|
|
||||||
|
public Color Back { get; }
|
||||||
|
public Color Front { get; }
|
||||||
|
|
||||||
|
private Vector2[] _path = new Vector2[0];
|
||||||
|
private double _time = 0;
|
||||||
|
|
||||||
|
private double _phaseRate = Math.PI / 4;
|
||||||
|
private bool _phaseMode = false;
|
||||||
|
|
||||||
|
public GraphWindow(string settingsFile)
|
||||||
|
: base(2560, 1440, new GraphicsMode(32, 0, 0, 4))
|
||||||
|
{
|
||||||
|
if (settingsFile != null && File.Exists(settingsFile))
|
||||||
|
{
|
||||||
|
var jo = JObject.Parse(File.ReadAllText(settingsFile));
|
||||||
|
Back = jo["back"]?.ToObject<Color>() ?? Color.Black;
|
||||||
|
Front = jo["front"]?.ToObject<Color>() ?? Color.FromArgb(0x33, 0xff, 0xff, 0xff);
|
||||||
|
|
||||||
|
ViewHeight = jo["viewHeight"]?.ToObject<int>() ?? 4;
|
||||||
|
DisplayRate = jo["displayRate"]?.ToObject<double>() ?? 1;
|
||||||
|
|
||||||
|
Cycles = jo["cycles"]?.ToObject<int>() ?? 100;
|
||||||
|
|
||||||
|
if (jo["pendulums"] != null)
|
||||||
|
{
|
||||||
|
Solver.Pendulums.Clear();
|
||||||
|
foreach (var t in jo["pendulums"])
|
||||||
|
{
|
||||||
|
var amp = t["amplitude"]?.ToObject<Vector2d>() ?? Vector2d.UnitX;
|
||||||
|
var period = t["period"]?.ToObject<double>() ?? 1;
|
||||||
|
var phase = t["phase"]?.ToObject<double>() ?? 0;
|
||||||
|
var friction = t["friction"]?.ToObject<double>() ?? 0.005;
|
||||||
|
|
||||||
|
Solver.Add(new PendulumSolver(amp, period, phase, friction));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnLoad(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnLoad(e);
|
||||||
|
Width = 2560;
|
||||||
|
Height = 1440;
|
||||||
|
X = (DisplayDevice.Default.Width - Width) / 2;
|
||||||
|
Y = (DisplayDevice.Default.Height - Height) / 2;
|
||||||
|
|
||||||
|
RecalculatePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RecalculatePath()
|
||||||
|
{
|
||||||
|
var m = (int) (Cycles * 200 * Tau);
|
||||||
|
var path = new Vector2[m];
|
||||||
|
|
||||||
|
Parallel.For(0, m, i => path[i] = (Vector2) Solver.At(i / 20.0));
|
||||||
|
|
||||||
|
_path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnRenderFrame(FrameEventArgs e)
|
||||||
|
{
|
||||||
|
base.OnRenderFrame(e);
|
||||||
|
|
||||||
|
var proj = Matrix4d.CreateOrthographic(ViewHeight * Width / Height, ViewHeight, -1, 1);
|
||||||
|
|
||||||
|
GL.MatrixMode(MatrixMode.Projection);
|
||||||
|
GL.LoadMatrix(ref proj);
|
||||||
|
|
||||||
|
GL.Viewport(ClientRectangle);
|
||||||
|
GL.ClearColor(Back);
|
||||||
|
GL.Clear(ClearBufferMask.ColorBufferBit);
|
||||||
|
|
||||||
|
GL.Enable(EnableCap.Blend);
|
||||||
|
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
|
||||||
|
GL.LineWidth(1.5f);
|
||||||
|
GL.Begin(PrimitiveType.LineStrip);
|
||||||
|
GL.Color4(Front);
|
||||||
|
for (var i = 0; i < _path.Length && i < _time; i++)
|
||||||
|
{
|
||||||
|
var p = _path[i];
|
||||||
|
GL.Vertex2(p);
|
||||||
|
}
|
||||||
|
GL.End();
|
||||||
|
|
||||||
|
SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SaveScreenshot() => SaveScreenshot(DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png");
|
||||||
|
|
||||||
|
public void SaveScreenshot(string file)
|
||||||
|
{
|
||||||
|
if (GraphicsContext.CurrentContext == null)
|
||||||
|
throw new GraphicsContextMissingException();
|
||||||
|
var w = ClientSize.Width;
|
||||||
|
var h = ClientSize.Height;
|
||||||
|
var bmp = new Bitmap(w, h);
|
||||||
|
var data = bmp.LockBits(ClientRectangle, System.Drawing.Imaging.ImageLockMode.WriteOnly,
|
||||||
|
System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
||||||
|
GL.ReadPixels(0, 0, w, h, PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0);
|
||||||
|
bmp.UnlockBits(data);
|
||||||
|
|
||||||
|
bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
||||||
|
|
||||||
|
bmp.Save(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnKeyDown(KeyboardKeyEventArgs e)
|
||||||
|
{
|
||||||
|
base.OnKeyDown(e);
|
||||||
|
|
||||||
|
if (e.Key == Key.Space)
|
||||||
|
SaveScreenshot();
|
||||||
|
|
||||||
|
if (e.Key == Key.A)
|
||||||
|
_phaseMode = !_phaseMode;
|
||||||
|
|
||||||
|
if (e.Key == Key.R)
|
||||||
|
_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnUpdateFrame(FrameEventArgs e)
|
||||||
|
{
|
||||||
|
base.OnUpdateFrame(e);
|
||||||
|
|
||||||
|
Title = $"{1 / e.Time:00.00}";
|
||||||
|
|
||||||
|
if (DisplayRate <= 0)
|
||||||
|
_time = _path.Length;
|
||||||
|
|
||||||
|
if (Focused)
|
||||||
|
_time += e.Time * DisplayRate * 100;
|
||||||
|
|
||||||
|
if (_phaseMode)
|
||||||
|
{
|
||||||
|
foreach (var p in Solver.Pendulums)
|
||||||
|
p.Phase += e.Time * _phaseRate;
|
||||||
|
RecalculatePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
93
Harmonograph/Harmonograph.csproj
Normal file
93
Harmonograph/Harmonograph.csproj
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099}</ProjectGuid>
|
||||||
|
<ProjectTypeGuids>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>Harmonograph</RootNamespace>
|
||||||
|
<AssemblyName>Harmonograph</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4">
|
||||||
|
<HintPath>..\packages\OpenTK.3.0.0-pre\lib\net20\OpenTK.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="GraphWindow.cs" />
|
||||||
|
<Compile Include="HarmonographSolver.cs" />
|
||||||
|
<Compile Include="PendulumSolver.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="OpenTK.dll.config" />
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="blackonwhite.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="bow2.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="rainbowroad.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="sparse.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="spring.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="test.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="whiteonblack.json">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
32
Harmonograph/HarmonographSolver.cs
Normal file
32
Harmonograph/HarmonographSolver.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
|
namespace Harmonograph
|
||||||
|
{
|
||||||
|
public class HarmonographSolver : IEnumerable<PendulumSolver>
|
||||||
|
{
|
||||||
|
public const double Tau = Math.PI / 2;
|
||||||
|
|
||||||
|
public List<PendulumSolver> Pendulums { get; } = new List<PendulumSolver>();
|
||||||
|
|
||||||
|
public void Add(PendulumSolver pendulum) => Pendulums.Add(pendulum);
|
||||||
|
|
||||||
|
public Vector2d At(double time)
|
||||||
|
{
|
||||||
|
return Pendulums.Select(p => p.At(time)).Aggregate(Vector2d.Zero, Vector2d.Add);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator<PendulumSolver> GetEnumerator()
|
||||||
|
{
|
||||||
|
return Pendulums.GetEnumerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
|
{
|
||||||
|
return ((IEnumerable) Pendulums).GetEnumerator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
Harmonograph/OpenTK.dll.config
Normal file
25
Harmonograph/OpenTK.dll.config
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<configuration>
|
||||||
|
<dllmap os="linux" dll="opengl32.dll" target="libGL.so.1"/>
|
||||||
|
<dllmap os="linux" dll="glu32.dll" target="libGLU.so.1"/>
|
||||||
|
<dllmap os="linux" dll="openal32.dll" target="libopenal.so.1"/>
|
||||||
|
<dllmap os="linux" dll="alut.dll" target="libalut.so.0"/>
|
||||||
|
<dllmap os="linux" dll="opencl.dll" target="libOpenCL.so"/>
|
||||||
|
<dllmap os="linux" dll="libX11" target="libX11.so.6"/>
|
||||||
|
<dllmap os="linux" dll="libXi" target="libXi.so.6"/>
|
||||||
|
<dllmap os="linux" dll="SDL2.dll" target="libSDL2-2.0.so.0"/>
|
||||||
|
<dllmap os="osx" dll="opengl32.dll" target="/System/Library/Frameworks/OpenGL.framework/OpenGL"/>
|
||||||
|
<dllmap os="osx" dll="openal32.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
|
||||||
|
<dllmap os="osx" dll="alut.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
|
||||||
|
<dllmap os="osx" dll="libGLES.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
||||||
|
<dllmap os="osx" dll="libGLESv1_CM.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
||||||
|
<dllmap os="osx" dll="libGLESv2.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
||||||
|
<dllmap os="osx" dll="opencl.dll" target="/System/Library/Frameworks/OpenCL.framework/OpenCL"/>
|
||||||
|
<dllmap os="osx" dll="SDL2.dll" target="libSDL2.dylib"/>
|
||||||
|
<!-- XQuartz compatibility (X11 on Mac) -->
|
||||||
|
<dllmap os="osx" dll="libGL.so.1" target="/usr/X11/lib/libGL.dylib"/>
|
||||||
|
<dllmap os="osx" dll="libX11" target="/usr/X11/lib/libX11.dylib"/>
|
||||||
|
<dllmap os="osx" dll="libXcursor.so.1" target="/usr/X11/lib/libXcursor.dylib"/>
|
||||||
|
<dllmap os="osx" dll="libXi" target="/usr/X11/lib/libXi.dylib"/>
|
||||||
|
<dllmap os="osx" dll="libXinerama" target="/usr/X11/lib/libXinerama.dylib"/>
|
||||||
|
<dllmap os="osx" dll="libXrandr.so.2" target="/usr/X11/lib/libXrandr.dylib"/>
|
||||||
|
</configuration>
|
||||||
31
Harmonograph/PendulumSolver.cs
Normal file
31
Harmonograph/PendulumSolver.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using OpenTK;
|
||||||
|
|
||||||
|
namespace Harmonograph
|
||||||
|
{
|
||||||
|
public class PendulumSolver
|
||||||
|
{
|
||||||
|
public const double Tau = Math.PI * 2;
|
||||||
|
|
||||||
|
public Vector2d Amplitude { get; set; }
|
||||||
|
public double Period { get; set; }
|
||||||
|
public double Phase { get; set; }
|
||||||
|
public double Friction { get; set; }
|
||||||
|
|
||||||
|
public PendulumSolver(Vector2d amplitude, double period, double phase,
|
||||||
|
double friction = 0.01)
|
||||||
|
{
|
||||||
|
Amplitude = amplitude;
|
||||||
|
Period = period;
|
||||||
|
Phase = phase;
|
||||||
|
Friction = friction;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2d At(double time)
|
||||||
|
{
|
||||||
|
var phase = (Phase + Period * time) / Tau;
|
||||||
|
|
||||||
|
return Amplitude * Math.Sin(phase) * Math.Exp(-time * Friction / Tau);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
Harmonograph/Program.cs
Normal file
23
Harmonograph/Program.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Harmonograph
|
||||||
|
{
|
||||||
|
internal class Program
|
||||||
|
{
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
string f = null;
|
||||||
|
if (args.Length > 0) f = args[0];
|
||||||
|
if (f == "-")
|
||||||
|
{
|
||||||
|
Console.Write("input file.\n>>> ");
|
||||||
|
f = Console.ReadLine() + ".json";
|
||||||
|
}
|
||||||
|
using (var w = new GraphWindow(f))
|
||||||
|
{
|
||||||
|
w.Run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
Harmonograph/Properties/AssemblyInfo.cs
Normal file
36
Harmonograph/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("Harmonograph")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("Harmonograph")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("3DEBA9F3-AD0D-43A6-BF4E-0220BDAFB099")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
28
Harmonograph/blackonwhite.json
Normal file
28
Harmonograph/blackonwhite.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"back": "0x00000000",
|
||||||
|
"front": "0x10ffffff",
|
||||||
|
"displayRate": 1000,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 1.5, "y": 0 },
|
||||||
|
"period": 3.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": 1 },
|
||||||
|
"period": 4.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 2.999,
|
||||||
|
"friction": 0.0005
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
29
Harmonograph/bow2.json
Normal file
29
Harmonograph/bow2.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"back": "0x10ffffff",
|
||||||
|
"front": "0x10000000",
|
||||||
|
"displayRate": 1000,
|
||||||
|
"cycles": 500,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 2, "y": 0 },
|
||||||
|
"period": 3.001,
|
||||||
|
"friction": 0.001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": 1 },
|
||||||
|
"period": 4,
|
||||||
|
"friction": 0.001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1,
|
||||||
|
"friction": 0.001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 3,
|
||||||
|
"friction": 0.001
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
5
Harmonograph/packages.config
Normal file
5
Harmonograph/packages.config
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net45" />
|
||||||
|
<package id="OpenTK" version="3.0.0-pre" targetFramework="net45" />
|
||||||
|
</packages>
|
||||||
29
Harmonograph/rainbowroad.json
Normal file
29
Harmonograph/rainbowroad.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"back": "0x10ffffff",
|
||||||
|
"front": "0x70000000",
|
||||||
|
"displayRate": 10,
|
||||||
|
"cycles": 10,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 2, "y": -.5 },
|
||||||
|
"period": 2.01,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": .5 },
|
||||||
|
"period": 5.01,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 3,
|
||||||
|
"friction": 0.01
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
28
Harmonograph/sparse.json
Normal file
28
Harmonograph/sparse.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"back": "0xffffffff",
|
||||||
|
"front": "0xff000000",
|
||||||
|
"displayRate": 500,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 1.5, "y": 0 },
|
||||||
|
"period": 3.01,
|
||||||
|
"friction": 0.02
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": 1 },
|
||||||
|
"period": 4.01,
|
||||||
|
"friction": 0.02
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1.01,
|
||||||
|
"friction": 0.02
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 2.98,
|
||||||
|
"friction": 0.01
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
29
Harmonograph/spring.json
Normal file
29
Harmonograph/spring.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"back": "0x10ffffff",
|
||||||
|
"front": "0x70000000",
|
||||||
|
"displayRate": 1,
|
||||||
|
"cycles": 10,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 2, "y": -.5 },
|
||||||
|
"period": 5.01,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": .5 },
|
||||||
|
"period": 4.01,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1,
|
||||||
|
"friction": 0.01
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 3,
|
||||||
|
"friction": 0.01
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
24
Harmonograph/test.json
Normal file
24
Harmonograph/test.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"back": "0x10ffffff",
|
||||||
|
"front": "0x20000000",
|
||||||
|
"displayRate": 01,
|
||||||
|
"cycles": 10,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 1, "y": -.5 },
|
||||||
|
"period": 5.005,
|
||||||
|
"friction": 0.001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": 1 },
|
||||||
|
"period": 4.01,
|
||||||
|
"friction": 0.001
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": 0 },
|
||||||
|
"period": 3.01,
|
||||||
|
"friction": 0.001
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
28
Harmonograph/whiteonblack.json
Normal file
28
Harmonograph/whiteonblack.json
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"back": "0xffffffff",
|
||||||
|
"front": "0x10000000",
|
||||||
|
"displayRate": 1000,
|
||||||
|
"viewHeight": 3,
|
||||||
|
"pendulums": [
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 1.5, "y": 0 },
|
||||||
|
"period": 3.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": 0, "y": 1 },
|
||||||
|
"period": 4.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": .5, "y": .5 },
|
||||||
|
"period": 1.001,
|
||||||
|
"friction": 0.0005
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"amplitude": { "x": -.5, "y": .5 },
|
||||||
|
"period": 2.999,
|
||||||
|
"friction": 0.0005
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user