PDA

View Full Version : سوال: گرافیک و شرط پر کردن دایره



aapalireza
یک شنبه 04 اردیبهشت 1390, 21:12 عصر
آیا می توان برای رسم دایره در سی شارپ شرط گذاشت؟!
یعنی گفت در آن محدوده ای که دایره را رسم می کند, پیکسل های زیر خود را ببیند و اگر رنگ x داشت , آن را پر نکند...
ممنون میشم جواب شامل و کامل بدید

exlord
یک شنبه 04 اردیبهشت 1390, 21:45 عصر
2 روش به نظرم میرسه ...
1 - دایره رو بت Bitmap.SetPixel رسم کنین و هر نقطه رو که نمیخواین خالی بزارین ...
2 - قبل از رسم دایره خونه هایی رو که باید بمونن توی یه لیست نگه دارین ( منظور مختصاتشون ) ... بعد از رسم دایره با SetPixel اون نقاط رو دوباره با رنگ دلخواه رسم کنین ...

aapalireza
یک شنبه 04 اردیبهشت 1390, 21:54 عصر
شرمنده!
من خیلی بیش از حد آماتورم!
اینا رو نمی دونم چه جوری باید پیاده سازی کنم!
من فقط با FillEllipse دایره رسم میکنم!
با یه بار minimze کردن هم خودش پاک میشه!
میشه هم راه این را بگید هم قبلی را بیشتر توضیح بدید یا کدش را بگید؟

exlord
یک شنبه 04 اردیبهشت 1390, 22:50 عصر
این روش اول :
Bitmap bt = new Bitmap(pictureBox1.Width, pictureBox1.Height);
//------------nogati ke nemikhaym rush rang beshe------
Graphics g = Graphics.FromImage(bt);
g.DrawLine(Pens.Red, new Point(10, 10), new Point(300, 300));
g.DrawLine(Pens.Red, new Point(10, 40), new Point(300, 100));
//-----------------------------------------------------

Rectangle bounds = new Rectangle(new Point(20, 20), new Size(200, 200));//mostatili ke dayere tuye un garar migire
double R = bounds.Width / 2;//shoae dayere
//(x-a)^2 + (y-b)^2 = R^2 // formule dayere (a,b)=> fasele az mabdae mokhtassat
int a = bounds.Width / 2 + bounds.X;
int b = bounds.Height / 2 + bounds.Y;
for (int x = bounds.X; x <= bounds.Right; x++)
{
for (int y = bounds.Y; y <= bounds.Bottom; y++)
{
if (Math.Pow(x - a, 2) + Math.Pow(y - b, 2) <= Math.Pow(R, 2)) //nogte dakhele dayere ast
{
if (bt.GetPixel(x, y) != Color.FromArgb(255,0,0))//nogati ke rageshun Red hast ignore mikone
bt.SetPixel(x, y, Color.Black);
}
}
}

pictureBox1.Image = bt;

haghft
دوشنبه 05 اردیبهشت 1390, 10:03 صبح
این روش روش خوبیه ولی یه روش هم هست که از نامعتبرسازی اسفاده میکنه و دیگه نیازی به picturebox هم نیست.
اون روش اینه:
bool check;

private void button1_Click(object sender, EventArgs e)
{
check = true;
Invalidate();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
if (check)
{
Graphics g = e.Graphics;
g.FillEllipse(Brushes.Red, 200, 250, 600, 512);
g.Dispose();
}
}
در ضمن با قرار دادن این کد بعد از Graphics g = e.Graphics; میتوانید کیفیت تصویر را بالابرده و از بره خوردن جلوگیری کنید:
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality ;

exlord
دوشنبه 05 اردیبهشت 1390, 11:53 صبح
این روش روش خوبیه ولی یه روش هم هست که از نامعتبرسازی اسفاده میکنه و دیگه نیازی به picturebox هم نیست.
اون روش اینه:

اینو که خودشون بلد هستن ... حالا این قسمتش کو ؟


در آن محدوده ای که دایره را رسم می کند, پیکسل های زیر خود را ببیند و اگر رنگ x داشت , آن را پر نکند...