int CEllipse::GetLeftIntersect(int dx, int dy) { ASSERT(dy >= 0); // We are sure dy is always greater or equal to 0 in our case // Crude conditions to filter every case that won't intersect at all or not on the left if (dx > -m_rx && dx < m_rx /*&& dy > -m_2ry*/ && dy < m_2ry) { const size_t nCache = nIntersectCacheLineSize * dy + dx + m_rx - 1; int iRes = m_intersectCache[nCache]; if (iRes == NOT_CACHED) { iRes = (dx > 0) ? NO_INTERSECT_INNER : NO_INTERSECT_OUTER; double dx_2rx = double(dx) / m_2rx; double dy_2ry = double(dy) / m_2ry; double C = 1.0 / (dx_2rx * dx_2rx + dy_2ry * dy_2ry) - 1.0; // We might not intersect even if the above conditions are true if (C >= 0.0) { double sqrtC = std::sqrt(C); // Make sure that we are on the left for real if (m_rx * (dx_2rx - dy_2ry * sqrtC) < std::min(0, dx)) { iRes = int(std::floor(m_ry * (dy_2ry + dx_2rx * sqrtC))); // Account for possible rounding if (GetArc(iRes) < GetArc(iRes - dy) - dx) { iRes--; } } } m_intersectCache[nCache] = iRes; } return iRes; } return (dx > 0) ? NO_INTERSECT_INNER : NO_INTERSECT_OUTER; }
// 更新一个节点 void UpdateArc(RealMap * rm, int src, int des, int value,int type) { RMNode * tmp; // 判断要插入的两个节点是否存在 if(!IfNodeExist(rm, des) || !IfNodeExist(rm, src)) { printf("Error: des node does not exist!\n"); return; } // 判断要插入的两个节点是否存在 if(!IfArcExist(rm, src, des)) { printf("Error: Arc does not exist!\n"); return; } tmp = GetArc(rm, src, des); tmp->value = value; tmp->type = type; }