كنجكاو مدیر پروژه
تاريخ عضويت: 1 شنبه 29 شهريور 1383 تعداد ارسالها: 180 محل سكونت: نپتون-زمين
3 شنبه 5 مهر 1384 - 15:20 |
|
|
@اسماعيل:
نقل قول: |
در سايت iranvig.com درخواست کنید... |
اسماعيل جان، مگه سايت خودمون چه ايرادي داره آخه...
@bono056:
نقل قول: |
من مختصات 3 راس مثلث رو دارم. ميخوام مختصات محل برخورد 3 نيمساز اين مثلث رو پيدا كنم.
و مختصات محل برخورد هر نيمساز با ضلع روبروش. |
تا حالا تو اين سايت يه همچين سوال كوتاه و واضحي نديده بودم، خيلي جالب بود...
---------------------------------------
معلومات:
پس طبق فرموده شما، فقط مختصات سه راس مثلث را در اختيار داريم...
رئوس مثلث با A و B و C مشخص خواهند شد.
---------------------------------------
مجهولات:
شما محل تلاقي نيمسازهاي مثلث را مي خواهيد و همينطور محل برخورد آنها را با ضلع روبرويشان...
محل تلاقي نيمسازها = مركز دايره محاطي؛ كه با حرف I نمايش داده مي شود (InCenter)
محل برخورد نيمسازها با ضلع روبرويشان كه با حروف F، E و G نمايش داده مي شوند.
---------------------------------------
جواب:
از آنجايي كه محل برخورد هر سه نيمساز (Bisector) در واقع همان مركز دايره محاطي(InCenter of the InCircle) است، پس نيازي به محاسبات Trilinear Co-ordinate نمي باشد زيرا آلفا، بتا و گاماي ما هر سه برابر عدد 1 مي باشند...
حدس مي زنم كه شما در دو بعد كار مي كنيد پس دستگاه مختصات (Graph) ما هم دو بعدي خواهد بود.
1. بسيار خوب، حالا كه مختصات هر سه راس مثلث مشخص است ابتدا طول هر ضلع را حساب مي كنيم.
---------------------------------------
اگر كافي است فقط توضيح مختصر هر شماره را مطالعه بفرماييد، اما براي بقيه دوستاني كه به اطلاعات جزيي تر و ساده تر علاقمند هستند، توضيح بيشتر داده شده است...
---------------------------------------
(توضيح رياضي قسمت اول)
محاسبه طول پاره خطي كه مختصات دو راس آنرا در اختيار داريم:
از آنجايي كه ما در دو بعد كار مي كنيم پس فقط با طول و عرض كار داريم (x و y)
ابتدا طول (x) دو نقطه خط را از هم كم كرده و حاصل آنرا به توان 2 مي رسانيم و حاصل آنرا نگه مي داريم، حالا همين كار را براي براي عرض (ارتفاع) انجام مي دهيم يعني مختصات ارتفاع دو نقطه را از هم كم كرده و به توان 2 مي رسانيم و حالا حاصل آنرا با حاصل توان قبلي جمع مي كنيم و در آخر مجوز آنرا مي گيريم.
تا اينجا طول(درازا!) خط را بدست آورده ايم.
(توضيح براي برنامه نويسي)---> براي توضيح از قواعد زباني ++C/C استفاده مي كنم. در ضمن توصيه مي كنم ابتدا توضيح رياضي را مطالعه بفرماييد.
فرض كنيد كلاس يا استراكچري براي نقطه تعريف كرده ايم به نام Point كه مختصات هر x و y هر نقطه را در خود نگه مي دارد (مي توانيد از int استفاده كنيد) و ما سه راس مثلث را با اين نوع داده اي تعريف كرده ايم، به اين صورت:
;Point A, B, C
و مختصات مثلثمان را هم به اين صورت در نظر مي گيريم (براي ارائه مثال)
;A.x = 110; A.y = 110
;B.x = 230; B.y = 230
;C.x = 360; C.y = 130
حالا مي رسيم به محاسبه اندازه خطوط، براي اينكار ابتدا سه متغير تعريف مي كنيم. (به تعداد اضلاع!) مسلما اين متغيرها مي توانند هر نامي داشته باشند اما به نظرم يكي از اين دو نوع بسيار واضح خواهد بود. مي توانيم طبق معمول تعاريف استاندارد رياضي به اينصورت تعريف كنيم (يا به هر شكل كه خودتان صلاح مي دانيد.) كه طول خط AB يا s12 ...(فقط براي مثال!)
من A,B,C را به ترتيب برابر 1,2,3 فرض مي كنم، پس سه متغير از نوع double تعريف مي كنيم:
;double s12, s23, s31
براي محاسبه طول خط AB، طبق توضيحاتي كه دادم، به اين صورت عمل مي كنيم:
; ( ( s12 = sqrt ( pow ( B.x - A.x, 2 ) + pow ( B.y - A.y, 2
بدين ترتيب طول خط AB را بدست آورديم (همان s12) محاسبه s23 و s31 (يا همان BC و AC) هم با خودتان، پس از محاسبه s23 و s31 قسمت اول كارمان تمام شده است...
2. حالا بايد محل تلاقي سه نيمساز را بدست آوريم. به اين ترتيب كه از يك ضلع شروع مي كنيم و مختصات هر نقطه را در برآيند طول خط روبروي آن نقطه ضرب مي كنيم و در آخر جواب را بر مجموع طول اضلاع مثلث (پريم يا همان Perim) تقسيم مي كنيم و به اين ترتيب به طول و عرض نقطه تلاقي نيمسازها پي مي بريم. (بدون نياز به دانستن اندازه زاويه ها... )
(توضيح رياضي)
توجه: از آنجايي كه بدست آوردن زاويه ها و اندازه درجه نيمسازها(وقتي زاويه ها را داشته باشيم اينكه ديگه كاري نداره...!... ) را نخواسته بوديد من هم تنبلي كردم و آنها را توضيح ندادم اما اگر به آنها هم احتياج داريد فقط كافيست كه بفرماييد...
بسيار خوب، تا اينجا كه از راحت هم ساده تر بود.(البته منهاي فرم نگارشي... )
اين قسمت بسيار راحت است، تنها كاري كه بايد انجام بدهيد اين است كه طول و عرض هر نقطه را (جداگانه) در اندازه پاره خط روبرويش ضرب كنيد و حاصل تمام آنها را با هم (براي طول و عرض جدا) جمع كرده و بر مجموع اندازه تمام اضلاع مثلث (در اين مورد مي شود همان محيط مثلث) تقسيم كنيد تا طول و عرض نقطه اي كه مي خواهيم (محل تقاطع نيمسازها يا همان مركز دايره محاطي) را بدست بياوريم.
نكته: گفتم براي هر كدام بايد طول و عرض را جدا حساب كنيد، منظورم اينست كه براي مثال طول نقطه A را در اندازه خط s23 ضرب مي كنيم(براي B خط s31 و براي نقطه C خط s12 را) و عرض(يعني يكبار x و بار ديگر y را) آنرا هم همينطور و هر كدام از مختصات(طول و عرض) را جدا از هم نگه مي داريم نه اينكه همه را با هم ضرب و جمع كنيم! (تابلوئه، فقط مي خواستم مطمئن بشم كه كاملا واضح شده باشه...)
(منم خودمو كشتم با اين خنگ بازيا... رسوندن مطلب در يكي دو جمله، واقعا هنريه ها... ... اما خوب اينجوري اگه يه صفر كيلومتر رياضي هم اين مطلبو بخونه، مطلب دس گيرش ميشه... )
خوب حالا ما مختصات مركز دايره محاطي و در واقع، محل برخورد نيمسازهاي مثلث را پيدا كرده ايم...
(توضيح براي برنامه نويسي)
خوب حالا مي خواهيم برنامه را ادامه بدهيم، پس به بالاي كد برويد و يك داده ديگر از نوع Point بسازيد، با نام InCenter (فقط يك پيشنهاد است!)
طبق توضيحاتي كه در بخش توضيح رياضي داده شد، حالا بايد از يك ضلع شروع كنيم و طول و عرض هر كدام از راس هاي مثلث را به طور جداگانه در اندازه خط روبروي آن نقطه در مثلث، ضرب كنيم و بعد از اينكه اينكار را براي هر يك از راس ها انجام داديم، حاصل را بر مجموع اندازه هر سه ضلع مثلث (در اينجا همان محيط مثلث خواهد بود) تقسيم كرده و حاصل را در InCenter.x و InCenter.y كه هر كدام را جداگانه محاسبه كرده ايم قرار دهيم، براي نمونه طرز محاسبه InCenter.x را نشان مي دهم و InCenter.y را به عهده خودتان مي گذارم:
نكته: Perim همان مجموع اندازه اضلاع مثلث است كه براي خواناتر شدن برنامه تان راه مناسبي است.(مي توانيد خودتان اينكار را براي هرجا كه مي خواهيد انجام بدهيد، اينها فقط مثال هاي كوچكي هستند كه برخي حالات مختلف را نشان مي دهند.)
;Perim = s12 + s23 + s31
;InCenter.x = ( s23 * A.x + s31 * B.x + s12 * C.x ) / Perim
نكته مهم: چون نمي خواستم با گذاشتن پرانتز، اين يك خط كد را زيادي شلوغ كنم پس از اين بهانه استفاده مي كنم و يك نكته پايه اي را (البته اميدوارم كه همه آنرا بدانند) هم يادآوري كنم و آن اينست كه عمل ضرب بر عمل جمع مقدم مي باشد...!...(چند لحظه مكس)... پس ابتدا تمام اعمال ضرب انجام مي شوند (مختصات طولي هر راس(يا نقطه) ضربدر طول خط روبرو) و سپس همه آنها با هم جمع مي شوند... هه، نكته مهم همين بود... همه مي دونستين، مگه نه... ...
3. براي بدست آوردن محل برخورد نيمساز با ضلع روبرو از همان فرمولي كه در قسمت دوم توضيح دادم استفاده كنيد، البته منهاي روابط مربوط به خود راس و ضلعي كه مختصات محل برخورد آنرا مي خواهيم.
(توضيح رياضي)
خوب حالا براي بدست آوردن مختصات محل برخورد هر نيمساز با ضلع روبرويش بايد تقريبا از رابطه اي مانند رابطه اي كه در قسمت دوم جواب، توضيح داده شد استفاده نماييم. با اين تفاوت كه بايد روابط مربوط به زاويه اي كه قرار است محل برخورد نيمسازش با ضلع روبرويي آن محاسبه شود را حذف كنيم. براي مثال زماني كه مي خواهيم محل برخورد نيمساز زاويه A را پيدا كنيم بايد عواملي را كه مربوط به مجهول ما (محل برخورد) مي شود را حذف كنيم و آن عوامل شامل ضرب مختصات نقطه مورد نظر (در اينجا A) و همچنين اندازه ضلعي كه مي خواهيم در تقسيم از آن استفاده كنيم مي شوند .(يعني براي بدست آوردن Perim، فقط دو ضلع مجاور راس مورد نظر (A) را با هم جمع مي كنيم و BC را با آنها جمه نمي كنيم (به خاطر اينكه نقطه مورد نظر روي همين خط قرار دارد))
(توضيح براي برنامه نويسي)
خوب حالا ما در برنامه فقط مختصات محل برخورد هر نيمساز با ضلع مقابلش را در اختيار نداريم كه الان آنرا هم محاسبه مي كنيم.
همانطور كه در بخش توضيح رياضي، عرض كردم بايد عواملي كه مستقيما با مجهول ما در اين قسمت ارتباط دارند را حذف كنيم... يعني فرمول ما در نهايت به اين شكل در مي آيد:
ابتدا يك متغير جديد تعريف كنيد (از نوع double) البته فقط اگر مي خواهيد مقدار قبلي Perim را داشته باشيد وگرنه مي توانيد دوباره روي همان پريم محسابات را انجام دهيد (بستگي به چگونگي ساختمان برنامه شما دارد)
;Perim = s12 + s23 + s31
;PerimBAC = s12 + s31
توجه(فقط براي روشن شدن بيشتر مطلب) : از Perim قبلي موردي كه با رنگ قرمز نمايش داده شده حذف مي شود و در PerimBAC قرار مي گيرد. اگر توجه بفرماييد متوجه مي شويد كه چيزي كه از اين قسمت حذف شده همان اندازه ضلع BC مثلث ما مي باشد...
;InCenter.x = ( s23 * A.x + s31 * B.x + s12 * C.x ) / Perim
;BCcol.x = ( s31 * B.x + s12 * C.x ) / PerimBAC
نكته: همانطور كه در ابتدا عرض كردم محل برخورد هر كدام از نيمسازها با ضلع مقابلشان هم نامگذاري شده اند پس در اينجا به جاي استفاده از BCcol.x مي توانيد متغيري بنام E داشته باشيد و طول (x) محل برخورد آنرا در E.x قرار بدهيد (بجاي BCcol.x)
توجه: من براي نمونه فقط طول مختصات را حساب كرده ام، فراموش نكنيد كه شما بايد عرض (ارتفاع يا y) آنراهم حساب نماييد.
توجه (فقط براي روشن شدن بيشتر مطلب): در اينجا هم متغير جديدي بنام BCcol (يعني محل برخورد بر روي خط BC) تعريف شده و تفاوت آن با فرمول بند 2 جواب هم با رنگ قرمز مشخص شده است. اگر دقت بفرماييد همانطور كه عرض كردم عواملي كه بطور مستقيم با مجهول ما در ارتباط هستند را حذف كرده ايم... يعني مختصات رأسي كه مي خواهيم مختصات محل برخورد آن با ضلع روبرويش را محاسب كنيم، ضربدر طول خط مقابل آن ضلع (كه در اينجا BC) مي باشد.
خوب پس تمام مجهولاتمان هم پيدا شدند، فقط از آنجا كه من به دايره محاطي اشاره كردم، فرمول محاسبه شعاع آنرا هم مي نويسم (بدون توضيح!)
;( ( r = 0.5 * ( sqrt ( ( 0 - s12 + s23 + s31 ) * ( 0 + s12 - s23 + s31 ) * ( 0 + s12 + s23 - s31 ) / Perim
(اگر دقت بفرماييد متوجه مي شويد فرمول آشنا است، پس احتياجي به توضيح هم نيست... )
نكته: من براي توضيح مجبور بودن فرمول ها را تماما بنويسم، Optimize كردن برنامه تان را به خودتان مي سپارم...
و از آنجايي كه اثبات فرمول ها را هم توضيح ندادم، پس برنامه كوچكي بجاي آن براي دوستان Upload مي كنم تا از درستي توضيحات خاطر جمع باشند (فقط فايل اجرايي... ساخت برنامه با خودتون... )
http://www.sharemation.com/Curious/Triangle.zip
حجم فايل 146 كيلوبايت مي باشد.
نكته: مي توانيد با ماوس هر يك از رأس هاي مثلث (A, B, C) را تكان دهيد...
@مديران سايت:
فكر مي كنم اين مبحث بيشتر به تالار علوم ربط دارد تا به اصول اوليه ساخت بازي، پس لطفا اگر لازم مي بينيد آنرا به تالار علوم منتقل نماييد...
- موفق باشيد. |
_________________ !Sometimes it is difficult to recognize the difference between worthless glass and priceless diamonds, specially about human beings
None of you humans seem to understand! I'm not logged in here with you! YOU'RE LOGGED IN HERE WITH ME |
|