PDA

View Full Version : تشخیص اشیا گرافیکی زیر هم



NIMA_1981
جمعه 04 آذر 1390, 16:49 عصر
سلام
من توی صفحه جند تا نقطه قرار میدم که هر کدومشون تو دستگاه مختصات داری یک x,y هستند که در یک لسیت ذخیره میشه - حالا میام با استفاده از FillPolygon دور جند تا از این نقطه ها رو خط میکشم حالا جطوری می تونم بفهمم که زیر این FillPolygon کدوم از این نقطه ها قرار داره یعنی نرم افزار خودش تشخیص بده ---

78375
یعنی یعد از انتخاب من بدونم این 3 تا نقطه زیر این قرار دارن
78376
با تشکر

haniyehghassami
جمعه 04 آذر 1390, 18:04 عصر
سلام
این چیزی که گفتین جالبه اما هیچی ازش نمیدونم
میشه بیشتر برام توضیح بدین؟؟؟؟؟:متفکر:

Amir Oveisi
جمعه 04 آذر 1390, 18:58 عصر
یه سر به اینجا بزنید:
http://social.msdn.microsoft.com/forums/en-US/winforms/thread/95055cdc-60f8-4c22-8270-ab5f9870270a/

NIMA_1981
جمعه 04 آذر 1390, 21:46 عصر
دوست عزیز میشه یک مثال از همین کدی که زدید بگید چطوری باید ازش استفاده کنم

bool PointInPolygon(Point p, Point[] poly)
{
Point p1, p2;
bool inside = false;
if (poly.Length < 3)
{
return inside;
}
Point oldPoint = new Point(
poly[poly.Length - 1].X, poly[poly.Length - 1].Y);
for (int i = 0; i < poly.Length; i++)
{
Point newPoint = new Point(poly[i].X, poly[i].Y);
if (newPoint.X > oldPoint.X)
{
p1 = oldPoint;
p2 = newPoint;
}
else
{
p1 = newPoint;
p2 = oldPoint;
}
if ((newPoint.X < p.X) == (p.X <= oldPoint.X)
&& ((long)p.Y - (long)p1.Y) * (long)(p2.X - p1.X)
< ((long)p2.Y - (long)p1.Y) * (long)(p.X - p1.X))
{
inside = !inside;
}
oldPoint = newPoint;
}
return inside;
}
اینم مختصاتی که با اون polygon رو کشیدم حالا جطوری ببینم یک مختصات توش قرار گرفته یا نه
List<Point> gpoints = new List<Point>(){

new Point(10, 10),
new Point(15, 10),
new Point(20, 10),
new Point(42, 42),
new Point(47, 11)
};

با تشکز

noroozifar
جمعه 04 آذر 1390, 23:25 عصر
ببین اینکار خیلی ساده است من خودم خواستم یک درخت درست کنم با گرافیک همین کار شما را نیاز داشتم میبایست از دایره های زیرین ریشه درخت یک خط به دایره ریشه بکشم خیلی جستجو کردم از خیلی ها پرسیدم کسی جواب درست نداد فکر کردم و بالاخره جواب گرفتم بهترین راه و ساده ترین راه استفاده از یک hashtable هستش که نقاط مد نظرت را با یک کلید منحصر به فرد در hashtable قرار بدی مثلا من برای شما کلید را p و شماره نقطه 1 در نظر میگیرم و این جوری ذخیره میکنم تو hashtable


private Hashtable po=new hashtable();
point p1=new pont(100,200);
po.add("p"+i,A);//inja i =1 migozary bra point p1

حالا نحوه خواندن


point p=(point)po["p1"];

حالا دیگه خودتون یکم کار کنی متوجه میشی

NIMA_1981
شنبه 05 آذر 1390, 01:35 صبح
دوست عزیز میشه بیشتر توضیح بدید یا یک مثال قرار بدید
با تشکر

Amir Oveisi
شنبه 05 آذر 1390, 13:53 عصر
براي استفاده از متد معرفي شده پارامتر اول همون نقطه اي هست كه ميخوايد چك كنيد ببينيد داخل هست يا خير.
پارامتر دوم هم نقاط تشكيل دهنده polygon هستند. (نقاطي كه بر اساس اون ها رسم شده polygon).

فرض كنيد polygon رو به اين شكل رسم كرديد:
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawPolygon(pen, new Point[] { new Point(50, 50), new Point(500, 300), new Point(200, 40)});

}

و ميخوايد ببينيد نقطه 180,100 داخلش هست يا نه:
if (PointInPolygon(new Point(180, 100), new Point[] { new Point(50, 50), new Point(500, 300), new Point(200, 40) }))
{
MessageBox.Show("Yes");
}
else
MessageBox.Show("No");