Пример #1
0
        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);
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
    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();
    }