پیمایش گراهام: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جز حذف برچسب ویکی سازی
Fatemibot (بحث | مشارکت‌ها)
جز ربات ردهٔ همسنگ (۳۰) +املا+مرتب+تمیز (۱۴.۹ core): + رده:الگوریتم‌های پوش محدب
خط ۱۰:
برای افزایش سرعت محاسبه لازم نیست زاویهٔ واقعی که این نقاط با محور X می‌سازند محاسبه شود در عوض، محاسبه کسینوس این زاویه کافیست.
 
این الگوریتم با در نظر گرفتن هر نقطه در آرایه مرتب شده پیش می‌رود. برای هر نقطه این موضوع را در نظر می‌گیرد که آیا حرکت از دو نقطه‌ای که قبلاقبلاً در نظر گرفته به این نقطه یک چرخش به چب بوده یا چرخش به راست. اگر چرخش به راست باشد به این معناست که نقطه دوم به آخر بخشی از بدنه محدب نمی‌باشد و باید حذف شود. این فرآیندفرایند تا زمانی ادامه می‌یابد که مجموعه سه نقطه آخر چرخش به راست باشد. به محض اینکه با یک چرخش به چپ مواجه شود الگوریتم به سراغ نقطه بعدی در آرایه مرتب شده می‌رود. (اگر در هر مرحله سه نقطه در یک راستا باشند، ممکن است انتخاب شود یا دور انداخته شود چون در برخی برنامه‌ها لازم است همه نقاط روی مرز بدنه محدب پیدا شوند.
 
[[تصویرپرونده:گراهام.png|چپ|300px]]
 
بازهم برای تعیین اینکه آیا سه نقطه تشکیل یک چرخش به چپ را می‌دهند یا چرخش به راست، نیازی نیست زاویه واقعی میان دو پاره خط محاسبه شود و در واقع می‌توانید تنها با حسابی ساده به این هدف برسید. برای سه نقطه (x1,y1)، (x2,y2)و (x3,y3)، محاسبه جهت ضرب خارجی دو برداری که با نقاط (x1,y1) , (x2,y2)و (x1,y1), (x3,y3)تعریف می‌شوداز طریق تعیین علامت عبارت (x2 − x1)(y3 − y1) − (y2 − y1)(x3 − x1)میسر است. اگر این عبارت صفر شد نقاط هم راستا هستند. اگر مثبت شد نقاط یک گردش به چپ و در غیر اینصورت یک گردش به راست را تشکیل می‌دهند.
 
این فرآیندفرایند در نهایت به نقطه‌ای که از آن شروع کرده‌است بازمی گردد، که در آن نقطه الگوریتم به پایان رسیده‌است و پشته شامل نقاط روی بدنه محدب در خلاف جهت عقربه‌های ساعت می‌باشد.
{{-}}
== پیچیدگی زمانی ==
مرتب سازی نقاط دارای پیچیدگی زمانی (O(n logn می‌باشد. در حالی که ممکن است به نظر برسد پیچیدگی زمانی حلقه از O(n2) می‌باشد. زیرا برای هر نقطه به عقب برمی گردد تا چک کند آیا هر یک از نقاط قبلی چرخش به راست ایجاد می‌کنند، اما در واقع از (O(n می‌باشد زیرا هر نقطه در نهایت از هر جهت چه گردش به راست و چه گردش به چپ، دو بار در نظر گرفته می‌شود. هر نقطه فقط یک بار به عنوان نقطه (x2,y2)در گردش به چپ در نظر گرفته می‌شود (زیرا الگوریتم به سراغ نقطه (x3,y3) بعد از آن می‌رود), و هم چنین به عنوان نقطه (x2,y2)در گردش به راست (زیرا نقطه (x2,y2) حذف می‌شود). بنابراین پیچیدگی زمانی کلی برابر است با (O(n logn.
 
{{-}}
خط ۲۶:
 
{{چپ‌چین}}
# ''Three points are a counter-clockwise turn if ccw > 0, clockwise if''
# ''ccw < 0, and collinear if ccw = 0 because ccw is a determinant that''
# ''gives the signed area of the triangle formed by p1, p2 and p3.''
'''function''' ccw(p1, p2, p3):
خط ۳۹:
'''swap''' points[1] with the point with the lowest y-coordinate
'''sort''' points by polar angle with points[1]
 
# ''We want points[0] to be a sentinel point that will stop the loop.''
'''let''' points[0] = points[N]
 
# ''M will denote the number of points on the convex hull.''
'''let''' M = 2
خط ۵۴:
'''else'''
M -= 1
 
# ''Update M and swap points[i] to the correct place.''
M += 1
خط ۶۳:
 
== منابع ==
{{پانویس}}
{{چپ‌چین}}
1. ^ De Berg, Mark; Cheong, Otfried; Van Kreveld, Marc; Overmars (2008). Computational Geometry Algorithms and Applications. Berlin: Springer. pp. 2–14. doi:10.1007/978-3-540-77974-2. {{شابک|978-3-540-77973-5}}.
سطر ۷۰ ⟵ ۷۱:
 
[[رده:الگوریتم‌ها]]
[[رده:الگوریتم‌های پوش محدب]]