#include<GL/glut.h>
#include<iostream>
#include<algorithm>
using namespace std;
int X1, X2, Y1, Y2;
int wmin = 200, wmax = 400;
int hmin = 200, hmax = 400;
int flag = 1,choosenpoint=0;
int window_size = 600;
bool ClipT(float p, float q, float& u1, float& u2);
void LB_LineClip(float x1, float y1, float x2, float y2, float XL, float XR, float YB, float YT) {
float dx=x2-x1, dy=y2-y1, u1=0.0, u2=1.0;
if (ClipT(-dx, x1 - XL, u1, u2)) {
if (ClipT(dx, XR - x1, u1, u2)) {
if (ClipT(-dy, y1 - YB, u1, u2)) {
if (ClipT(dy, YT - y1, u1, u2) ){
//先算P2
x2 = x1 + u2 * dx;
y2 = y1 + u2 * dy;
x1 = x1 + u1 * dx;
y1 = y1 + u1 * dy;
glBegin(GL_LINES);
glColor3ub(0,0,0);
glVertex2f(x1, y1);
glVertex2f(x2, y2);
glEnd();
glFlush();
}
}
}
}
}
bool ClipT(float p, float q, float& u1,float& u2) {
float r;
if (p < 0) {
r = q / p;
if (r > u2) {
return false;
}
if (r > u1) {
u1 = r;
}
}
else if (p > 0) {
r = q / p;
if (r < u1) {
return false;
}
if (r < u2) {
u2 = r;
}
}
else return(q >= 0);
return true;
}
void Init() {
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(7);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0, window_size, window_size,0);
}
void myDisplay(){
glClear(GL_COLOR_BUFFER_BIT);
//绘制裁剪区域
glColor3f(0, 1, 1);
glBegin(GL_LINES);
//1、L
glVertex2i(wmin, hmin);
glVertex2i(wmin, hmax);
//2、B
glVertex2i(wmin, hmin);
glVertex2i(wmax, hmin);
//3、R
glVertex2i(wmax, hmin);
glVertex2i(wmax, hmax);
//4、T
glVertex2i(wmin, hmax);
glVertex2i(wmax, hmax);
glEnd();
glFlush();
}
void drawLine(int x,int y) {
if (wmin > wmax) swap(wmin, wmax);
if (hmin > hmax) swap(hmax, hmin);
if (flag % 2) {
myDisplay();
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
glVertex2f(x, y);
X1 = x; Y1 = y;
glEnd();
glFlush();
}
else {
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
X2 = x; Y2 = y;
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(X1, Y1);
glVertex2f(X2, Y2);
glEnd();
glFlush();
LB_LineClip(X1, Y1, X2, Y2, wmin, wmax, hmin, hmax);
}
flag++;
}
void dragMouse(int x,int y) {
if (choosenpoint == 1||choosenpoint==2) {
myDisplay();
if (choosenpoint == 1) {
X1 = x; Y1 = y;
}
else {
X2 = x; Y2 = y;
}
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
glVertex2f(X1, Y1);
glVertex2f(X2,Y2);
glEnd();
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(X1, Y1);
glVertex2f(X2, Y2);
glEnd();
glFlush();
LB_LineClip(X1, Y1, X2, Y2, wmin, wmax, hmin, hmax);
}
if (choosenpoint == 3) {
flag = 1;
wmax = x; hmax = y;
cout << "鼠标右键在拖动" << endl;
myDisplay();
}
}
void OnMouse(int button, int state, int x, int y){
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
if (abs(x - X1) < 10 && abs(y - Y1) < 10) {
cout << "选中了点1" << endl;
choosenpoint = 1;
}
else if (abs(x - X2) < 10 && abs(y - Y2) < 10) {
cout << "选中了点2" << endl;
choosenpoint = 2;
}
else {
choosenpoint = 0;
drawLine(x, y);
}
}
if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
choosenpoint = 3;
wmin = x; hmin = y;
}
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(300, 100);
glutInitWindowSize(window_size, window_size);
glutCreateWindow("梁友栋-Barskey裁剪算法");
Init();
glutMouseFunc(&OnMouse);
glutDisplayFunc(&myDisplay);
glutMotionFunc(dragMouse);
glutMainLoop();
return 0;
}
计算机图形学实验二:梁-Barsky直线裁剪算法
于 2020-09-29 21:22:19 首次发布
本文介绍了一个使用C++和OpenGL实现的二维线条裁剪算法LB_LineClip,通过实例展示了如何在指定窗口范围内绘制并裁剪线条。博客涵盖了鼠标交互、点选择和区域定义,适合学习图形学和OpenGL基础。
摘要由CSDN通过智能技术生成