PDA

View Full Version : سوال: ترسیم خط



kamran_14
دوشنبه 09 فروردین 1389, 22:13 عصر
سلام
ببخشید این الگوریتم برای رسم خط است وفقط برای حالتی که dx>0 , dy>0 است درست جواب می ده
می شه کمکم کنید تا مشکل این الگوریتم را حل کنم؟
متشکرم



#include<iostream.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
main()
{
clrscr();
int p,x1,y1,x2,y2,dx,dy,gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,"");
cin>>x1>>y1>>x2>>y2;
dx=x2-x1;
dy=y2-y1;
p=2*dy-dx;
for(int i=0;i<dx;i++)
{
if (p<0)
{
x1++;
p=p+2*dy;
}
else
{
x1++;
y1++;
p=p+2*dy-2*dx;
}
putpixel(x1,y1,15);
}
getch();
}

amin1softco
سه شنبه 10 فروردین 1389, 00:44 صبح
#include <conio.h>
#include <math.h>
#include<graphics.h>

#define sgn(x) ((x<0)?-1:((x>0)?1:0)) /* macro to return the sign of a number */


void line_slow(int x1, int y1, int x2, int y2, int color)
{
int dx,dy,sdx,sdy,px,py,dxabs,dyabs,i;
float slope;

dx=x2-x1; /* the horizontal distance of the line */
dy=y2-y1; /* the vertical distance of the line */
dxabs=abs(dx);
dyabs=abs(dy);
sdx=sgn(dx);
sdy=sgn(dy);
if (dxabs>=dyabs) /* the line is more horizontal than vertical */
{
slope=(float)dy / (float)dx;
for(i=0;i!=dx;i+=sdx)
{
px=i+x1;
py=slope*i+y1;
putpixel(px,py,color);
}
}
else /* the line is more vertical than horizontal */
{
slope=(float)dx / (float)dy;
for(i=0;i!=dy;i+=sdy)
{
px=slope*i+x1;
py=i+y1;
putpixel(px,py,color);
}
}
}

void main(){
clrscr();
int gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,"");
line_slow(0,0,50,50,15);
getch();
}

kamran_14
چهارشنبه 11 فروردین 1389, 21:34 عصر
سلام
از جواب مفیدتون خیلی ممنونم
می شه کمی برنامه تونو توضیح بدید؟
خیلی ممنونم

kamran_14
پنج شنبه 12 فروردین 1389, 13:08 عصر
وقتی که dx بزرگتر از dy باشه چرا dy را به dx تقسیم می کنیم و شیب را درpy می نویسیم ولی وقتی که dy بزرگتر از dx باشه dx را به dy تقسیم می کنیم و شیب را در px می نویسیم ؟

amin1softco
پنج شنبه 12 فروردین 1389, 14:29 عصر
ببین این الگوریتم خط برزنهام نیست به صورت معمولی خط را رسم می کنه شیوه کارشم به این شکله که وقتی خط بیشتر خوابیده باشه (بیشتر افقی باشه تا عمودی)از فرمول معمولی که تو راهنمایی خوندیم استفاده می کنه به این صورت:

http://up.iranblog.com/2162/1270147056.gif

اما وقتی که خط ایستاده باشه (بیشتر عمودی باشه تا افقی) همون فرمول قبلی رو بر اساس x محاسبه می کنیم که بشه این:

http://up.iranblog.com/2162/1270150806.gif

دلیل این شرط اینه که در حالتی که خط خوابیده است پیکسل ها x به ترتیب پشت سر هم هستند ولی وقتی خط ایستاده باشه پیکسل های y به ترتیب پشت سر هم هستند.
و برای اینکه تقسیم رو در مرحله بعدی حذف کنیم در ابتدای حلقه dx را بر dy تقسیم می کنیم .