Пример #1
0
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;
}
Пример #2
0
// 更新一个节点
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;
}