Tô màu Tam giác-Final Version

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Tô màu Tam giác-Final Version

Bài gửi by anbinhtrong on Mon Dec 14, 2009 2:44 am

Vừa làm xong, cuối cùng cũng hiểu ra nhiều điều. Nhưng không biết đi thi có kịp làm bài không?
Ở đây, việc tính m ( hệ số góc tg hay cotg) nên chú ý kĩ là ta đang xét góc nào? Và khi chạy chương trình nên xem kĩ m1 và m2, lúc nào dương lúc nào âm, phải dự đoán được nữa.
Code:
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#include <math.h>
#include "glut.h"
// -------------------------------------
// CAC HAM XU SU KIEN
// -------------------------------------
// khoi tao thong so
struct Point
{
   int x,y;
};

void OnInit();
// ham su kien ve
void OnDraw();
// ham su kien nhan phim
void OnKey(unsigned char key,int x, int y);
void ToTamGiac_DayPhang(Point &P1, Point &P2, Point &P3);
void ToTamGiac(Point P1, Point P2, Point P3);
// -------------------------------------
// KHAI BAO CAC HAM VA BIEN
// -------------------------------------

int main(int argc, char* argv[])
{
   // -------------------------------------
   // KHOI TAO CUA SO OPENGL
   // -------------------------------------
   // khoi tao tham so cua so
   glutInit(&argc, argv);
   // che do hien thi: double buffer va he mau RGB
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
   // do rong, cao cua cua so
   glutInitWindowSize(640, 480);
   // vi tri bat dau cua so
   glutInitWindowPosition(0, 0);
   // tao cua so
   glutCreateWindow("To mau-Carmen!");
   gluOrtho2D(0.0, 800.0, 0.0, 600.0);
   // -------------------------------------
   // CAC THAO TAC XU LY
   // -------------------------------------

   // -------------------------------------
   // DANG KY SU KIEN
   // -------------------------------------
   // dang ky su kien ve
   glutDisplayFunc(OnDraw);
   // dang ky su kien nhan phim
   glutKeyboardFunc(OnKey);

   // -------------------------------------
   // VONG LAP SU KIEN
   // -------------------------------------
   glutMainLoop();

   return 0;
}

void OnInit()
{
   // thiet lap mau xoa
   glClearColor(1.0,1.0,1.0,1.0);   
   
}// OnInit

void OnDraw()
{
   // xoa man hinh
   glClear(GL_COLOR_BUFFER_BIT);
   Point P1,P2,P3;
/*   P1.x=10;
   P1.y=200;

   P2.x=310;
   P2.y=200;

   P3.x=100;
   P3.y=50;*/
   P1.x=10;
   P1.y=200;

   P2.x=310;
   P2.y=300;

   P3.x=100;
   P3.y=500;
   // cac thao tac ve
   glBegin(GL_LINE_LOOP);
      glVertex2i(P1.x,P1.y);
      glVertex2i(P2.x,P2.y);
      glVertex2i(P3.x,P3.y);
   glEnd();

   // ket xuat ra man hinh
   glFlush();
   glColor3ub(255,0,0);
   ToTamGiac(P1,P2,P3);
   // chuyen tien canh sang hau canh va nguoc lai (double buffer)
   glutSwapBuffers();
}// Display


void OnKey(unsigned char key,int x, int y)
{
   switch(key)
   {
      case 3: // (Ctrl+C)
      case 27: // (ESC)
         exit(0);
      break;
   }// switch key
}// OnKey

void SwapPoint(Point &P1, Point &P2)
{
   Point tg;
   tg=P1;
   P1=P2;
   P2=tg;
}

void SapXep(Point &P1, Point &P2, Point &P3)
{
   if(P1.y > P2.y) SwapPoint(P1,P2);
   if(P1.y > P3.y) SwapPoint(P1,P3);
   if(P2.y > P3.y) SwapPoint(P2,P3);
}

void Line(int x1,int y1, int x2, int y2)
{
   glBegin(GL_LINES);
      glVertex2i(x1,y1);
      glVertex2i(x2,y2);
   glEnd();
   glFlush();
}

int Round( double x)
{
   x+=0.5;
   return (int)x;
}

bool ThangHang(Point &P1, Point &P2, Point &P3)
{
   if(P1.x==P2.x && P1.x==P3.x) return 1;
   //Xet he so goc xem co cung nam tren duong cheo hay khong?
   float m1=(float)(P1.y-P2.y)/(P1.x-P2.x);
   float m2=(float)(P1.y-P2.y)/(P1.x-P2.x);
   return (m1==m2);
}

void ToTamGiac_DayPhang(Point &P1, Point &P2, Point &P3)
{
   //Tinh goc phia tren P1, cotg chu khong phai tg
   double m1;
   double m2;
   m1=double(P2.x-P1.x)/(P2.y-P1.y);
   m2=double(P3.x-P1.x)/(P3.y-P1.y);
   double xl=P1.x,xr=P1.x;
   int y;   
   for(y=P1.y;y<=P3.y;y++)
   {
      Line(Round(xl),y,Round(xr),y);
      xl=xl+m1;
      xr=xr+m2;
   }
}

void ToTamGiac_DinhPhang(Point &P1, Point &P2, Point &P3)
{
   //Tinh goc phia tren P1, cotg chu khong phai tg
   double m1=double(P3.x-P1.x)/(P3.y-P1.y);
   double m2=double(P3.x-P2.x)/(P3.y-P2.y);
   double xl=P1.x,xr=P2.x;
   int y;
   for(y=P1.y;y<=P3.y;y++)
   {
      Line(Round(xl),y,Round(xr),y);
      xl=xl+m1;
      xr=xr+m2;
   }
}


void ToTamGiac(Point P1, Point P2, Point P3)
{
   SapXep(P1,P2,P3);
   if(ThangHang(P1,P2,P3)!=0)
   {
      if(P1.y==P2.y)
         ToTamGiac_DinhPhang(P1,P2,P3);
      else
      {
         if(P2.y==P3.y)
            ToTamGiac_DayPhang(P1,P2,P3);
         else
         {
            Point P_tg;
            P_tg.x=(int)(P1.x+ (float)((P2.y-P1.y)*(P3.x-P1.x))/(P3.y-P1.y));
            P_tg.y=P2.y;
            ToTamGiac_DayPhang(P1,P2,P_tg);
            ToTamGiac_DinhPhang(P2,P_tg,P3);
         }
      }
   }
}
Very Happy
avatar
anbinhtrong
Admin
Admin

Tổng số bài gửi : 216
Join date : 05/11/2009
Age : 28
Đến từ : BT

Xem lý lịch thành viên http://ngoctho.forum-viet.net

Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết