# Đề tài: Mã nguồn C | Vẽ đường thẳng qua tọa độ 2 điểm

1. moonlight Khách

## Mã nguồn C | Vẽ đường thẳng qua tọa độ 2 điểm

Code:
```#include<graphics.h>
#include<math.h>
#include<dos.h>
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>

void khoitao()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "C:\\tc\\bgi");//Duong dan den thu muc bgi
errorcode = graphresult();
if (errorcode != grOk)
{
cout<<"\n Graphics error: "<<grapherrormsg(errorcode)
<<"\n Press any key to halt:";
getch();
exit(1);
}
}
//===============VE DUONG THANG VOI THUAT TOAN MIDPOINT==================
void midpoint(int x1,int y1,int x2,int y2,int val)
{
int tx=x2-x1,ty=y2-y1;
if (tx>=0)
if (ty>=0)
if (ty>=tx)//goc 2
{
int tg = x1;   x1 = y1;   y1 = tg;
tg = x2;   x2 = y2;   y2 = tg;
}
else endl;
else //if (ty<0)
if(tx>=-ty)//goc 8
{
y1 = -y1;
y2 = -y2;
}
else //if(-ty>tx && tx>0 && ty<0)//goc 7 doi xung voi goc 3 qua goc
{
x1 = -x1;   x2 = -x2;
int tg = x1;   x1 = y1;   y1 = tg;
tg = x2;   x2 = y2;   y2 = tg;
int tg1 = x1, tg2 = y1;
x1 = x2;   y1 = y2;
x2 = tg1;  y2 = tg2;
}
if(tx<0)
if(ty>0)
if(ty>=-tx)// && tx<0 && ty>0)//goc 3 tinh thong qua goc 4
{
x1 = -x1;   x2 = -x2;
int tg = x1;   x1 = y1;   y1 = tg;
tg = x2;   x2 = y2;   y2 = tg;
}
else
//if(-tx>ty && ty>0 && tx<0)//goc 4
{x1=-x1;x2=-x2;}
else
if(-ty>=-tx)// && tx<0 && ty<0)//goc 6
{
int tg = x1;   x1 = y1;   y1 = tg;
tg = x2;   x2 = y2;   y2 = tg;
int tg1 = x1, tg2 = y1;
x1 = x2;   y1 = y2;
x2 = tg1;  y2 = tg2;
}
else
// if(-tx>-ty && ty<0 && tx<0)//goc 5
{
int tg1 = x1, tg2 = y1;
x1 = x2;   y1 = y2;
x2 = tg1;  y2 = tg2;
}
int dx=x2-x1,dy=y2-y1;
int d=dy-dx/2,x=x1,y=y1;
while(x<x2)
{
if(d<=0) d+=dy;
else{d+=dy-dx;y++;}
++x;
if ((ty>=tx && tx>=0 && ty>=0)||(-ty>=-tx && tx<0 && ty<0)) putpixel(y,x,val);//goc 2 va goc 6
else if (tx>=-ty && tx>0 && ty<0) putpixel(x,-y,val);//goc 8
else if ((ty>=-tx && tx<0 && ty>0)||(-ty>=tx && tx>=0 && ty<=0)) putpixel(-y,x,val);//goc 3 va goc 7
else if (-tx>=ty && tx<0 && ty>0) putpixel(-x,y,val);//goc 4
else putpixel(x,y,val);//goc 1 va goc 5
}
}
void main()
{
khoitao();
clrscr();
cleardevice();
setbkcolor(0);
int x1,y1,x2,y2,c;
cout<<"\n Nhap toa do dinh dau (x1,y1): ";cin>>x1;cout<<" ";cin>>y1;
cout<<"\n Nhap toa do dinh cuoi (x2,y2): ";cin>>x2;cout<<" ";cin>>y2;
cout<<"\n Mau ve: ";cin>>c;
clrscr();
cleardevice();
setbkcolor(0);
midpoint(x1,y1,x2,y2,c);
getch();
}```
Từ đó các bạn hãy thử phát triển nó thành một hình chữ nhật rùi tô màu cho hình chữ nhật đó nhé !

2. Mình có 1 đoạn code này vẽ đường thẳng qua 2 điểm rất gọn và chính xác
Code:
```#include<iostream.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>

void ktdh(){
int mh=9;
int mode=2;
initgraph(&mh,&mode,"D:\\BORLANDC\\BGI");
int maloi=graphresult();
if (maloi==0) cout<<"Da khoi tao do hoa";
else cout<<"Co loi khoi tao do hoa";
};
void DDA(double x1,double y1, double x2, double y2, int color){
ktdh();
double x,y,temp;
if(abs(x2-x1)>abs(y2-y1)) temp=abs(x2-x1);
else temp=abs(y2-y1);
x=x1;
y=y1;
putpixel(ceil(x),ceil(y),color);
for(double i=1;i<=temp;i++){
x=x+(x2-x1)/temp;
y=y+(y2-y1)/temp;
putpixel(ceil(x),ceil(y),color);
};
};
void main(){
double x1,x2,y1,y2;
cout<<"Nhap x1, y1:";
cin>>x1>>y1;
cout<<endl<<"Nhap x2, y2:";
cin>>x2>>y2;
DDA(x1,y1,x2,y2,4);
getch();
};```
Mình dùng với số thực để tăng tính chính xác với các tọa độ điểm x1,y1 và x2,y2 vẫn nhập vào là số nguyên

