I'm the story I was telling
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

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

Go down

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

Bài gửi by anbinhtrong 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
anbinhtrong
anbinhtrong
Admin
Admin

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

https://ngoctho.forum-viet.net

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

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