kopia lustrzana https://github.com/dl2alf/AirScout
247 wiersze
8.6 KiB
C#
247 wiersze
8.6 KiB
C#
// --------------------------------------------------------------------------------------------------------------------
|
|
// <copyright file="PolarPlotExamples.cs" company="OxyPlot">
|
|
// Copyright (c) 2014 OxyPlot contributors
|
|
// </copyright>
|
|
// <summary>
|
|
// Shows how to orient 0 degrees at the bottom and add E/W to indicate directions.
|
|
// </summary>
|
|
// --------------------------------------------------------------------------------------------------------------------
|
|
|
|
namespace ExampleLibrary
|
|
{
|
|
using System;
|
|
|
|
using OxyPlot;
|
|
using OxyPlot.Axes;
|
|
using OxyPlot.Series;
|
|
|
|
[Examples("Polar Plots"), Tags("Axes")]
|
|
public static class PolarPlotExamples
|
|
{
|
|
[Example("Spiral")]
|
|
public static PlotModel ArchimedeanSpiral()
|
|
{
|
|
var model = new PlotModel
|
|
{
|
|
Title = "Polar plot",
|
|
Subtitle = "Archimedean spiral with equation r(θ) = θ for 0 < θ < 6π",
|
|
PlotType = PlotType.Polar,
|
|
PlotAreaBorderThickness = new OxyThickness(0),
|
|
PlotMargins = new OxyThickness(60, 20, 4, 40)
|
|
};
|
|
model.Axes.Add(
|
|
new AngleAxis
|
|
{
|
|
MajorStep = Math.PI / 4,
|
|
MinorStep = Math.PI / 16,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid,
|
|
FormatAsFractions = true,
|
|
FractionUnit = Math.PI,
|
|
FractionUnitSymbol = "π",
|
|
Minimum = 0,
|
|
Maximum = 2 * Math.PI
|
|
});
|
|
model.Axes.Add(new MagnitudeAxis
|
|
{
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Series.Add(new FunctionSeries(t => t, t => t, 0, Math.PI * 6, 0.01));
|
|
return model;
|
|
}
|
|
|
|
[Example("Spiral2")]
|
|
public static PlotModel ArchimedeanSpiral2()
|
|
{
|
|
var model = ArchimedeanSpiral();
|
|
model.Title += "(reversed angle axis)";
|
|
var angleAxis = (AngleAxis)model.Axes[0];
|
|
angleAxis.StartAngle = 360;
|
|
angleAxis.EndAngle = 0;
|
|
return model;
|
|
}
|
|
|
|
[Example("Spiral with magnitude axis min and max")]
|
|
public static PlotModel ArchimedeanSpiral3()
|
|
{
|
|
var model = ArchimedeanSpiral();
|
|
model.Title += " (axis Minimum = 10 and Maximum = 20)";
|
|
var magnitudeAxis = (MagnitudeAxis)model.Axes[1];
|
|
magnitudeAxis.Minimum = 10;
|
|
magnitudeAxis.Maximum = 20;
|
|
return model;
|
|
}
|
|
|
|
[Example("Angle axis with offset angle")]
|
|
public static PlotModel OffsetAngles()
|
|
{
|
|
var model = new PlotModel
|
|
{
|
|
Title = "Offset angle axis",
|
|
PlotType = PlotType.Polar,
|
|
PlotAreaBorderThickness = new OxyThickness(0),
|
|
PlotMargins = new OxyThickness(60, 20, 4, 40)
|
|
};
|
|
|
|
var angleAxis = new AngleAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = Math.PI * 2,
|
|
MajorStep = Math.PI / 4,
|
|
MinorStep = Math.PI / 16,
|
|
StringFormat = "0.00",
|
|
StartAngle = 30,
|
|
EndAngle = 390
|
|
};
|
|
model.Axes.Add(angleAxis);
|
|
model.Axes.Add(new MagnitudeAxis());
|
|
model.Series.Add(new FunctionSeries(t => t, t => t, 0, Math.PI * 6, 0.01));
|
|
|
|
// Subscribe to the mouse down event on the line series.
|
|
model.MouseDown += (s, e) =>
|
|
{
|
|
var increment = 0d;
|
|
|
|
// Increment and decrement must be in degrees (corresponds to the StartAngle and EndAngle properties).
|
|
if (e.ChangedButton == OxyMouseButton.Left)
|
|
{
|
|
increment = 15;
|
|
}
|
|
|
|
if (e.ChangedButton == OxyMouseButton.Right)
|
|
{
|
|
increment = -15;
|
|
}
|
|
|
|
if (Math.Abs(increment) > double.Epsilon)
|
|
{
|
|
angleAxis.StartAngle += increment;
|
|
angleAxis.EndAngle += increment;
|
|
model.InvalidatePlot(false);
|
|
e.Handled = true;
|
|
}
|
|
};
|
|
|
|
return model;
|
|
}
|
|
|
|
[Example("Semi-circle")]
|
|
public static PlotModel SemiCircle()
|
|
{
|
|
var model = new PlotModel
|
|
{
|
|
Title = "Semi-circle polar plot",
|
|
PlotType = PlotType.Polar,
|
|
PlotAreaBorderThickness = new OxyThickness(0),
|
|
PlotMargins = new OxyThickness(60, 20, 4, 40)
|
|
};
|
|
model.Axes.Add(
|
|
new AngleAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = 180,
|
|
MajorStep = 45,
|
|
MinorStep = 9,
|
|
StartAngle = 0,
|
|
EndAngle = 180,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Axes.Add(new MagnitudeAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = 1,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Series.Add(new FunctionSeries(x => Math.Sin(x / 180 * Math.PI), t => t, 0, 180, 0.01));
|
|
return model;
|
|
}
|
|
|
|
[Example("Semi-circle offset angle axis range")]
|
|
public static PlotModel SemiCircleOffsetAngleAxisRange()
|
|
{
|
|
var model = new PlotModel
|
|
{
|
|
Title = "Semi-circle polar plot",
|
|
Subtitle = "Angle axis range offset to -180 - 180",
|
|
PlotType = PlotType.Polar,
|
|
PlotAreaBorderThickness = new OxyThickness(0),
|
|
PlotMargins = new OxyThickness(60, 20, 4, 40)
|
|
};
|
|
model.Axes.Add(
|
|
new AngleAxis
|
|
{
|
|
Minimum = -180,
|
|
Maximum = 180,
|
|
MajorStep = 45,
|
|
MinorStep = 9,
|
|
StartAngle = 0,
|
|
EndAngle = 360,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Axes.Add(new MagnitudeAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = 1,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Series.Add(new FunctionSeries(x => Math.Sin(x / 180 * Math.PI), t => t, 0, 180, 0.01));
|
|
return model;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Shows how to orient 0 degrees at the bottom and add E/W to indicate directions.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[Example("East/west directions")]
|
|
public static PlotModel EastWestDirections()
|
|
{
|
|
var model = new PlotModel
|
|
{
|
|
Title = "East/west directions",
|
|
PlotType = PlotType.Polar,
|
|
PlotAreaBorderThickness = new OxyThickness(0),
|
|
PlotMargins = new OxyThickness(60, 20, 4, 40)
|
|
};
|
|
model.Axes.Add(
|
|
new AngleAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = 360,
|
|
MajorStep = 30,
|
|
MinorStep = 30,
|
|
StartAngle = -90,
|
|
EndAngle = 270,
|
|
LabelFormatter = angle =>
|
|
{
|
|
if (angle > 0 && angle < 180)
|
|
{
|
|
return angle + "E";
|
|
}
|
|
|
|
if (angle > 180)
|
|
{
|
|
return (360 - angle) + "W";
|
|
}
|
|
|
|
return angle.ToString();
|
|
},
|
|
MajorGridlineStyle = LineStyle.Dot,
|
|
MinorGridlineStyle = LineStyle.None
|
|
});
|
|
model.Axes.Add(new MagnitudeAxis
|
|
{
|
|
Minimum = 0,
|
|
Maximum = 1,
|
|
MajorGridlineStyle = LineStyle.Solid,
|
|
MinorGridlineStyle = LineStyle.Solid
|
|
});
|
|
model.Series.Add(new FunctionSeries(x => Math.Sin(x / 180 * Math.PI), t => t, 0, 180, 0.01));
|
|
return model;
|
|
}
|
|
}
|
|
} |