public void AngleBetween() { const double epsilon = 0.0001; const double angle = 63.435; // polar angle of (1,2) Assert.AreEqual(0, pointD.AngleBetween(pointD)); Assert.AreEqual(0, PointD.Empty.AngleBetween(pointD, pointD)); Assert.AreEqual(Math.PI, PointD.Empty.AngleBetween(new PointD(1, 0), new PointD(-2, 0))); Assert.AreEqual(-angle, pointD.AngleBetween(new PointD(2, 0)) * Angle.RadiansToDegrees, epsilon); Assert.AreEqual(90.0 - angle, pointD.AngleBetween(new PointD(0, 2)) * Angle.RadiansToDegrees, epsilon); Assert.AreEqual(0, pointF.AngleBetween(pointF)); Assert.AreEqual(0, PointF.Empty.AngleBetween(pointF, pointF)); Assert.AreEqual(Math.PI, PointF.Empty.AngleBetween(new PointF(1, 0), new PointF(-2, 0))); Assert.AreEqual(-angle, pointF.AngleBetween(new PointF(2, 0)) * Angle.RadiansToDegrees, epsilon); Assert.AreEqual(90.0 - angle, pointF.AngleBetween(new PointF(0, 2)) * Angle.RadiansToDegrees, epsilon); Assert.AreEqual(0, pointI.AngleBetween(pointI)); Assert.AreEqual(0, PointI.Empty.AngleBetween(pointI, pointI)); Assert.AreEqual(Math.PI, PointI.Empty.AngleBetween(new PointI(1, 0), new PointI(-2, 0))); Assert.AreEqual(-angle, pointI.AngleBetween(new PointI(2, 0)) * Angle.RadiansToDegrees, epsilon); Assert.AreEqual(90.0 - angle, pointI.AngleBetween(new PointI(0, 2)) * Angle.RadiansToDegrees, epsilon); }
/// <summary> /// Creates the <see cref="NodeArc"/> for the specified target node.</summary> /// <param name="target"> /// The <see cref="Graph"/> node whose <see cref="NodeArc"/> to create.</param> /// <returns> /// A new <see cref="NodeArc"/> for the specified <paramref name="target"/> node.</returns> private NodeArc CreateNodeArc(T target) { // compute world coordinates of target node PointD targetWorld = Graph.GetWorldLocation(target); PointD[] region = Graph.GetWorldRegion(target); // alpha is angle from source to center of target node LineD line = new LineD(_sourceWorld, targetWorld); double alpha = line.Angle; // use central location with 1° arc if no region available if (region == null) { const double arc = Angle.DegreesToRadians; alpha -= arc / 2; if (alpha <= -Math.PI) { alpha += 2 * Math.PI; } return(new NodeArc(alpha, arc, line.Length)); } double distance = Double.MaxValue; double minBeta = 0, maxBeta = 0; foreach (PointD vertex in region) { // find extreme relative angles for any region vertex double beta = _sourceWorld.AngleBetween(targetWorld, vertex); if (beta <= minBeta) { minBeta = beta; } else if (beta >= maxBeta) { maxBeta = beta; } // find smallest distance for any region vertex double vertexDistance = (vertex - _sourceWorld).Length; if (distance > vertexDistance) { distance = vertexDistance; } } return(new NodeArc(alpha + minBeta, maxBeta - minBeta, distance)); }
public void Rotate(decimal sx, decimal sy, List <PointShapeViewModel> points, ref decimal rotateAngle) { var centerX = Bounds.CenterX; var centerY = Bounds.CenterY; var p0 = new PointD(centerX, centerY); var p1 = new PointD(sx, sy); var angle = p0.AngleBetween(p1) - 270m; var delta = angle - rotateAngle; var radians = delta * ((decimal)Math.PI / 180m); var matrix = MatrixD.Rotation(radians, centerX, centerY); TransformPoints(ref matrix, points); rotateAngle = angle; Update(); }