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); }
/// <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); }
/// <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; }