برنامه‌نويسي؟ ساده است!
محاسبه مساحت چندضلعي

محاسبه چندضلعي، يكي از مسائل پيچيده برنامه‌نويسي است كه حل آن، برخلاف ظاهرش ساده است. فرض بگيريد يك چندضلعي غيرمحدب داريد كه 5راس دارد.

براي يافتن مساحت آن،‌بايد آن‌را به مثلث‌هاي كوچكتر تقسيم كنيم. بدين ترتيب مي‌توانيم با بدست آوردن چند مثلث، مساحت آن را به‌دست آوريم. شكل زير را در نظر بگيريد: ‌ ‌

در اين چندضلعي، مثلث‌هاي ما، ‌ABC‌، ‌ACD‌ و ‌ADE‌ هستند. ممكن است شما اعتراض كنيد كه همه اين مثلث‌ها جزئي از شكل نيستند، اما اگر تا انتهاي مقاله را بخوانيد، كارايي اين موضوع را درخواهيد يافت. نخست بايد حاصل ضرب ‌ AB‌* ‌AC‌ را بيابيم تا مساحت ‌ABC‌ به‌دست آيد. ‌ ‌
به‌دليل شيوه قرارگرفتن راس‌هاي ‌A‌، ‌B‌ و ‌C‌، نتيجه مقداري منفي خواهد بود. هر چند مي‌توانيم همين مقدار را به جمع كلي خود اضافه كنيم. به‌طور مشابه، نتيجه ‌ AC‌*‌AD‌ را هم محاسبه مي‌كنيم تا مساحت مثلث ‌ACD‌ نيز به‌دست آيد (كه آن هم مقداري منفي خواهد شد) و در نهايت مقدار ضرب ‌ AD‌* ‌AE‌ را حساب خواهيم كرد و از آنجايي كه اين سه مقدار به‌گونه‌اي مخالف همديگر قرار گرفته‌اند، (دو منفي و يك مثبت)، خودشان از هم كسر خواهند شد و مي‌توانيم نتيجه را در قدر مطلق گذاشته و جواب را به‌دست بياوريم.
دليل درستي روش ما اين است كه اعداد مثبت و منفي با مقدار دقيقي خودشان را از هم كم مي‌كنند. مساحت ‌ABC‌ و ‌ACD‌ طوري با هم قرار مي‌گيرند كه نتيجه نهايي با كسر ‌ADE‌ درست به‌دست بيايد. به چندضلعي مجددا نگاه كنيد. اگر نتيجه‌اي كه به‌دست آورديم منفي بود، ‌نشان مي‌دهد كه رئوس اين چندضلعي را به‌صورت ساعتگرد ترسيم كرده‌اند. بهتر است اين محاسبه را پياده كنيم:
‌;0 int area =‌
‌int N = lengthof(p);‌
‌«N; i++){1; i+1 for(int i =‌
‌];0][0] - p[0= p[i][ 1int x ‌
‌];1][0] - p[1= p[i][ 1int y ‌
‌];0][0] - p[0][1= p[i+ 2int x ‌
‌];1][0] - p[1][1= p[i+ 2int y ‌
‌;1*y2- x 2*y1int cross = x ‌
‌}‌area += cross; ‌
‌);2.0return abs(cross/‌
خب، حال بايد راه‌حل خود را تعميم بدهيم تا براي همه چندضلعي‌ها كار كند. توجه داشته باشيد كه اگر چندضلعي ما به‌صورت ساعتگرد چيده شده باشد، نتيجه مثبت و در صورتي كه پادساعتگرد باشد، نتيجه منفي است (كه البته مهم هم نيست و مي‌توان با يك قدرمطلق نتيجه نهايي را به‌دست آورد.)
مثال زير را در نظر بگيريد: ‌ ‌
نيمي از اين شكل به‌صورت ساعتگرد ترسيم شده و نيمي ديگر به‌صورت پادساعتگرد. از اين رو نتيجه اين دو بخش، عدد صفر خواهد شد. پس بايد مواظب باشيم كه هر بار تغيير جهت رخ مي‌دهد، قدرمطلق نتيجه قبلي را با قدرمطلق نتيجه فعلي محاسبه كنيم.
در اين شكل نيز، همان‌طور كه مشاهده مي‌كنيد، شكل در ناحيه آبي رنگ به دو لايه تقسيم شده است پس بايد حواسمان باشد كه نتيجه‌اي كه محاسبه مي‌شود، برابر است با مساحت منطقه خاكستري +‌مساحت منطقه آبي ضربدر2.
اگر شكلي داشتيم كه داراي تغيير جهت بود، در صورتي كه دو شكل مثبت و منفي، با همديگر تداخل داشتند، آن ناحيه تداخلي در مساحت محاسبه نمي‌شود و قدرمطلق دو بخش باقي‌مانده به‌عنوان مساحت قرار مي‌گيرد. الگوريتم نهايي ما به ‌شكل زير خواهد بود:
‌double polygonArea(double *X, double *Y, int points) {‌
‌; 0. ; int i, j=0double area=‌
‌; i«points; i++) {0for (i=‌
‌;0j++; if (j==points) j= ‌
‌area+=(X[i]+X[j])*(Y[i]-Y[j]); }
;5.return area*‌
‌}
اميربهاالدين سبط الشيخ