本文整理汇总了C#中OxyPlot.ScreenPoint类的典型用法代码示例。如果您正苦于以下问题:C# ScreenPoint类的具体用法?C# ScreenPoint怎么用?C# ScreenPoint使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
ScreenPoint类属于OxyPlot命名空间,在下文中一共展示了ScreenPoint类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: FindNearestPointOnPolyline
/// <summary>
/// Finds the nearest point on the specified polyline.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="points">The points.</param>
/// <returns>The nearest point.</returns>
public static ScreenPoint FindNearestPointOnPolyline(ScreenPoint point, IList<ScreenPoint> points)
{
double minimumDistance = double.MaxValue;
var nearestPoint = default(ScreenPoint);
for (int i = 0; i + 1 < points.Count; i++)
{
var p1 = points[i];
var p2 = points[i + 1];
if (ScreenPoint.IsUndefined(p1) || ScreenPoint.IsUndefined(p2))
{
continue;
}
// Find the nearest point on the line segment.
var nearestPointOnSegment = FindPointOnLine(point, p1, p2);
if (ScreenPoint.IsUndefined(nearestPointOnSegment))
{
continue;
}
double l2 = (point - nearestPointOnSegment).LengthSquared;
if (l2 < minimumDistance)
{
nearestPoint = nearestPointOnSegment;
minimumDistance = l2;
}
}
return nearestPoint;
}
示例2: GetPolygon
/// <summary>
/// Gets the polygon outline of the specified rotated and aligned box.
/// </summary>
/// <param name="size">The size of the box.</param>
/// <param name="origin">The origin of the box.</param>
/// <param name="angle">The rotation angle of the box.</param>
/// <param name="horizontalAlignment">The horizontal alignment of the box.</param>
/// <param name="verticalAlignment">The vertical alignment of the box.</param>
/// <returns>A sequence of points defining the polygon outline of the box.</returns>
public static IEnumerable<ScreenPoint> GetPolygon(this OxySize size, ScreenPoint origin, double angle, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment)
{
var u = horizontalAlignment == HorizontalAlignment.Left ? 0 : horizontalAlignment == HorizontalAlignment.Center ? 0.5 : 1;
var v = verticalAlignment == VerticalAlignment.Top ? 0 : verticalAlignment == VerticalAlignment.Middle ? 0.5 : 1;
var offset = new ScreenVector(u * size.Width, v * size.Height);
// the corners of the rectangle
var p0 = new ScreenVector(0, 0) - offset;
var p1 = new ScreenVector(size.Width, 0) - offset;
var p2 = new ScreenVector(size.Width, size.Height) - offset;
var p3 = new ScreenVector(0, size.Height) - offset;
if (angle != 0)
{
var theta = angle * Math.PI / 180.0;
var costh = Math.Cos(theta);
var sinth = Math.Sin(theta);
Func<ScreenVector, ScreenVector> rotate = p => new ScreenVector((costh * p.X) - (sinth * p.Y), (sinth * p.X) + (costh * p.Y));
p0 = rotate(p0);
p1 = rotate(p1);
p2 = rotate(p2);
p3 = rotate(p3);
}
yield return origin + p0;
yield return origin + p1;
yield return origin + p2;
yield return origin + p3;
}
示例3: DrawMathText
/// <summary>
/// Draws or measures text containing sub- and superscript.
/// </summary>
/// <param name="rc">The render context.</param>
/// <param name="pt">The point.</param>
/// <param name="text">The text.</param>
/// <param name="textColor">Color of the text.</param>
/// <param name="fontFamily">The font family.</param>
/// <param name="fontSize">The font size.</param>
/// <param name="fontWeight">The font weight.</param>
/// <param name="angle">The angle.</param>
/// <param name="ha">The horizontal alignment.</param>
/// <param name="va">The vertical alignment.</param>
/// <param name="maxsize">The maximum size of the text.</param>
/// <param name="measure">Measure the size of the text if set to <c>true</c>.</param>
/// <returns>The size of the text.</returns>
/// <example>Subscript: H_{2}O
/// Superscript: E=mc^{2}
/// Both: A^{2}_{i,j}</example>
public static OxySize DrawMathText(
this IRenderContext rc,
ScreenPoint pt,
string text,
OxyColor textColor,
string fontFamily,
double fontSize,
double fontWeight,
double angle,
HorizontalAlignment ha,
VerticalAlignment va,
OxySize? maxsize,
bool measure)
{
if (string.IsNullOrEmpty(text))
{
return OxySize.Empty;
}
if (text.Contains("^{") || text.Contains("_{"))
{
double x = pt.X;
double y = pt.Y;
// Measure
var size = InternalDrawMathText(rc, x, y, text, textColor, fontFamily, fontSize, fontWeight, true, angle);
switch (ha)
{
case HorizontalAlignment.Right:
x -= size.Width;
break;
case HorizontalAlignment.Center:
x -= size.Width * 0.5;
break;
}
switch (va)
{
case VerticalAlignment.Bottom:
y -= size.Height;
break;
case VerticalAlignment.Middle:
y -= size.Height * 0.5;
break;
}
InternalDrawMathText(rc, x, y, text, textColor, fontFamily, fontSize, fontWeight, false, angle);
return measure ? size : OxySize.Empty;
}
rc.DrawText(pt, text, textColor, fontFamily, fontSize, fontWeight, angle, ha, va, maxsize);
if (measure)
{
return rc.MeasureText(text, fontFamily, fontSize, fontWeight);
}
return OxySize.Empty;
}
示例4: TrackerHitResult
public TrackerHitResult(Series.Series series, DataPoint dp, ScreenPoint sp, object item = null, double index = -1, string text = null)
{
this.DataPoint = dp;
this.Position = sp;
this.Item = item;
this.Index = index;
this.Series = series;
this.Text = text;
}
示例5: TrackerHitResult
/// <summary>
/// Initializes a new instance of the <see cref="TrackerHitResult"/> class.
/// </summary>
/// <param name="series">The series.</param>
/// <param name="dp">The data point.</param>
/// <param name="sp">The screen point.</param>
/// <param name="item">The item.</param>
/// <param name="index">The index.</param>
/// <param name="text">The text.</param>
public TrackerHitResult(OxyPlot.Series.Series series, IDataPoint dp, ScreenPoint sp, object item = null, double index = -1, string text = null)
{
this.DataPoint = dp;
this.Position = sp;
this.Item = item;
this.Index = index;
this.Series = series;
this.Text = text;
var ds = series as DataPointSeries;
if (ds != null)
{
this.XAxis = ds.XAxis;
this.YAxis = ds.YAxis;
}
}
示例6: DrawTextAlignment
public static PlotModel DrawTextAlignment()
{
var model = new PlotModel();
model.Annotations.Add(new DelegateAnnotation(rc =>
{
const double FontSize = 20d;
for (var ha = HorizontalAlignment.Left; ha <= HorizontalAlignment.Right; ha++)
{
for (var va = VerticalAlignment.Top; va <= VerticalAlignment.Bottom; va++)
{
var origin = new ScreenPoint((((int)ha + 1) * 200) + 20, (((int)va + 1) * FontSize * 3) + 20);
rc.FillCircle(origin, 3, OxyColors.Blue);
rc.DrawText(origin, ha + "-" + va, OxyColors.Black, fontSize: FontSize, horizontalAlignment: ha, verticalAlignment: va);
}
}
}));
return model;
}
示例7: Render
/// <summary>
/// Renders the series on the specified rendering context.
/// </summary>
/// <param name="rc">The rendering context.</param>
/// <param name="model">The owner plot model.</param>
public override void Render(IRenderContext rc, PlotModel model)
{
if (Points.Count == 0)
{
return;
}
if (Points.Count % 2 != 0)
{
throw new InvalidOperationException("The number of points should be even.");
}
if (this.XAxis == null || this.YAxis == null)
{
throw new InvalidOperationException("Axis has not been defined.");
}
var clippingRect = GetClippingRect();
var screenPoints = Points.Select(this.Transform).ToList();
var verticalLines = new List<ScreenPoint>();
for (int i = 0; i < screenPoints.Count; i += 2)
{
if (screenPoints[i].DistanceToSquared(screenPoints[i + 1]) < this.StrokeThickness)
{
screenPoints[i] = new ScreenPoint(screenPoints[i].X - (this.StrokeThickness * 0.5), screenPoints[i].Y);
screenPoints[i + 1] = new ScreenPoint(screenPoints[i].X + (this.StrokeThickness * 0.5), screenPoints[i].Y);
}
if (this.ShowVerticals && i > 0 && Math.Abs(screenPoints[i - 1].X - screenPoints[i].X) < this.Epsilon)
{
verticalLines.Add(screenPoints[i - 1]);
verticalLines.Add(screenPoints[i]);
}
}
rc.DrawClippedLineSegments(clippingRect, screenPoints, this.ActualColor, this.StrokeThickness, this.LineStyle.GetDashArray(), this.LineJoin, false);
rc.DrawClippedLineSegments(clippingRect, verticalLines, this.ActualColor, this.StrokeThickness / 3, LineStyle.Dash.GetDashArray(), this.LineJoin, false);
rc.DrawMarkers(screenPoints, clippingRect, this.MarkerType, null, this.MarkerSize, this.MarkerFill, this.MarkerStroke, this.MarkerStrokeThickness);
}
示例8: DrawMathTextAlignment
public static PlotModel DrawMathTextAlignment()
{
var text = "A_{2}^{3}B";
var model = new PlotModel();
model.Annotations.Add(new DelegateAnnotation(rc =>
{
const string FontFamily = "Arial";
const double FontSize = 20d;
const double FontWeight = FontWeights.Normal;
for (var ha = HorizontalAlignment.Left; ha <= HorizontalAlignment.Right; ha++)
{
for (var va = VerticalAlignment.Top; va <= VerticalAlignment.Bottom; va++)
{
var origin = new ScreenPoint((((int)ha + 1) * 200) + 20, (((int)va + 1) * FontSize * 3) + 20);
rc.FillCircle(origin, 3, OxyColors.Blue);
rc.DrawMathText(origin, text, OxyColors.Black, FontFamily, FontSize, FontWeight, 0, ha, va);
}
}
}));
return model;
}
示例9: FindPointOnLine
/// <summary>
/// Finds the point on line.
/// </summary>
/// <param name="p">The point.</param>
/// <param name="p1">The first point on the line.</param>
/// <param name="p2">The second point on the line.</param>
/// <returns>The nearest point on the line.</returns>
/// <remarks>See <a href="http://paulbourke.net/geometry/pointlineplane/">Bourke</a>.</remarks>
public static ScreenPoint FindPointOnLine(ScreenPoint p, ScreenPoint p1, ScreenPoint p2)
{
double dx = p2.x - p1.x;
double dy = p2.y - p1.y;
double u = FindPositionOnLine(p, p1, p2);
if (double.IsNaN(u))
{
u = 0;
}
if (u < 0)
{
u = 0;
}
if (u > 1)
{
u = 1;
}
return new ScreenPoint(p1.x + (u * dx), p1.y + (u * dy));
}
示例10: GetNearestPoint
/// <summary>
/// Gets the point on the series that is nearest the specified point.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="interpolate">Interpolate the series if this flag is set to <c>true</c>.</param>
/// <returns>A TrackerHitResult for the current hit.</returns>
public override TrackerHitResult GetNearestPoint(ScreenPoint point, bool interpolate)
{
var points = this.Points;
if (points == null)
{
return null;
}
var spn = default(ScreenPoint);
var dpn = default(DataPoint);
double index = -1;
double minimumDistance = double.MaxValue;
for (int i = 0; i + 1 < points.Count; i += 2)
{
var p1 = points[i];
var p2 = points[i + 1];
if (!this.IsValidPoint(p1) || !this.IsValidPoint(p2))
{
continue;
}
var sp1 = this.Transform(p1);
var sp2 = this.Transform(p2);
// Find the nearest point on the line segment.
var spl = ScreenPointHelper.FindPointOnLine(point, sp1, sp2);
if (ScreenPoint.IsUndefined(spl))
{
// P1 && P2 coincident
continue;
}
double l2 = (point - spl).LengthSquared;
if (l2 < minimumDistance)
{
double u = (spl - sp1).Length / (sp2 - sp1).Length;
dpn = new DataPoint(p1.X + (u * (p2.X - p1.X)), p1.Y + (u * (p2.Y - p1.Y)));
spn = spl;
minimumDistance = l2;
index = i + u;
}
}
if (minimumDistance < double.MaxValue)
{
return new TrackerHitResult
{
Series = this,
DataPoint = dpn,
Position = spn,
Item = this.GetItem((int)index),
Index = index
};
}
return null;
}
示例11: GetNearestPoint
/// <summary>
/// Gets the point on the series that is nearest the specified point.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="interpolate">
/// Interpolate the series if this flag is set to <c>true</c>.
/// </param>
/// <returns>A TrackerHitResult for the current hit.</returns>
public override TrackerHitResult GetNearestPoint(ScreenPoint point, bool interpolate)
{
foreach (var v in this.Values)
{
if (double.IsNaN(v) || v < this.XAxis.ActualMinimum || v > this.XAxis.ActualMaximum)
{
continue;
}
double x = this.XAxis.Transform(v);
var r = new OxyRect(
x - this.symbolSize.Width / 2,
this.symbolPosition - this.symbolSize.Height,
this.symbolSize.Width,
this.symbolSize.Height);
if (r.Contains(point))
{
var text = StringHelper.Format(this.ActualCulture, this.TrackerFormatString, null, this.Title, v);
return new TrackerHitResult(
this,
new DataPoint(v, double.NaN),
new ScreenPoint(x, this.symbolPosition - this.symbolSize.Height)) { Text = text };
}
}
return null;
}
示例12: Render
/// <summary>
/// Renders the annotation on the specified context.
/// </summary>
/// <param name="rc">The render context.</param>
public override void Render(IRenderContext rc)
{
base.Render(rc);
var lon0 = this.XAxis.ActualMinimum;
var lon1 = this.XAxis.ActualMaximum;
var lat0 = this.YAxis.ActualMinimum;
var lat1 = this.YAxis.ActualMaximum;
// the desired number of tiles horizontally
double tilesx = this.PlotModel.Width / this.TileSize;
// calculate the desired zoom level
var n = tilesx / (((lon1 + 180) / 360) - ((lon0 + 180) / 360));
var zoom = (int)Math.Round(Math.Log(n) / Math.Log(2));
if (zoom < this.MinZoomLevel)
{
zoom = this.MinZoomLevel;
}
if (zoom > this.MaxZoomLevel)
{
zoom = this.MaxZoomLevel;
}
// find tile coordinates for the corners
double x0, y0;
LatLonToTile(lat0, lon0, zoom, out x0, out y0);
double x1, y1;
LatLonToTile(lat1, lon1, zoom, out x1, out y1);
double xmax = Math.Max(x0, x1);
double xmin = Math.Min(x0, x1);
double ymax = Math.Max(y0, y1);
double ymin = Math.Min(y0, y1);
var clippingRectangle = this.GetClippingRect();
// Add the tiles
for (var x = (int)xmin; x < xmax; x++)
{
for (var y = (int)ymin; y < ymax; y++)
{
string uri = this.GetTileUri(x, y, zoom);
var img = this.GetImage(uri, rc.RendersToScreen);
if (img == null)
{
continue;
}
// transform from tile coordinates to lat/lon
double latitude0, latitude1, longitude0, longitude1;
TileToLatLon(x, y, zoom, out latitude0, out longitude0);
TileToLatLon(x + 1, y + 1, zoom, out latitude1, out longitude1);
// transform from lat/lon to screen coordinates
var s00 = this.Transform(longitude0, latitude0);
var s11 = this.Transform(longitude1, latitude1);
var r = OxyRect.Create(s00.X, s00.Y, s11.X, s11.Y);
// draw the image
rc.DrawClippedImage(clippingRectangle, img, r.Left, r.Top, r.Width, r.Height, this.Opacity, true);
}
}
// draw the copyright notice
var p = new ScreenPoint(clippingRectangle.Right - 5, clippingRectangle.Bottom - 5);
var textSize = rc.MeasureText(this.CopyrightNotice, this.ActualFont, this.ActualFontSize, this.ActualFontWeight);
rc.DrawRectangle(new OxyRect(p.X - textSize.Width - 2, p.Y - textSize.Height - 2, textSize.Width + 4, textSize.Height + 4), OxyColor.FromAColor(200, OxyColors.White), OxyColors.Undefined);
rc.DrawText(
p,
this.CopyrightNotice,
OxyColors.Black,
this.ActualFont,
this.ActualFontSize,
this.ActualFontWeight,
0,
HorizontalAlignment.Right,
VerticalAlignment.Bottom);
}
示例13: GetSeriesFromPoint
public DataSeries GetSeriesFromPoint(ScreenPoint pt, double limit)
{
return Model.GetSeriesFromPoint(pt, limit);
}
示例14: RenderPointLabels
/// <summary>
/// Renders the point labels.
/// </summary>
/// <param name="rc">The render context.</param>
/// <param name="clippingRect">The clipping rect.</param>
protected void RenderPointLabels(IRenderContext rc, OxyRect clippingRect)
{
int index = -1;
foreach (var point in this.Points)
{
index++;
if (!this.IsValidPoint(point, this.XAxis, this.YAxis))
{
continue;
}
var pt = this.XAxis.Transform(point.X, point.Y, this.YAxis);
pt.Y -= this.LabelMargin;
if (!clippingRect.Contains(pt))
{
continue;
}
var s = StringHelper.Format(
this.ActualCulture, this.LabelFormatString, this.GetItem(index), point.X, point.Y);
#if SUPPORTLABELPLACEMENT
switch (this.LabelPlacement)
{
case LabelPlacement.Inside:
pt = new ScreenPoint(rect.Right - this.LabelMargin, (rect.Top + rect.Bottom) / 2);
ha = HorizontalTextAlign.Right;
break;
case LabelPlacement.Middle:
pt = new ScreenPoint((rect.Left + rect.Right) / 2, (rect.Top + rect.Bottom) / 2);
ha = HorizontalTextAlign.Center;
break;
case LabelPlacement.Base:
pt = new ScreenPoint(rect.Left + this.LabelMargin, (rect.Top + rect.Bottom) / 2);
ha = HorizontalTextAlign.Left;
break;
default: // Outside
pt = new ScreenPoint(rect.Right + this.LabelMargin, (rect.Top + rect.Bottom) / 2);
ha = HorizontalTextAlign.Left;
break;
}
#endif
rc.DrawClippedText(
clippingRect,
pt,
s,
this.ActualTextColor,
this.ActualFont,
this.ActualFontSize,
this.ActualFontWeight,
0,
HorizontalTextAlign.Center,
VerticalTextAlign.Bottom);
}
}
示例15: DistanceTo
/// <summary>
/// Gets the distance to the specified point.
/// </summary>
/// <param name="point">
/// The point.
/// </param>
/// <returns>
/// The distance.
/// </returns>
public double DistanceTo(ScreenPoint point)
{
double dx = point.x - this.x;
double dy = point.y - this.y;
return Math.Sqrt((dx * dx) + (dy * dy));
}