PDA

View Full Version : سوال: مشکل در تعیین مرکز یک چند ضلعی



epsi1on
یک شنبه 09 خرداد 1389, 22:08 عصر
با سلام.
مشکل از جایی شروع میشه که من میخوام مرکز یک چند ضلعی یا به قولی همون مرکز سطحش رو پیدا کنم. یکسری کد هم پیدا کردم که یکیش این هست که فکر میکنم معروفترین الگوریتم تعیین مرکز سطه باشه (فقط کد مربوط به تعیین مرکز سطحش رو میزارم):



public Point2D FindCentroid()
{
// Add the first point at the end of the array.
int num_points = Points.Length;
Point2D[] pts = new Point2D[num_points + 1];
Points.CopyTo(pts, 0);
pts[num_points] = Points[0];

// Find the centroid.
double X = 0;
double Y = 0;
double second_factor;
for (int i = 0; i < num_points; i++)
{
second_factor =
pts[i].X * pts[i + 1].Y -
pts[i + 1].X * pts[i].Y;
X += (pts[i].X + pts[i + 1].X) * second_factor;
Y += (pts[i].Y + pts[i + 1].Y) * second_factor;
}

// Divide by 6 times the polygon's area.
double polygon_area = PolygonArea();
X /= (6 * polygon_area);
Y /= (6 * polygon_area);

// If the values are negative, the polygon is
// oriented counterclockwise so reverse the signs.
if (X < 0)
{
X = -X;
Y = -Y;
}

return new Point2D(X, Y);
}
که شیء Points نمونه ای ازSystem.Collections.Generic.List<Point2D> هست و کلاس Point2D هم تغریبا مثل کلاس System.Drawing.Drawing2D.Pointf هست فقط با این تغییر که مولفه های x و y ش بجای نوع float نوع double دارن.

حالا مشکل اصلی اینجاست که وقتی میخوام مرکز سطح چند ضلعی که گوشه هاش این نقاط هستند رو پیدا کنم مولفه y مرکز سطح رو بجای 250 میده منفی 250:



X=0.00, Y=600.00
X=18.84, Y=599.41
X=37.60, Y=597.63
X=56.21, Y=594.69
X=74.61, Y=590.57
X=92.71, Y=585.32
X=110.44, Y=578.93
X=127.73, Y=571.45
X=144.53, Y=562.89
X=160.75, Y=553.30
X=176.34, Y=542.71
X=191.23, Y=531.15
X=205.36, Y=518.69
X=218.69, Y=505.36
X=231.15, Y=491.23
X=242.71, Y=476.34
X=253.30, Y=460.75
X=262.89, Y=444.53
X=271.45, Y=427.73
X=278.93, Y=410.44
X=285.32, Y=392.71
X=290.57, Y=374.61
X=294.69, Y=356.21
X=297.63, Y=337.60
X=299.41, Y=318.84
X=300.00, Y=300.00
X=299.41, Y=281.16
X=297.63, Y=262.40
X=294.69, Y=243.79
X=290.57, Y=225.39
X=285.32, Y=207.29
X=278.93, Y=189.56
X=271.45, Y=172.27
X=262.89, Y=155.47
X=253.30, Y=139.25
X=242.71, Y=123.66
X=231.15, Y=108.77
X=218.69, Y=94.64
X=205.36, Y=81.31
X=191.23, Y=68.85
X=176.34, Y=57.29
X=160.75, Y=46.70
X=144.53, Y=37.11
X=127.73, Y=28.55
X=110.44, Y=21.07
X=92.71, Y=14.68
X=74.61, Y=9.43
X=56.21, Y=5.31
X=37.60, Y=2.37
X=18.84, Y=0.59
X=0.00, Y=0.00
X=-18.84, Y=0.59
X=-37.60, Y=2.37
X=-56.21, Y=5.31
X=-74.61, Y=9.43
X=-92.71, Y=14.68
X=-110.44, Y=21.07
X=-127.73, Y=28.55
X=-144.53, Y=37.11
X=-160.75, Y=46.70
X=-176.34, Y=57.29
X=-191.23, Y=68.85
X=-205.36, Y=81.31
X=-218.69, Y=94.64
X=-231.15, Y=108.77
X=-242.71, Y=123.66
X=-253.30, Y=139.25
X=-262.89, Y=155.47
X=-271.45, Y=172.27
X=-278.93, Y=189.56
X=-285.32, Y=207.29
X=-290.57, Y=225.39
X=-294.69, Y=243.79
X=-297.63, Y=262.40
X=-299.41, Y=281.16
X=-300.00, Y=300.00
X=-299.41, Y=318.84
X=-297.63, Y=337.60
X=-294.69, Y=356.21
X=-290.57, Y=374.61
X=-285.32, Y=392.71
X=-278.93, Y=410.44
X=-271.45, Y=427.73
X=-262.89, Y=444.53
X=-253.30, Y=460.75
X=-242.71, Y=476.34
X=-231.15, Y=491.23
X=-218.69, Y=505.36
X=-205.36, Y=518.69
X=-191.23, Y=531.15
X=-176.34, Y=542.71
X=-160.75, Y=553.30
X=-144.53, Y=562.89
X=-127.73, Y=571.45
X=-110.44, Y=578.93
X=-92.71, Y=585.32
X=-74.61, Y=590.57
X=-56.21, Y=594.69
X=-37.60, Y=597.63
X=-18.84, Y=599.41

