Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Bài tập lớn mô phỏng trái đất quay quanh mặt trời theo quỹ đạo elip.

  1. #1
    Ngày gia nhập
    11 2012
    Bài viết
    1

    Mặc định Bài tập lớn mô phỏng trái đất quay quanh mặt trời theo quỹ đạo elip.

    Bài tập gần hoàn thành nhưng em không thể làm được code cho trái đất quay quanh mặt trời theo quỹ đạo elip. Biết phương trình elip nhưng không biết thay vào đâu cả. Xin các pro giúp em hoàn thành với ạ. Phần đồ họa này em học tới đâu thì biết tới đó chứ không hơn được. Em có ý tưởng là cho tâm trái đất di chuyển trên đường elip quanh tâm của mặt trời nhưng code thế nào thì em không biết :( Xin các pro giúp em với ạ, thật sự em rất là bí rồi. Đã tự mò mẩm rất nhiều trước khi lên đây nhờ :(
    Code:
    #include<iostream.h>
    #include<math.h>
    #include<stdio.h>
    #include<graphics.h>
    #include<conio.h>
    #include<STDLIB.h>
    #include<dos.h>
    
    typedef struct
    {
        int x,y;
    }toado;
    typedef struct
    {
        toado A[20];
    }dagiac;
    void khoitao()
    {
        int gdriver=0;
        int Mode=0;
        initgraph(&gdriver,&Mode,"C:\\TC\\BGI");
    }
    int round(float x)
    {
        int tam;
        if(x>(int(x)+0.5))
    	tam=int(x)+1;
        else
    	tam=int(x);
        return tam;
    }
    void Bres_tq(toado A, toado B, int color)
    {
        int Dx=B.x-A.x;
        int Dy=B.y-A.y;
        int x=A.x;
        int y=A.y;
        int dx=(Dx<0)?-1:1;
    	Dx=abs(Dx);
        int dy=(Dy<0)?-1:1;
    	Dy=abs(Dy);
        putpixel(x,y,color);
        if(Dx>Dy)
        {
    	int p=2*Dy-Dx;
    	int const1=2*Dy;
    	int const2=2*(Dy-Dx);
    	while(x!=B.x)
    	{
    		if(p<0)
    		{
    			p+=const1;
    		}
    		else
    		{
    			p+=const2;
    			y+=dy;
    		}
    		x+=dx;
    		putpixel(x,y,color);
    	}
        }
        else
        {
    	int p=2*Dx-Dy;
    	int const1=2*Dx;
    	int const2=2*(Dx-Dy);
    	while(y!=B.y)
    	{
    		if(p<0)
    		{
    			p+=const1;
    		}
    		else
    		{
    			p+=const2;
    			x+=dx;
    		}
    		y+=dy;
    		putpixel(x,y,color);
    	}
        }
    }
    void doixung(toado C, int x, int y, int color)
    {
        putpixel(C.x+x, C.y+y, color);
        putpixel(C.x-x, C.y+y, color);
        putpixel(C.x+x, C.y-y, color);
        putpixel(C.x-x, C.y-y, color);
        putpixel(C.x+y, C.y+x, color);
        putpixel(C.x-y, C.y+x, color);
        putpixel(C.x+y, C.y-x, color);
        putpixel(C.x-y, C.y-x, color);
    }
    void circle(toado C, int r, int color)
    {
        int x,y;
        for(x=0; x<=round(r*sqrt(2)/2);x++)
        {
    	y=round(sqrt(r*r-x*x));
    	doixung(C,x,y,color);
        }
    }
    void doixungelip(toado E, int x, int y, int color)
    {
        putpixel(E.x+x,E.y+y,color);
        putpixel(E.x-x,E.y+y,color);
        putpixel(E.x+x,E.y-y,color);
        putpixel(E.x-x,E.y-y,color);
    }
    void Bres_elip(toado E, float a, float b, int color)
    {
        float p;
        float x=0, y=b;
        float z1=(b*b)/(a*a);
        float z2=1/z1;
        p=2*z1-2*b+1;
        while(z1*(x/y)<=1)
        {
    	doixungelip(E,x,y,color);
    	if(p<=0)
    		p=p+2*z1*(2*x+3);
    	else
    	{
    		p=p+2*z1*(2*x+3)+4*(1-y);
    		y=y-1;
    	}
    	x=x+1;
        }
        x=a; y=0;
        p=2*z2-a*+1;
        while(z2*(y/x)<=1)
        {
    	doixungelip(E,x,y,color);
    	if(p<=0)
    		p=p+(2*y+3)*2*z2;
    	else
    	{
    		p=p+(2*y+3)*2*z2+4*(1-x);
    		x=x-1;
    	}
    	y=y+1;
        }
    }
    void paintC(toado C, int r, int color)
    {
        for (int i=C.x-r;i<=C.x+r; i++)
        for (int j=C.y-r;j<=C.y+r; j++)
    	if(((i-C.x)*(i-C.x)/r+(j-C.y)*(j-C.y)/r)<r)
    	{
    		putpixel(i,j,color);
    	}
    }
    toado phepquay(toado v, toado p, float g)
    {
        toado q;
        q.x=round(p.x*cos(g)-p.y*sin(g)+v.x*(1-cos(g))+v.y*sin(g));
        q.y=round(p.x*sin(g)+p.y*cos(g)-v.x*sin(g)+v.y*(1-cos(g)));
        return q;
    }
    void doixung_quay(toado t, toado p, int color, float g)
    {
        toado c,q;
        c.x=t.x+p.x;
        c.y=t.y+p.y;
        q=phepquay(t,c,g);
        putpixel(q.x, q.y, color);
    
        c.x=t.x-p.x;
        c.y=t.y+p.y;
        q=phepquay(t,c,g);
        putpixel(q.x, q.y, color);
    
        c.x=t.x+p.x;
        c.y=t.y-p.y;
        q=phepquay(t,c,g);
        putpixel(q.x, q.y, color);
    
        c.x=t.x-p.x;
        c.y=t.y-p.y;
        q=phepquay(t,c,g);
        putpixel(q.x, q.y, color);
    }
    void quay_elip(toado t, float a, float b, float g, int color)
    {
        float p;
        toado q;
        float x=0, y=b;
        float z1=(b*b)/(a*a);
        float z2=1/z1;
        p=2*z1-2*b+1;
        while(z1*(x/y)<=1)
        {
    	q.x=x; q.y=y;
    	doixung_quay(t,q,color,g);
    	if(p<=0)
    		p=p+2*z1*(2*x+3);
    	else
    	{
    		p=p+2*z1*(2*x+3)+4*(1-y);
    		y=y-1;
    	}
    		x=x+1;
    	}
    	x=a; y=0;
    	p=2*z2-a*+1;
    	while(z2*(y/x)<=1)
    	{
    	    q.x=x; q.y=y;
    	    doixung_quay(t,q,color,g);
    	    if(p<=0)
    		p=p+(2*y+3)*2*z2;
    	    else
    	    {
    		p=p+(2*y+3)*2*z2+4*(1-x);
    		x=x-1;
    	    }
    	    y=y+1;
    	}
    }
    void main()
    {
        toado A,B,C,D,E,F,G,H,I,K,L,M;
        dagiac d,e;
        int r,r1,r2,i,m,n,j,color,x,y,x0,y0;
        float a,b,g,z;
        khoitao();
        randomize();
        int k=0;
        while(k<1000)
        {
    	putpixel(random(1024),random(786),k);
    	k++;
        }
        A.x=320;
        A.y=240;
        I.x=280;
        I.y=385;
        L.x=I.x+45;
        L.y=I.y+20;
        B.x=A.x;
        B.y=A.y-95;
        C.x=A.x+95;
        C.y=A.y;
        D.x=A.x;
        D.y=A.y+95;
        E.x=A.x-95;
        E.y=A.y;
        G.x=A.x-70;
        G.y=A.y-70;
        H.x=A.x+70;
        H.y=A.y-70;
        K.x=A.x-70;
        K.y=A.y+70;
        M.x=A.x+70;
        M.y=A.y+70;
        Bres_tq(A,B,14);
        Bres_tq(A,C,14);
        Bres_tq(A,D,14);
        Bres_tq(A,E,14);
        Bres_tq(A,G,14);
        Bres_tq(A,H,14);
        Bres_tq(A,K,14);
        Bres_tq(A,M,14);
        r=65;
        a=300;
        b=a*2/4;
        Bres_elip(A,a,b,4);
        r1=30;
        r2=5;
        circle(A,r,4);
        paintC(A,r,4);
        circle(I,r1,2);
        paintC(I,r1,2);
        circle(L,r2,15);
        paintC(L,r2,15);
        g=0; i=0; z=0; j=0;
        while(!kbhit())
        {
    	circle(L,r2,15);
    	paintC(L,r2,15);
    
    	delay(150);
    	circle(L,r2,0);
    	paintC(L,r2,0);
    	if(g>6.28)
    	g=0;
    	g=g+0.001;
    	L=phepquay(I,L,g);
    	i++;
        }
        getch();
        closegraph();
    }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    11 2012
    Bài viết
    1

    giúp em với các bro ơi :( làm mãi chẳng ra, đúng là tệ quá :(

  3. #3
    Ngày gia nhập
    03 2014
    Bài viết
    0

    mình ko rành cái này lắm nhưng bạn có thể dùng tool lấy tọa độ 1 vài điểm trên hình elip có sẵn rồi cho tâm trái đất di chuyển đên các tọa độ đó
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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