private double GetRateFromResult(CrossResult result, string CurrencyFromId, string CurrencyToId)
        {
            var crossResultSeries = result.groups?
                                    .SelectMany(x => x.series)
                                    .Where(x => x.seriesid1 == CurrencyFromId && x.seriesid2 == CurrencyToId);

            var rate = crossResultSeries?
                       .SelectMany(x => x.resultrows)
                       .Select(i => i.value)
                       .FirstOrDefault();

            return(rate.HasValue ? rate.Value : -1);
        }
Beispiel #2
0
        /// <summary>
        ///     проверка пересечения двух граней
        /// </summary>
        /// <param name="edg"></param>
        /// <returns></returns>
        public CrossResult Cross(Edge edg)
        {
            var result = new CrossResult();

            // знаменатель
            float Z = (P2.Y - P1.Y) * (edg.P1.X - edg.P2.X) - (edg.P1.Y - edg.P2.Y) * (P2.X - P1.X);
            // числитель 1
            float Ca = (P2.Y - P1.Y) * (edg.P1.X - P1.X) - (edg.P1.Y - P1.Y) * (P2.X - P1.X);
            // числитель 2
            float Cb = (edg.P1.Y - P1.Y) * (edg.P1.X - edg.P2.X) - (edg.P1.Y - edg.P2.Y) * (edg.P1.X - P1.X);

            // если знаменатель = 0, прямые параллельны
            if (Z == 0)
            {
                // если числители и знаменатель = 0, прямые совпадают
                if (Ca == 0 && Cb == 0)
                {
                    result.IsCross = false;
                    return(result);
                }
                result.IsCross = false;
                return(result);
            }

            float Ua = Ca / Z;
            float Ub = Cb / Z;


            if (Ua < 0 || Ua > 1 || Ub < 0 || Ub > 1)
            {
                //точка пересечения вне пределов отрезков
                result.IsCross = false;
                return(result);
            }

            result.pt = new PointF(P1.X + (P2.X - P1.X) * Ub, P1.Y + (P2.Y - P1.Y) * Ub);

            return(result);
        }
Beispiel #3
0
        /// <summary>
        ///     проверка пересечения двух граней
        /// </summary>
        /// <param name="edg"></param>
        /// <returns></returns>
        public CrossResult Cross(Edge edg)
        {
            var result = new CrossResult();

            // знаменатель
            float Z = (P2.Y - P1.Y)*(edg.P1.X - edg.P2.X) - (edg.P1.Y - edg.P2.Y)*(P2.X - P1.X);
            // числитель 1
            float Ca = (P2.Y - P1.Y)*(edg.P1.X - P1.X) - (edg.P1.Y - P1.Y)*(P2.X - P1.X);
            // числитель 2
            float Cb = (edg.P1.Y - P1.Y)*(edg.P1.X - edg.P2.X) - (edg.P1.Y - edg.P2.Y)*(edg.P1.X - P1.X);

            // если знаменатель = 0, прямые параллельны
            if (Z == 0)
            {
                // если числители и знаменатель = 0, прямые совпадают
                if (Ca == 0 && Cb == 0)
                {
                    result.IsCross = false;
                    return result;
                }
                result.IsCross = false;
                return result;
            }

            float Ua = Ca/Z;
            float Ub = Cb/Z;


            if (Ua < 0 || Ua > 1 || Ub < 0 || Ub > 1)
            {
                //точка пересечения вне пределов отрезков
                result.IsCross = false;
                return result;
            }

            result.pt = new PointF(P1.X + (P2.X - P1.X)*Ub, P1.Y + (P2.Y - P1.Y)*Ub);

            return result;
        }