3. Dùng số thực tăng độ chính xác, nhưng sẽ làm chậm tốc độ vẽ rất nhiều.

4. Nguyên bản được gửi bởi shinichi_haha
Dùng số thực tăng độ chính xác, nhưng sẽ làm chậm tốc độ vẽ rất nhiều.
Bởi vì nếu dùng số nguyên thì khi thuật toán ép kiểu sẽ dẫn đến không chính xác. Ví dụ số 0,... thì sau khi ép kiểu số đó vẫn nguyên là 1 hoặc 0. Không biết có cách nào khác hơn không để tránh dùng số thực không?

5. Thành viên mới
Ngày gia nhập
04 2009
Bài viết
1
các bác ơi!sao e k hiểu về đoạn này vây,các bác có cách nào hay hơn k?

6. Thành viên mới
Ngày gia nhập
03 2010
Bài viết
2

## Mã nguồn C | Vẽ đường thẳng qua tọa độ 2 điểm

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#define c WHITE
int round(float a)
{
int b;
if((floor(a)+0.5)<a)
{
b=((int)floor(a)+1);
}
else
{
b=(int)floor(a);
}
return b;
}
main()
{
//clrscr();
int gdriver,gmode;
gdriver=0;
gmode=0;
float x,y,xb,yb,m;
printf("Nhap toa do diem dau: \n");
printf("x= ");scanf("%f",&x);
printf("y= ");scanf("%f",&y);
printf("Nhap toa do diem cuoi: \n");
printf("xb= ");scanf("%f",&xb);
printf("yb= ");scanf("%f",&yb);
m=(float)((yb-y)/(xb-x));
clrscr();
initgraph(&gdriver,&gmode,"c:\\tc\\bgi");
putpixel(x,round(y),c);
while(x<xb)
{
x=x+1;
y=y+m;
putpixel(x,round(y),c);
}
getch();
closegraph();
}//DDA

7. góp vui dda tí nhỉ
PHP Code:
``` void dda(int x1,int y1,int x2,int y2,int color=YELLOW)    {        float x=x1,y=y1,temp=(abs(x2-x1)>=abs(y2-y1))?abs(x2-x1):abs(y2-y1);        putpixel(int(x+.05),int(y+0.5),color);        for(int i=0;i<temp;i++)            {                x+=(x2-x1)/temp;                y+=(y2-y1)/temp;                putpixel(int(x+.05),int(y+0.5),color);            }    }  ```
Đã được chỉnh sửa lần cuối bởi langman : 15-04-2010 lúc 10:34 PM.

8. Thành viên mới
Ngày gia nhập
05 2010
Bài viết
6
Cho mình ké cái Midpoint của mình với, các bạn đánh giá xem sao
PHP Code:
``` void HoanVi(int &a,int &b){     int tmp=a;     a=b;     b=tmp; } void MID(int x1,int y1,int x2,int y2,int col){     int x,y,p,A,B;     if(x1>x2){         HoanVi(x1,x2);         HoanVi(y1,y2);     }     A=y2-y1;     B=-(x2-x1);     x=x1;     y=y1;     if(abs(A)<abs(B)){         if(y1<y2){             p=A+B/2;             while(x<=x2){                 if(p<0)                     p+=A;                 else{                     y++;                     p+=A+B;                 }                 putpixel(x,y,col);                 x++;             }         }         else{             p=A-B/2;             while(x<=x2){                 if(p>0)                     p+=A;                 else{                     y--;                     p+=A-B;                 }                 putpixel(x,y,col);                 x++;             }         }     }     else{         if(y1<y2){             p=A/2+B;             while(y<=y2){                 if(p>0)                     p+=B;                 else{                     x++;                     p+=A+B;                 }                 putpixel(x,y,col);                 y++;             }         }         else{             p=A/2-B;             while(y>=y2){                 if(p<0)                     p-=B;                 else{                     x++;                     p+=A-B;                 }                 putpixel(x,y,col);                 y--;             }                 }     } }  ```

9. Các bác xài số thức và phép chia như thế máy nó thực hiện chậm đi bao nhiêu.
Trên thực tế người ta chỉ dùng phép cộng và nhân thôi.
Người ta dùng phép này gọi là nguyên hóa để tránh việc sử lý số thực trên máy.
Ngay từ lúc phương trình đầu tiên xây dựng, mà thấy dạng a/b sao không nhân 2 về với b để làm nguyên rồi từ đó mọi phương trình về sau cũng làm vậy.
PS: Xin chém gió vậy thôi vì trước em có làm đồ họa phần này rồi, nay code thì đã mất, nhưng mà đã cài kiểu nguyên hóa tức là trong code không hề có biến thực nào cảm, kể cả biến thực do sinh ra bời phép chia.

10. Bạn ơi có Bresenham không ! Share với ! Cái đường thẳng sao mà linh tinh hết cả lên được ấy .Thanks

#### Quyền hạn của bạn

• Bạn không thể gửi đề tài mới
• Bạn không thể gửi bài trả lời
• Bạn không thể gửi các đính kèm
• Bạn không thể chỉnh sửa bài viết của bạn