private static void Draw(ReticleDefinition reticle, string baseName) { var canvas = SvgCanvasFactory.Create("reticle", "2in", "2in"); var controller = new ReticleDrawController(reticle, canvas); controller.DrawReticle(); var svg = SvgCanvasFactory.ToSvg(canvas); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(svg); var svgDocument = SvgDocument.Open(xmlDocument); var bm = svgDocument.Draw(1024, 1024); var bm1 = new Bitmap(1024, 1024); Graphics g = Graphics.FromImage(bm1); g.FillRectangle(Brushes.White, 0, 0, 1024, 1024); g.DrawImage(bm, 0, 0); bm1.Save($"{baseName}.png", ImageFormat.Png); xmlDocument.Save($"{baseName}.svg"); xmlDocument = new XmlDocument(); BallisticXmlSerializer serializer = new BallisticXmlSerializer(xmlDocument); xmlDocument.AppendChild(serializer.Serialize(reticle)); xmlDocument.Save($"{baseName}.reticle"); xmlDocument = new XmlDocument(); xmlDocument.Load($"{baseName}.reticle"); BallisticXmlDeserializer deserializer = new BallisticXmlDeserializer(); _ = deserializer.Deserialize <ReticleDefinition>(xmlDocument.DocumentElement); }
private static void Draw(ReticleDefinition reticle, string baseName, TrajectoryPoint[] trajectory) { const double svgWidth = 10; double svgHeight = Math.Round(reticle.Size.Y / reticle.Size.X * svgWidth, 2); var canvas = SvgCanvasFactory.Create("reticle", $"{svgWidth}in", $"{svgHeight}in"); var controller = new ReticleDrawController(reticle, canvas); controller.DrawReticle(); controller.DrawBulletDropCompensator(trajectory, DistanceUnit.Yard.New(100), false, DistanceUnit.Yard, "black"); var svg = SvgCanvasFactory.ToSvg(canvas); const int pngWidth = 1024; int pngHeight = (int)((reticle.Size.Y / reticle.Size.X) * pngWidth); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.LoadXml(svg); var svgDocument = SvgDocument.Open(xmlDocument); var bm = svgDocument.Draw(pngWidth, pngHeight); var bm1 = new Bitmap(pngWidth, pngHeight); Graphics g = Graphics.FromImage(bm1); g.FillRectangle(Brushes.White, 0, 0, pngWidth, pngHeight); g.DrawImage(bm, 0, 0); bm1.Save($"{baseName}.png", ImageFormat.Png); xmlDocument.Save($"{baseName}.svg"); xmlDocument = new XmlDocument(); BallisticXmlSerializer serializer = new BallisticXmlSerializer(xmlDocument); xmlDocument.AppendChild(serializer.Serialize(reticle)); xmlDocument.Save($"{baseName}.reticle"); }
public EditPathForm(ReticlePath path, ReticleDefinition reticle) { Path = path; Copy = path.Clone() as ReticlePath; Reticle = reticle; InitializeComponent(); Setup(); }
private static void DrawGraphics(ReticleDefinition reticle, string baseName) { var bm1 = new Bitmap(1024, 1024); var canvas = GraphicsCanvas.FromImage(bm1, Color.White); canvas.Clear(); var controller = new ReticleDrawController(reticle, canvas); controller.DrawReticle(); bm1.Save($"{baseName}-a.png", ImageFormat.Png); }
private static ReticleDefinition CreateReticle(double size = 10, double?zeroy = null) { var definition = new ReticleDefinition() { Name = "Test", Size = new ReticlePosition(size, size, AngularUnit.Mil), Zero = new ReticlePosition(size / 2, zeroy ?? (size / 2), AngularUnit.Mil) }; return(definition); }
private IEnumerable <ReticleElement> CalculateBdc(ReticleDefinition reticle, IEnumerable <TrajectoryPoint> trajectory, Measurement <DistanceUnit> zero, bool closeBdc, DistanceUnit distanceUnits, string color) { TrajectoryPoint previousPoint = null; foreach (var point in trajectory) { if (!closeBdc && point.Distance < zero) { previousPoint = point; continue; } if (closeBdc && point.Distance >= zero) { break; } if (previousPoint != null) { foreach (var bdcPoint in reticle.BulletDropCompensator) { if ((previousPoint.DropAdjustment >= bdcPoint.Position.Y && point.DropAdjustment <= bdcPoint.Position.Y) || (previousPoint.DropAdjustment <= bdcPoint.Position.Y && point.DropAdjustment >= bdcPoint.Position.Y)) { var x = bdcPoint.Position.X + bdcPoint.TextOffset; var y = bdcPoint.Position.Y - bdcPoint.TextHeight / 2; yield return(new ReticleText() { Position = new ReticlePosition() { X = x, Y = y }, TextHeight = bdcPoint.TextHeight, Text = Math.Round(point.Distance.In(distanceUnits)).ToString(), Color = color, }); } } } previousPoint = point; } }
/// <summary> /// Constructor /// </summary> /// <param name="reticle">The reticle</param> /// <param name="canvas">The canvas</param> public ReticleDrawController(ReticleDefinition reticle, IReticleCanvas canvas) { mReticle = reticle; mCanvas = canvas; mTranslator = new CoordinateTranslator(reticle.Size.X, reticle.Size.Y, reticle.Zero.X, reticle.Zero.Y, canvas.Width, canvas.Height); }
public void RoundTripReticleElements() { var reticle = new ReticleDefinition() { Size = new ReticlePosition(150, 175, AngularUnit.MOA), Name = "Test Reticle", Zero = new ReticlePosition(75, 100, AngularUnit.MOA) }; reticle.BulletDropCompensator.Add(new ReticleBulletDropCompensatorPoint() { Position = new ReticlePosition(0, -5, AngularUnit.MOA), TextOffset = AngularUnit.MOA.New(2), }); reticle.Elements.Add(new ReticleLine() { Start = new ReticlePosition(1, 2, AngularUnit.Mil), End = new ReticlePosition(3, 4, AngularUnit.Mil), Color = "gray", LineWidth = AngularUnit.Mil.New(1.5), }); reticle.Elements.Add(new ReticleRectangle() { TopLeft = new ReticlePosition(7, 8, AngularUnit.Mil), Size = new ReticlePosition(0.5, 0.75, AngularUnit.Mil), Color = "gray", Fill = true, LineWidth = AngularUnit.Mil.New(1.5), }); reticle.Elements.Add(new ReticleText() { Position = new ReticlePosition(0, -7, AngularUnit.MOA), Text = "Text", Color = "black", TextHeight = AngularUnit.MOA.New(1), }); reticle.Elements.Add(new ReticleCircle() { Center = new ReticlePosition(5, 6, AngularUnit.MOA), Radius = AngularUnit.MOA.New(1.5), Fill = false, LineWidth = AngularUnit.MOA.New(0.25), Color = "black", }); SerializerRoundtrip serializer = new SerializerRoundtrip(); var xml = serializer.Serialize(reticle); var reticle2 = serializer.Deserialize <ReticleDefinition>(xml); reticle2.Should().NotBeNull(); reticle2.Name.Should().Be("Test Reticle"); reticle2.Size.X.Should().Be(AngularUnit.MOA.New(150)); reticle2.Size.Y.Should().Be(AngularUnit.MOA.New(175)); reticle2.Zero.X.Should().Be(AngularUnit.MOA.New(75)); reticle2.Zero.Y.Should().Be(AngularUnit.MOA.New(100)); reticle2.BulletDropCompensator.Should().HaveCount(1); reticle2.BulletDropCompensator[0].Position.X.Should().Be(AngularUnit.MOA.New(0)); reticle2.BulletDropCompensator[0].Position.Y.Should().Be(AngularUnit.MOA.New(-5)); reticle2.BulletDropCompensator[0].TextOffset.Should().Be(AngularUnit.MOA.New(2)); reticle2.Elements.Should().HaveCount(4); reticle2.Elements[0].ElementType.Should().Be(ReticleElementType.Line); reticle2.Elements[1].ElementType.Should().Be(ReticleElementType.Rectangle); reticle2.Elements[2].ElementType.Should().Be(ReticleElementType.Text); reticle2.Elements[3].ElementType.Should().Be(ReticleElementType.Circle); }
private static void TestShapes() { var reticle = new ReticleDefinition() { Name = "Test", Size = new ReticlePosition(10, 10, AngularUnit.Mil), Zero = new ReticlePosition(5, 5, AngularUnit.Mil) }; //test path 1 var path = new ReticlePath() { Color = "red", Fill = true, }; path.Elements.Add(new ReticlePathElementMoveTo() { Position = new ReticlePosition(-2.5, 0, AngularUnit.Mil), }); path.Elements.Add(new ReticlePathElementLineTo() { Position = new ReticlePosition(0, 1, AngularUnit.Mil), }); path.Elements.Add(new ReticlePathElementLineTo() { Position = new ReticlePosition(2.5, 0, AngularUnit.Mil), }); path.Elements.Add(new ReticlePathElementArc() { Position = new ReticlePosition(-2.5, 0, AngularUnit.Mil), ClockwiseDirection = false, MajorArc = true, Radius = AngularUnit.Mil.New(2.5) }); reticle.Elements.Add(path); reticle.Elements.Add(new ReticleLine() { Start = new ReticlePosition(-1, 0, AngularUnit.Mil), End = new ReticlePosition(1, 0, AngularUnit.Mil), LineWidth = AngularUnit.Mil.New(0.1), Color = "blue", }); reticle.Elements.Add(new ReticleLine() { Start = new ReticlePosition(0, -1, AngularUnit.Mil), End = new ReticlePosition(0, 1, AngularUnit.Mil), LineWidth = AngularUnit.Mil.New(0.1), Color = "blue", }); reticle.Elements.Add(new ReticleText() { Position = new ReticlePosition(0, 0, AngularUnit.Mil), TextHeight = AngularUnit.Mil.New(0.25), Color = "black", Text = "Test Text", }); Draw(reticle, "test"); }