نمایش نتایج 1 تا 3 از 3

نام تاپیک: مشکل در تعیین مرکز یک چند ضلعی

  1. #1
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    آبان 1387
    پست
    62

    مشکل در تعیین مرکز یک چند ضلعی

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

    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#‎‎‎ یا زبان دیگری که بقول معروف تحت دات نت باشه).

  2. #2
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736

    نقل قول: مشکل در تعیین مرکز یک چند ضلعی

    PolygonArea();
    کدش کو؟



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

    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 در 17:47 عصر

  3. #3
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    آبان 1387
    پست
    62

    نقل قول: مشکل در تعیین مرکز یک چند ضلعی

    نقل قول نوشته شده توسط اَرژنگ مشاهده تاپیک
    PolygonArea();
    کدش کو؟
    عذر میخوام.
    متاسفانه حواسم نبود که این توضیحات اضافی رو بدم. سایر قسمتها ظاهرا درست کار میکنه و مقداری هم که این متد PolygonArea میده همیشه بزرگتر ازصفر هست.
    سورس کد رو در ضمیمه گذاشتم
    با تشکر از دقت شما...
    فایل های ضمیمه فایل های ضمیمه

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •