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