예제 #1
0
BOOL bcg_IsFullEllipse(double dblStartAngle, double dblFinishAngle, BOOL bIsClockwise, double dblPrecision)
{
	double dblAngle1 = bcg_normalize_deg (dblStartAngle);
	double dblAngle2 = bcg_normalize_deg (dblFinishAngle);

	if (fabs(dblAngle1 - dblAngle2) < FLT_EPSILON && fabs(dblStartAngle - dblFinishAngle) > FLT_EPSILON)
	{
		return TRUE;
	}

	if (bIsClockwise)
	{
		if (dblAngle1 < dblAngle2)
		{
			dblAngle1 += 360.0;
		}
	}
	else
	{
		if (dblAngle2 < dblAngle1)
		{
			dblAngle2 += 360.0;
		}
	}

	if (dblAngle2 < dblAngle1)
	{
		double t = dblAngle1;
		dblAngle1 = dblAngle2;
		dblAngle2 = t;
	}

	return (dblAngle2 - dblAngle1) <= dblPrecision;
}
//***************************************************************************************
int CBCGPRadialMenuObject::HitTestShape(const CBCGPPoint& pt)
{
	CBCGPRect rect = m_rect;
	if (rect.Width() < rect.Height())
	{
		rect.top += (rect.Height() - rect.Width()) / 2;
		rect.bottom = rect.top + rect.Width();
	}
	else if (rect.Height() < rect.Width())
	{
		rect.left += (rect.Width() - rect.Height()) / 2;
		rect.right = rect.left + rect.Height();
	}

	rect.DeflateRect(2., 2.);

	rect.right -= m_nShadowDepth;
	rect.bottom -= m_nShadowDepth;

	const double radius = rect.Width() / 2;
	const double radiusSmall = INTERNAL_PART * rect.Width() + 1.0;
	const CBCGPPoint center = rect.CenterPoint();

	double dblDistanceToCenter = bcg_distance(pt, center);

	if (dblDistanceToCenter > radius)
	{
		return -1;
	}
	
	const int nItems = (int)m_arItems.GetSize();
	if (dblDistanceToCenter <= radiusSmall)
	{
		return m_bHasCenterButton ? nItems - 1 : -1;
	}

	const int nCircleItems = m_bHasCenterButton ? nItems - 1 : nItems;
	if (nCircleItems == 0)
	{
		return -1;
	}

	double dblDeltaAngle = 360. / nCircleItems;
	double dblStartAngle = 90. - dblDeltaAngle / 2;
	double dblAngle = bcg_normalize_deg(bcg_rad2deg(acos((pt.x - center.x) / dblDistanceToCenter)));
	if (pt.y > center.y)
	{
		dblAngle = 360 - dblAngle;
	}

	int nHit = (int)((dblAngle - dblStartAngle) / dblDeltaAngle);
	if (dblAngle < dblStartAngle)
	{
		nHit = nCircleItems - 1 - (int)((dblStartAngle - dblAngle) / dblDeltaAngle);
	}

	return nHit;
}