我一直试图在C#中绘制一个带有透明孔和渐变边缘的环(厚度环),但收效甚微.有没有人对如何做到这一点有任何建议?
这是一个很好的Blend Utility
这是最终结果 - 感谢BlueMonkMN
Rectangle GetSquareRec(double radius, int x, int y) { double r = radius; double side = Math.Sqrt(Math.Pow(r, 2) / 2); Rectangle rec = new Rectangle(x - ((int)side), y - ((int)side), (int)(side * 2) + x, (int)(side * 2) + y); return rec; } void Form1_Paint(object sender, PaintEventArgs e) { Graphics gTarget = e.Graphics; gTarget.SmoothingMode = SmoothingMode.AntiAlias; GraphicsPath pTemp = new GraphicsPath(); Rectangle r = GetSquareRec(200, 225, 225); pTemp.AddEllipse(r); pTemp.AddEllipse(GetSquareRec(50, 225, 225)); Color[] colors = new Color[5]; colors[0] = Color.FromArgb(192, 192, 192); colors[1] = Color.FromArgb(105, 0, 0); colors[2] = Color.FromArgb(169, 169, 169); colors[3] = Color.FromArgb(0, 0, 0); colors[4] = Color.FromArgb(0, 0, 0); float[] positions = new float[5]; positions[0] = 0f; positions[1] = 0.1f; positions[2] = 0.35f; positions[3] = 0.5f; positions[4] = 1f; ColorBlend Cb = new ColorBlend(); Cb.Colors = colors; Cb.Positions = positions; PathGradientBrush pgb = new PathGradientBrush(pTemp); pgb.InterpolationColors = Cb; pgb.CenterPoint = new PointF(r.X + (r.Width / 2), r.Y + (r.Height / 2)); gTarget.FillPath(pgb, pTemp); }
http://www.freeimagehosting.net/uploads/th.515733e62e.jpg
这就是我在滚动游戏开发套件中的表现:
pTemp = new GraphicsPath(); pTemp.AddEllipse(Start.X, Start.Y, End.X - Start.X, End.Y - Start.Y); pTemp.AddEllipse((Start.X * 3 + End.X) / 4f, (Start.Y * 3 + End.Y) / 4f, (End.X - Start.X) / 2f, (End.Y - Start.Y) / 2f); PathGradientBrush pgb = new PathGradientBrush(pTemp); Blend b = new Blend(); b.Factors = new float[] { 0, 1, 1 }; b.Positions = new float[] { 0, .5F, 1 }; pgb.Blend = b; pgb.CenterColor = ((SolidBrush)CurrentBrush).Color; pgb.SurroundColors = new Color[] {CurrentPen.Color}; gTarget.FillPath(pgb, pTemp); pgb.Dispose(); pTemp.Dispose();
annulus截图http://enigmadream.com/pri/annulus.PNG
我编辑了这个样本的原始SGDK代码,因为最初我不够聪明,无法缩放渐变以排除孔,但现在我想我是:).
如果您希望看到这样的渐变:
替代文字http://enigmadream.com/pri/annulus2.PNG
然后将混合代码更改为如下所示:
Blend blend = new Blend(); blend.Factors = new float[] { 0, 1, 0, 0 }; blend.Positions = new float[] { 0, 0.25F, .5F, 1 }; pgb.Blend = blend;