Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

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

  1. #1
    No Avatar
    moonlight Khách

    Mặc định 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. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    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
    Không biết ghi gì luôn ...

  3. #3
    Ngày gia nhập
    07 2006
    Bài viết
    121

    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.

    OoShinHaoO

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Trích dẫn Nguyên bản được gửi bởi shinichi_haha Xem bài viết
    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?
    Không biết ghi gì luôn ...

  5. #5
    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. #6
    Ngày gia nhập
    03 2010
    Bài viết
    2

    Mặc định 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. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,005

    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.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  8. #8
    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. #9
    Ngày gia nhập
    04 2010
    Nơi ở
    Thâm sơn cùng cốc
    Bài viết
    825

    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. #10
    Ngày gia nhập
    11 2008
    Bài viết
    27

    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
    http://i454.photobucket.com/albums/qq268/cotragiang/izt1u8.gif

Các đề tài tương tự

  1. Cách vẽ đường thẳng nối 3 điểm của một đồ thị?
    Gửi bởi apo_silent trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 05-08-2012, 11:29 PM
  2. vẽ đường thẳng trong C#
    Gửi bởi gen.infor trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 29-10-2011, 04:55 PM
  3. Viết chương trình sử dụng lớp để vẽ 1 đường thẳng...
    Gửi bởi ngocdaihumg9109 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 19
    Bài viết cuối: 25-03-2011, 10:48 PM
  4. hàm vẽ đường thẳng có màu trong c++
    Gửi bởi sky_night trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-11-2010, 06:02 PM
  5. Vẽ đường thẳng DDA và Bresenham!
    Gửi bởi alias_va trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 18-11-2007, 01:00 AM

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