y - ghaemindustrial.com

Download Report

Transcript y - ghaemindustrial.com

‫گرافیک رایانه ای‬
‫الگوریتم های ترسیم خط‬
‫گردآوری‪ :‬مهندس رضا فهیمی‬
‫به راستی خطوط چگونه در کامپیوتر ترسیم می شوند؟‬
‫• همانطور که در تصویر مشاهده می شود‬
‫برای ترسیم یک خط بایستی پیکسل های‬
‫مرتبط در صفحه نمایش رنگ شوند حال‬
‫برای انتخاب پیکسل های مناسب الگوریتم‬
‫های متعددی در دنیای کامپیوتر وجود‬
‫دارد که به ‪ 2‬الگوریتم ‪ DDA‬و برسنهایم‬
‫اشاره می شود‪:‬‬
‫الگوریتم ‪(Digital Differential Analyzer) DDA‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫برای ترسیم یک خط نقطه ابتدایی و انتهایی خط را در نظر می گیریم‪:‬‬
‫)‪(x0, y0) , (x1, y1‬‬
‫نقطه ابتدایی را رنگ می کنیم (محاسبات براساس نزدیک ترین نقطه با عدد صحیح‬
‫می باشد و در صورت لزوم عدد را گرد می کنیم)‬
‫فرض کنید ‪( x1-x0 > y1-y0‬یعنی شیب خط کوچکتر از ‪ 1‬است)‬
‫در صورت وجود فرض باال برای محاسبه و ترسیم خط بایستی ‪ x1-x0‬گام را طی‬
‫کنیم (گام خط)‬
‫در این مرحله ‪ x=x0, y=y0‬را قرار می دهیم‪.‬‬
‫در هر مرحله‬
‫‪ x‬را به اندازه یک واحد افزایش می دهیم (‪) (x1-x0)/numsteps‬‬
‫‪ y‬را به اندازه شیب خط افزایش می دهیم (‪) (y1-y0)/numsteps‬‬
‫در پایان اعداد هر مرحله را به نزدیکترین عدد صحیح ‪ x‬و ‪ y‬گرد کرده و رنگ می‬
‫کنیم‪.‬‬
DDA ‫تابع نمونه برای الگوریتم‬
// ‫با فرض مالیم بودن شیب خط‬
DDA(float x0, float x1, float y0, float y1) {
float x, y;
float xinc, yinc;
int numsteps;
numsteps = Round(x1) – Round(x0);
xinc = (x1 – x0) / numsteps;
yinc = (y1 – y0) / numsteps;
x = x0;
y = y0;
ColorPixel(Round(x),Round(y));
for (int i=0; i<numsteps; i++) {
x += xinc;
y += yinc;
ColorPixel(Round(x),Round(y));
}
}
‫مثال برای الگوریتم ‪DDA‬‬
‫• مطلوب است ترسیم خطی با نقاط‬
‫ابتدائی و انتهائی )‪ (2,3‬و )‪(12,8‬از‬
‫طریق الگوریتم ‪DDA.‬‬
‫• حل‪ :‬برای این منظور بایستی ابتدا گام‬
‫حل مسئله محاسبه شود با توجه به‬
‫اینکه ‪ x2-x1>y2-1‬می باشد داریم‪:‬‬
‫‪ = x2-x1=12 – 2 = 10‬گام مسئله •‬
‫‪• xinc = 10/10 = 1.0‬‬
‫‪• yinc = 5/10 = 0.5‬‬
‫کلیه محاسبات در جدول مقابل دیده می شود‬
‫افزایش ‪y‬‬
‫افزایش ‪x‬‬
‫)‪R(y‬‬
‫)‪R(x‬‬
‫‪y‬‬
‫‪x‬‬
‫گام‬
‫‪3‬‬
‫‪2‬‬
‫‪3‬‬
‫‪2‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪3.5‬‬
‫‪3‬‬
‫‪1‬‬
‫‪4‬‬
‫‪4‬‬
‫‪4‬‬
‫‪4‬‬
‫‪2‬‬
‫‪5‬‬
‫‪5‬‬
‫‪4.5‬‬
‫‪5‬‬
‫‪3‬‬
‫‪5‬‬
‫‪6‬‬
‫‪5‬‬
‫‪6‬‬
‫‪4‬‬
‫‪6‬‬
‫‪7‬‬
‫‪5.5‬‬
‫‪7‬‬
‫‪5‬‬
‫‪6‬‬
‫‪8‬‬
‫‪6‬‬
‫‪8‬‬
‫‪6‬‬
‫‪7‬‬
‫‪9‬‬
‫‪6.5‬‬
‫‪9‬‬
‫‪7‬‬
‫‪7‬‬
‫‪10‬‬
‫‪7‬‬
‫‪10‬‬
‫‪8‬‬
‫‪8‬‬
‫‪11‬‬
‫‪7.5‬‬
‫‪11‬‬
‫‪9‬‬
‫‪8‬‬
‫‪12‬‬
‫‪8‬‬
‫‪12‬‬
‫‪10‬‬
‫همانطوری که مشاهده شد عملیات ترسیم خط به روش‬
‫‪DDA‬صورت گرفت ولی محاسبات اعشاری و گرد‬
‫کردن اعداد به نزدیکترین نقطه برای سیستم محاسباتی‬
‫وقت گیر است‪.‬‬
‫الگوریتم ‪Bresenham’s‬‬
‫اساس کار این الگوریتم محاسبه فاصله بین مختصات ‪ y‬واقعی‬
‫و نقاط ‪ y‬باالئی و پائینی می باشد (در این روش محاسبات‬
‫براساس اعداد صحیح و شیب خط نیز مالیم فرض می‬
‫شود‪.‬‬
‫‪dupper‬‬
‫‪dlower‬‬
‫فرض کنید که شیب خط با مالیمت از سمت چپ آغاز می شود‪( .‬یعنی نقطه ابتدائی سمت چپ قراردارد) نقطه‬
‫ابتدائی را رنگ می کنیم و در مرحله بعد برای هر مقدار ‪ x‬بایستی مقدار ‪ y‬یا ‪ y+1‬را محاسبه کنیم‪.‬‬
‫‪ .1‬نقطه ابتدائی )‪ (x0,y0‬را رنگ می کنیم‪.‬‬
‫‪ .2‬مقادیر ‪ dx‬و ‪ dy‬و ‪ 2dy‬و ‪ 2dy - 2dx‬را محاسبه می کنیم‪.‬‬
‫‪ .3‬برای محاسبه نقطه بعدی فرمول زیر را به عنوان فرمول تصمیم ‪ p0‬در نظر می گیریم‪:‬‬
‫‪p0 = 2dy – dx‬‬
‫اگر ‪ pk<0‬نقطه بعدی )‪ (xk + 1,yk‬خواهد بود و فرمول نقطه تصمیم ‪ pk+1 = pk + 2dy‬می باشد‪.‬‬
‫در غیر این صورت نقطه بعدی )‪ (xk + 1, yk + 1‬و نقطه تصمیم ‪ pk+1 = pk + 2dy – 2dx‬خواهد بود‪.‬‬
‫الزم به ذکر است که ‪ K‬در هر مرحله از صفر شروع خواهد شد‪.‬‬
‫‪ .4‬مراحل فوق را ‪ dx‬بار تکرار می کنیم‪.‬‬
‫توجه ‪:‬‬
‫در صورتی که شیب خط منفی باشد نقش ‪ x‬و ‪ y‬تغییر خواهد کرد‪.‬‬
‫مثال برای الگوریتم‬
‫‪Bresenham’s‬‬
‫مطلوب است ترسیم خطی با نقاط‬
‫ابتدایی و انتهایی )‪ (2,3‬و )‪ (12,8‬از‬
‫طریق الگوریتم برسنهام‪.‬‬
‫حل ‪ :‬ابتدا مقادیر زیر را آماده و تابع‬
‫تصمیم را نیز برای هر مرحله‬
‫محاسبه می کنیم اعداد و ارقام در‬
‫جدول مقابل مشاهده می شود‪.‬‬
‫‪dx = 12 – 2 = 10‬‬
‫‪dy = 8 – 3 = 5‬‬
‫‪p0 = 2dy – dx = 15‬‬
‫‪2dy = 10‬‬
‫‪2dy – 2dx = -10‬‬
‫پایان‬
‫‪[email protected]‬‬
‫)‪P(y‬‬
‫)‪P(x‬‬
‫‪p‬‬
‫گام‬
‫‪3‬‬
‫‪2‬‬
‫‪0‬‬
‫‪0‬‬
‫‪4‬‬
‫‪3‬‬
‫‪-10‬‬
‫‪1‬‬
‫‪4‬‬
‫‪4‬‬
‫‪0‬‬
‫‪2‬‬
‫‪5‬‬
‫‪5‬‬
‫‪-10‬‬
‫‪3‬‬
‫‪5‬‬
‫‪6‬‬
‫‪0‬‬
‫‪4‬‬
‫‪6‬‬
‫‪7‬‬
‫‪-10‬‬
‫‪5‬‬
‫‪6‬‬
‫‪8‬‬
‫‪0‬‬
‫‪6‬‬
‫‪7‬‬
‫‪9‬‬
‫‪-10‬‬
‫‪7‬‬
‫‪7‬‬
‫‪10‬‬
‫‪0‬‬
‫‪8‬‬
‫‪8‬‬
‫‪11‬‬
‫‪-10‬‬
‫‪9‬‬
‫‪8‬‬
‫‪12‬‬
‫‪0‬‬
‫‪10‬‬