اگر دقت کنید مولفه y تمام نقاط بزرگتر از صفر هستنند پس اصلا نباید مولفه y مرکز سطح کمتر از صفر باشه...

نمیدونم چه نکته ای رو در نظر نمیگیرم. ممنون میشم اگر راهنمایی کنید یا کدی رو بهم معرفی کنید که مرکز سطح چند ضلعی رو با داشتن گوشه هاش بهم بده (البته به زبان C#‎‎ یا زبان دیگری که بقول معروف تحت دات نت باشه).

اَرژنگ
دوشنبه 10 خرداد 1389, 09:37 صبح
PolygonArea(); کدش کو؟




با سلام.
مشکل از جایی شروع میشه که من میخوام مرکز یک چند ضلعی یا به قولی همون مرکز سطحش رو پیدا کنم. یکسری کد هم پیدا کردم که یکیش این هست که فکر میکنم معروفترین الگوریتم تعیین مرکز سطه باشه (فقط کد مربوط به تعیین مرکز سطحش رو میزارم):



public Point2D FindCentroid()
{
// Add the first point at the end of the array.
int num_points = Points.Length;
Point2D[] pts = new Point2D[num_points + 1];
Points.CopyTo(pts, 0);
pts[num_points] = Points[0];


// Find the centroid.
double X = 0;
double Y = 0;
double second_factor;
for (int i = 0; i < num_points; i++)
{
second_factor =
pts[i].X * pts[i + 1].Y -
pts[i + 1].X * pts[i].Y;
X += (pts[i].X + pts[i + 1].X) * second_factor;
Y += (pts[i].Y + pts[i + 1].Y) * second_factor;
}


// Divide by 6 times the polygon's area.
double polygon_area = PolygonArea();
X /= (6 * polygon_area);
Y /= (6 * polygon_area);


// If the values are negative, the polygon is
// oriented counterclockwise so reverse the signs.
if (X < 0)
{
X = -X;
Y = -Y;
}


return new Point2D(X, Y);

}



که شیء Points نمونه ای ازSystem.Collections.Generic.List<Point2D> هست و کلاس Point2D هم تغریبا مثل کلاس System.Drawing.Drawing2D.Pointf هست فقط با این تغییر که مولفه های x و y ش بجای نوع float نوع double دارن.







حالا مشکل اصلی اینجاست که وقتی میخوام مرکز سطح چند ضلعی که گوشه هاش این نقاط هستند رو پیدا کنم مولفه y مرکز سطح رو بجای 250 میده منفی 250:








X=0.00, Y=600.00











X=18.84, Y=599.41





X=37.60, Y=597.63





X=56.21, Y=594.69





X=74.61, Y=590.57





X=92.71, Y=585.32





X=110.44, Y=578.93





X=127.73, Y=571.45





X=144.53, Y=562.89





X=160.75, Y=553.30





X=176.34, Y=542.71





X=191.23, Y=531.15





X=205.36, Y=518.69





X=218.69, Y=505.36





X=231.15, Y=491.23





X=242.71, Y=476.34





X=253.30, Y=460.75





X=262.89, Y=444.53





X=271.45, Y=427.73





X=278.93, Y=410.44





X=285.32, Y=392.71





X=290.57, Y=374.61





X=294.69, Y=356.21





X=297.63, Y=337.60





X=299.41, Y=318.84





X=300.00, Y=300.00





X=299.41, Y=281.16





X=297.63, Y=262.40





X=294.69, Y=243.79





X=290.57, Y=225.39





X=285.32, Y=207.29





X=278.93, Y=189.56





X=271.45, Y=172.27





X=262.89, Y=155.47





X=253.30, Y=139.25





X=242.71, Y=123.66





X=231.15, Y=108.77





X=218.69, Y=94.64





X=205.36, Y=81.31





X=191.23, Y=68.85





X=176.34, Y=57.29





X=160.75, Y=46.70





X=144.53, Y=37.11





X=127.73, Y=28.55





X=110.44, Y=21.07





X=92.71, Y=14.68





X=74.61, Y=9.43





X=56.21, Y=5.31





X=37.60, Y=2.37





X=18.84, Y=0.59





X=0.00, Y=0.00





X=-18.84, Y=0.59





X=-37.60, Y=2.37





X=-56.21, Y=5.31





X=-74.61, Y=9.43





X=-92.71, Y=14.68





X=-110.44, Y=21.07





X=-127.73, Y=28.55





X=-144.53, Y=37.11





X=-160.75, Y=46.70





X=-176.34, Y=57.29





X=-191.23, Y=68.85





X=-205.36, Y=81.31





X=-218.69, Y=94.64





X=-231.15, Y=108.77





X=-242.71, Y=123.66





X=-253.30, Y=139.25





X=-262.89, Y=155.47





X=-271.45, Y=172.27





X=-278.93, Y=189.56





X=-285.32, Y=207.29





X=-290.57, Y=225.39





X=-294.69, Y=243.79





X=-297.63, Y=262.40





X=-299.41, Y=281.16





X=-300.00, Y=300.00





X=-299.41, Y=318.84





X=-297.63, Y=337.60





X=-294.69, Y=356.21





X=-290.57, Y=374.61





X=-285.32, Y=392.71





X=-278.93, Y=410.44





X=-271.45, Y=427.73





X=-262.89, Y=444.53





X=-253.30, Y=460.75





X=-242.71, Y=476.34





X=-231.15, Y=491.23





X=-218.69, Y=505.36





X=-205.36, Y=518.69





X=-191.23, Y=531.15





X=-176.34, Y=542.71





X=-160.75, Y=553.30





X=-144.53, Y=562.89





X=-127.73, Y=571.45





X=-110.44, Y=578.93





X=-92.71, Y=585.32





X=-74.61, Y=590.57





X=-56.21, Y=594.69





X=-37.60, Y=597.63





X=-18.84, Y=599.41










اگر دقت کنید مولفه y تمام نقاط بزرگتر از صفر هستنند پس اصلا نباید مولفه y مرکز سطح کمتر از صفر باشه...












نمیدونم چه نکته ای رو در نظر نمیگیرم. ممنون میشم اگر راهنمایی کنید یا کدی رو بهم معرفی کنید که مرکز سطح چند ضلعی رو با داشتن گوشه هاش بهم بده (البته به زبان C#‎‎‎‎ یا زبان دیگری که بقول معروف تحت دات نت باشه).

epsi1on
چهارشنبه 12 خرداد 1389, 13:27 عصر
PolygonArea(); کدش کو؟
عذر میخوام.
متاسفانه حواسم نبود که این توضیحات اضافی رو بدم. سایر قسمتها ظاهرا درست کار میکنه و مقداری هم که این متد PolygonArea میده همیشه بزرگتر ازصفر هست.
سورس کد رو در ضمیمه گذاشتم
با تشکر از دقت شما...