Ejemplo n.º 1
0
void CWedgeDrawer::RegenerateGeometry()
{
	// Points on horizontal line:
	// x^2 + y^2 = r^2      and     y = m
	// => x^2 = r^2 - m^2
	D2D1_POINT_2F p0 = D2D1::Point2F(
		(FLOAT)sqrt(mInnerRadius*mInnerRadius - mMarginThickness*mMarginThickness),
		(FLOAT)mMarginThickness);
	D2D1_POINT_2F p3 = D2D1::Point2F(
		(FLOAT)sqrt(mOuterRadius*mOuterRadius - mMarginThickness*mMarginThickness),
		(FLOAT)mMarginThickness);

	D2D1::Matrix3x2F rotation = D2D1::Matrix3x2F::Rotation((FLOAT)mSweep);
	D2D1_POINT_2F p1 = rotation.TransformPoint(
		D2D1::Point2F((FLOAT)mInnerRadius, -(FLOAT)mMarginThickness));
	D2D1_POINT_2F p2 = rotation.TransformPoint(
		D2D1::Point2F((FLOAT)mOuterRadius, -(FLOAT)mMarginThickness));

	// Points on other line:
	// x^2 + y^2 = r^2     &     y = mx + b
	// => m^2+1!=0 (i.e. angles not equal to 90 degrees)
	//    x = (-sqrt(-b^2+m^2 r^2+r^2)-b m)/(m^2+1)
	//    y = (b-m sqrt(-b^2+m^2 r^2+r^2))/(m^2+1)

	// Create the figure
	mGeometry.Release();
	mFactory->CreatePathGeometry(&mGeometry);
	{
		CComPtr<ID2D1GeometrySink> sink;
		mGeometry->Open(&sink);
		sink->BeginFigure(p0, D2D1_FIGURE_BEGIN_FILLED);
		sink->AddArc(D2D1::ArcSegment(p1, 
			D2D1::SizeF((FLOAT)mInnerRadius, (FLOAT)mInnerRadius), 0,
			D2D1_SWEEP_DIRECTION_CLOCKWISE, D2D1_ARC_SIZE_SMALL));
		sink->AddLine(p2);
		sink->AddArc(D2D1::ArcSegment(p3, 
			D2D1::SizeF((FLOAT)mOuterRadius, (FLOAT)mOuterRadius), 0,
			D2D1_SWEEP_DIRECTION_COUNTER_CLOCKWISE, D2D1_ARC_SIZE_SMALL));
		sink->EndFigure(D2D1_FIGURE_END_CLOSED);
		sink->Close();
	}
}