PDA

View Full Version : region در system.drawing



Morteza-76
یک شنبه 18 اسفند 1392, 17:30 عصر
سلام فرض کنیم یک shape داریم به شکل دایره که حرکت میکنه حالا یه شی دیگه هم هست که دایره است و بزرگتر از دایره اولی است من نمیخوام اینکارو بکنم که لوکیشن شی دوم رو بدست بیارم و بنویسم که اگر شی اول رفت درون لوکیشن شی دوم اونوقت از شی بیاد بیرون . من میخوام با استفاده از روشی دیگه اینکارو انجام بدم که یکی از دوستان فرمودندند در فضای نامی system.drawing کلاسی به نام region است که مشکل منو برطرف میکنه لطفا اگه کسی میدونه کمکم کنه ممنون

plus
یک شنبه 18 اسفند 1392, 19:36 عصر
این پستی هست که من گذاشتم در مورد ساخت چیزی شبیه Maze که یک چهار ضلعی رو به محدوده مشخص شده ای از فرم محدود میکنه:
http://barnamenevis.org/showthread.php?370590-%D8%B3%D8%A7%D8%AE%D8%AA-%DB%8C%DA%A9-%D9%86%D9%88%DB%8C%DA%AF%DB%8C%D8%AA%D9%88%D8%B1&p=1636316&viewfull=1#post1636316

این هم صفحه MSDN در مورد Region
http://msdn.microsoft.com/en-us/library/system.drawing.region(v=vs.110).aspx
اگه باز هم متوجه نشدین، بایستی زمان بگذارین و یک کتاب در مورد System.Drawing کلاس های اون مطالعه کنید تا بتونید اون چیزی که مد نظرتون هست رو بسازید.

rahnema1
یک شنبه 18 اسفند 1392, 21:31 عصر
چرا نمی خواهید با محاسبه فاصله بین مرکز دو دایره جدایی آنها را بررسی کنید؟

Morteza-76
یک شنبه 18 اسفند 1392, 22:28 عصر
چرا نمی خواهید با محاسبه فاصله بین مرکز دو دایره جدایی آنها را بررسی کنید؟

متوجه منظورتون نشدم همون روشی که گفتید کار کردم آقای راهنما و دایره ساختم که در فرم حرکت کنه حالا یک دایره دیگه هم رسم کردم میخوام وقتی توپی که در حال حرکت است درون این دایره ای که تازه ساختم رفت رنگ دایره جدید قرمز بشه چیکار کنم؟

rahnema1
یک شنبه 18 اسفند 1392, 23:39 عصر
در مورد برخورد توپ به دیوار یه کم اشکال هست ولی رنگها عوض میشه:

bool intersect=false;
double intersectDist,w2,h2;
float dx1;
float dy1;
float dxy;
System.Drawing.PointF pp;
Graphics gg;
Brush br,br2;
RectangleF rect,rect2;
Random rr;
public void MainFormLoad(object sender, EventArgs e)
{
rr= new Random();
gg = this.CreateGraphics();
br= new SolidBrush(Color.Red);
br2=new SolidBrush(Color.Yellow);
rect=new RectangleF(rr.Next(0,this.DisplayRectangle.Width-50), rr.Next(0,this.DisplayRectangle.Height-50),50 , 50);
rect2= new RectangleF(this.DisplayRectangle.Width/2 +this.DisplayRectangle.Left-50 ,this.DisplayRectangle.Height/2+this.DisplayRectangle.Top-50, 100, 100);
intersectDist=Math.Pow((rect.Width+rect2.Width)/2,2);
w2=(rect.Width-rect2.Width)/2-rect2.Left;
h2=(rect.Height-rect2.Height)/2-rect2.Top;
pp = rect.Location;
dxy=2;
dx1 = (float)Math.Cos(Math.PI/2*rr.NextDouble())*dxy*Math.Sign(rr.NextDouble()-.5);
dy1 = (float)Math.Sqrt(dxy*dxy-dx1*dx1)*Math.Sign(rr.NextDouble()-.5);
timer1.Start();
}

public void Timer1Tick(object sender, EventArgs e)
{
pp.X += dx1;
pp.Y += dy1;
if (pp.X < 0 | pp.X > (this.DisplayRectangle.Width - rect.Width)) {
dx1 = Math.Sign(dx1)*Math.Abs((float)Math.Cos(Math.PI/2*rr.NextDouble())*dxy);
dy1 =(float)Math.Sqrt(dxy*dxy-dx1*dx1)*Math.Sign(rr.NextDouble()-.5);
pp.X -= dx1;
pp.Y += dy1;
dx1 = -dx1;
}
if (pp.Y < 0 | pp.Y > (this.DisplayRectangle.Height - rect.Height)) {
dy1 = Math.Sign(dy1)*Math.Abs((float)Math.Cos(Math.PI/2*rr.NextDouble())*dxy);
dx1 = (float)Math.Sqrt(dxy*dxy-dy1*dy1)*Math.Sign(rr.NextDouble()-.5);
pp.Y -= dy1;
pp.X += dx1;
dy1 = -dy1;
}
rect.Location=pp;
gg.Clear(Color.FromKnownColor(KnownColor.Control)) ;
if(!intersect) intersect=((Math.Pow(rect.Left+w2, 2)+ Math.Pow(rect.Top+h2, 2)) <=intersectDist);
gg.FillEllipse((intersect?br:br2),rect2);
gg.FillEllipse(br,rect);
}