كيف أرسم إلينا (دونات) باستخدام GDI +؟
سؤال
لقد كنت أحاول رسم بالطوق (حلقة مع سمك) مع ثقب شفافة وحافة التدرج في C # مع النجاح القليل جدا. هل لدى أي شخص أي اقتراحات حول كيفية القيام بذلك؟
ها هي لطيفة مزيج فائدة
ها هي النتيجة النهائية - بفضل 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);
}
المحلول
هذه هي الطريقة التي فعلتها في مجموعة تطوير لعبة التمرير:
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();
(مصدر: enigmadream.com)
لقد قمت بتحرير رمز SGDK الأصلي لهذه العينة لأنه في الأصل لم أكن ذكية بما يكفي لتوسيع نطاق التدرج لاستبعاد الحفرة، ولكن الآن أعتقد أنني :).
إذا كنت تفضل أن ترى التدرج مثل هذا:
(مصدر: enigmadream.com)
ثم قم بتغيير رمز المزيج للبحث عن هذا:
Blend blend = new Blend();
blend.Factors = new float[] { 0, 1, 0, 0 };
blend.Positions = new float[] { 0, 0.25F, .5F, 1 };
pgb.Blend = blend;
نصائح أخرى
يمكنك استخدام مكالمتين إلى الرسومات. BrawArc مجتمعة، ورسم الأجزاء العلوية والسفلية أو اليسرى واليمين من Anlulus، جزء واحد في وقت واحد.
لا تنتمي إلى StackOverflow