Tô màu Tam giác-Final Version
Trang 1 trong tổng số 1 trang
Tô màu Tam giác-Final Version
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.
Ở đâ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);
}
}
}
}
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết