计算机图形学课内实验
用qt 写DDA ,Bresenham画线,中点圆和椭圆:
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QTextEdit>
#include <QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
QPushButton BlineDDA;
QPushButton BlineBre;
QPushButton Bcircular;
QPushButton Bellipse;
QTextEdit TlineDDA_x1;
QTextEdit TlineDDA_y1;
QTextEdit TlineDDA_x2;
QTextEdit TlineDDA_y2;
QLabel TlineDDA1_x1;
QLabel TlineDDA1_y1;
QLabel TlineDDA1_x2;
QLabel TlineDDA1_y2;
QTextEdit TlineBre_x1;
QTextEdit TlineBre_y1;
QTextEdit TlineBre_x2;
QTextEdit TlineBre_y2;
QLabel TlineBre1_x1;
QLabel TlineBre1_y1;
QLabel TlineBre1_x2;
QLabel TlineBre1_y2;
QTextEdit Tcircular_x;
QTextEdit Tcircular_y;
QTextEdit Tcircular_r;
QLabel Tcircular1_x;
QLabel Tcircular1_y;
QLabel Tcircular1_r;
QTextEdit Tellipse_x;
QTextEdit Tellipse_y;
QTextEdit Tellipse_rx;
QTextEdit Tellipse_ry;
QLabel Tellipse1_x;
QLabel Tellipse1_y;
QLabel Tellipse1_rx;
QLabel Tellipse1_ry;
int board_x=1000;
int board_y=1000;
int button_x=100;
int button_y=100;
int text_x=100;
int text_y=100;
QTimer *timer;
void paintEvent(QPaintEvent *);
void setup();
QPoint translate(int x,int y);
int mode=0;
int n;
int translate_x(int x);
int translate_y(int y);
void exchange(int* a,int* b);
int max(int a,int b);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QTextEdit>
#include <QPainter>
#include<QDebug>
#include <windows.h>
#include <QTime>
#include <QCoreApplication>
#include <math.h>
#include <QTimer>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setup();
timer=new QTimer(this);
timer->setInterval(10);
connect(&BlineBre,&QPushButton::clicked,[=](){
mode=1;
int x1=translate_x(TlineBre_x1.toPlainText().toInt());
int y1=translate_y(TlineBre_y1.toPlainText().toInt());
int x2=translate_x(TlineBre_x2.toPlainText().toInt());
int y2=translate_y(TlineBre_y2.toPlainText().toInt());
int number=max(abs(x1-x2),abs(y1-y2));
n=0;
connect(timer,&QTimer::timeout,[=](){
if(n<number)
{
update();
n++;
}
});
});
connect(&BlineDDA,&QPushButton::clicked,[=](){
mode=2;
int x1=translate_x(TlineDDA_x1.toPlainText().toInt());
int y1=translate_y(TlineDDA_y1.toPlainText().toInt());
int x2=translate_x(TlineDDA_x2.toPlainText().toInt());
int y2=translate_y(TlineDDA_y2.toPlainText().toInt());
int number=max(abs(x1-x2),abs(y1-y2));
n=0;
connect(timer,&QTimer::timeout,[=](){
if(n<number)
{
update();
n++;
}
});
});
connect(&Bcircular,&QPushButton::clicked,[=](){
mode=3;
int number=2*Tcircular_r.toPlainText().toInt();
n=0;
connect(timer,&QTimer::timeout,[=](){
if(n<number)
{
update();
n++;
}
});
});
connect(&Bellipse,&QPushButton::clicked,[=](){
mode=4;
int number=Tellipse_rx.toPlainText().toInt()+Tellipse_ry.toPlainText().toInt();
n=0;
connect(timer,&QTimer::timeout,[=](){
if(n<number)
{
update();
n++;
}
});
});
timer->start();
}
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(QPoint(0,board_y/2),QPoint(board_x,board_y/2));
painter.drawLine(QPoint(board_x/2,0),QPoint(board_x/2,board_y));
painter.drawText(QRect(board_x/2,board_y/2,board_x/2+50,board_y/2+25),"(0,0)");
QPen pen(QColor(123,0,0));
pen.setWidth(4);
painter.setPen(pen);
for(int i=0;i<=board_x;i+=20)
{
painter.drawPoint(i,0.5*board_y);
painter.drawPoint(0.5*board_y,i);
}
pen.setColor(QColor(0,0,0));
pen.setWidth(3);
painter.setPen(pen);
if(mode==0)
{}
else if(mode==1)
{
float x1=translate_x(TlineBre_x1.toPlainText().toInt());
float y1=translate_y(TlineBre_y1.toPlainText().toInt());
float x2=translate_x(TlineBre_x2.toPlainText().toInt());
float y2=translate_y(TlineBre_y2.toPlainText().toInt());
int num=0;
float dy,dx,y,x,p;
float m;
dx=fabs(x2-x1);
dy=fabs(y2-y1);
m=(y2-y1)/(x2-x1);
if(fabs(m)<1)
{
if(x1>x2)
{
x1=x2;
y1=y2;
}
x=x1;
y=y1;
p=2*dy-dx;
painter.drawPoint(x,y);
for(int k=0;(k<dx)&&(num<n);k++)
{
if(p<0)
{
p+=2*dy;
}
else
{
p+=2*dy-2*dx;
qDebug()<<m;
y=(m>0)?y+1:y-1;
}
num++;x++;
qDebug()<<p;
painter.drawPoint(x,y);
}
}
else
{
m=1/m;
if(y1>y2)
{
y1=y2;
x1=x2;
}
x=x1;
y=y1;
p=2*dx-dy;
painter.drawPoint(x,y);
for(int k=0;(k<dy)&&(num<n);k++)
{
if(p<0)
{
p+=2*dx;
}
else
{
p+=2*dx-2*dy;
qDebug()<<m;
x=(m>0)?x+1:x-1;
}
num++;y++;
qDebug()<<p;
painter.drawPoint(x,y);
}
}
}
else if(mode==2)
{
int x1=translate_x(TlineDDA_x1.toPlainText().toInt());
int y1=translate_y(TlineDDA_y1.toPlainText().toInt());
int x2=translate_x(TlineDDA_x2.toPlainText().toInt());
int y2=translate_y(TlineDDA_y2.toPlainText().toInt());
int num=0;
float dy,dx,y,m,x;
dx=x2-x1;
dy=y2-y1;
m=dy/dx;
qDebug()<<m;
if(fabs(m)<1)
{
y=y1;
if(x1>x2)
{
y=y2;
exchange(&x1,&x2);
exchange(&y1,&y2);
}
for(x=x1;(x<=x2)&&(num<n);x++)
{
painter.drawPoint(x,int(y+0.5));
y+=m;
num++;
}
}
else
{
m=1/m;
x=x1;
if(y1>y2)
{
x=x2;
exchange(&x1,&x2);
exchange(&y1,&y2);
}
for(y=y1;y<=y2&&(num<n);y++)
{
painter.drawPoint(int(x+0.5),y);
x+=m;
num++;
}
}
}
else if(mode==3)
{
int x_center=translate_x(Tcircular_x.toPlainText().toInt());
int y_center=translate_y(Tcircular_y.toPlainText().toInt());
int r=Tcircular_r.toPlainText().toInt();
long p=1-r;
int x=0;
int y=r;
int num=0;
painter.drawPoint(x_center,y_center+r);
painter.drawPoint(x_center,y_center-r);
painter.drawPoint(x_center+r,y_center);
painter.drawPoint(x_center-r,y_center);
while(x<y&&num<n)
{
if(p<0)
{
p+=2*x+3;
}
else
{
p+=2*x-2*y+5;
y--;
}
x++;num++;
painter.drawPoint(x_center+x,y_center+y);
painter.drawPoint(x_center-x,y_center-y);
painter.drawPoint(x_center+x,y_center-y);
painter.drawPoint(x_center-x,y_center+y);
painter.drawPoint(x_center+y,y_center+x);
painter.drawPoint(x_center-y,y_center-x);
painter.drawPoint(x_center+y,y_center-x);
painter.drawPoint(x_center-y,y_center+x);
}
}
else if(mode==4)
{
int x_center=translate_x(Tellipse_x.toPlainText().toInt());
int y_center=translate_y(Tellipse_y.toPlainText().toInt());
int rx=Tellipse_rx.toPlainText().toInt();
int ry=Tellipse_ry.toPlainText().toInt();
long p=long(ry*ry+0.25*rx*rx-ry*rx*rx);
int x=0;
int y=ry;
int num=0;
painter.drawPoint(x_center,y_center+ry);
painter.drawPoint(x_center,y_center-ry);
while(ry*ry*x<rx*rx*y&&num<n)
{
if(p<=0)
{
p+=ry*ry*(2*x+3);
}
else
{
p+=ry*ry*(2*x+3)+rx*rx*(-2*y+2);
y--;
}
x++;num++;
painter.drawPoint(x_center+x,y_center+y);
painter.drawPoint(x_center-x,y_center-y);
painter.drawPoint(x_center+x,y_center-y);
painter.drawPoint(x_center-x,y_center+y);
}
p=long(ry*ry*((x+0.5)*(x+0.5)-rx*rx))+long(rx*rx*(y-1)*(y-1));
while(y>0&&num<n)
{
if(p<=0)
{
p+=ry*ry*(2*x+2)+rx*rx*(-2*y+3);
x++;
}
else
{
p+=rx*rx*(-2*y+3);
}
y--;num++;
painter.drawPoint(x_center+x,y_center+y);
painter.drawPoint(x_center-x,y_center-y);
painter.drawPoint(x_center+x,y_center-y);
painter.drawPoint(x_center-x,y_center+y);
}
}
}
void MainWindow::setup()
{
resize(board_x+button_x+text_x+300,board_y);
BlineBre.setParent(this);
BlineBre.setText("Bresenham画线");
BlineBre.move(board_x,400);
BlineBre.setStyleSheet("text-align: left;");
BlineBre.setFixedSize(150,50);
BlineDDA.setParent(this);
BlineDDA.setText("DDA画线");
BlineDDA.move(board_x,button_y/2+400);
BlineDDA.setStyleSheet("text-align: left;");
BlineDDA.setFixedSize(150,50);
Bcircular.setParent(this);
Bcircular.setText("circular画圆");
Bcircular.move(board_x,2*button_y/2+400);
Bcircular.setStyleSheet("text-align: left;");
Bcircular.setFixedSize(150,50);
Bellipse.setParent(this);
Bellipse.setText("ellipse椭圆");
Bellipse.move(board_x,3*button_y/2+400);
Bellipse.setStyleSheet("text-align: left;");
Bellipse.setFixedSize(150,50);
TlineDDA1_x1.setParent(this);
TlineDDA1_x1.resize(50,50);
TlineDDA1_x1.setText("x1");
TlineDDA1_x1.move(board_x+button_x+60,400);
TlineDDA1_y1.setParent(this);
TlineDDA1_y1.resize(50,50);
TlineDDA1_y1.setText("y1");
TlineDDA1_y1.move(board_x+button_x+140,400);
TlineDDA1_x2.setParent(this);
TlineDDA1_x2.resize(50,50);
TlineDDA1_x2.setText("x2");
TlineDDA1_x2.move(board_x+button_x+220,400);
TlineDDA1_y2.setParent(this);
TlineDDA1_y2.resize(50,50);
TlineDDA1_y2.setText("y2");
TlineDDA1_y2.move(board_x+button_x+300,400);
TlineBre_x1.setParent(this);
TlineBre_x1.resize(50,50);
TlineBre_x1.move(board_x+button_x+80,400);
TlineBre_y1.setParent(this);
TlineBre_y1.resize(50,50);
TlineBre_y1.move(board_x+button_x+160,400);
TlineBre_x2.setParent(this);
TlineBre_x2.resize(50,50);
TlineBre_x2.move(board_x+button_x+240,400);
TlineBre_y2.setParent(this);
TlineBre_y2.resize(50,50);
TlineBre_y2.move(board_x+button_x+320,400);
TlineBre1_x1.setParent(this);
TlineBre1_x1.resize(50,50);
TlineBre1_x1.setText("x1");
TlineBre1_x1.move(board_x+button_x+60,button_y/2+400);
TlineBre1_y1.setParent(this);
TlineBre1_y1.resize(50,50);
TlineBre1_y1.setText("y1");
TlineBre1_y1.move(board_x+button_x+140,button_y/2+400);
TlineBre1_x2.setParent(this);
TlineBre1_x2.resize(50,50);
TlineBre1_x2.setText("x2");
TlineBre1_x2.move(board_x+button_x+220,button_y/2+400);
TlineBre1_y2.setParent(this);
TlineBre1_y2.resize(50,50);
TlineBre1_y2.setText("y2");
TlineBre1_y2.move(board_x+button_x+300,button_y/2+400);
TlineDDA_x1.setParent(this);
TlineDDA_x1.resize(50,50);
TlineDDA_x1.move(board_x+button_x+80,button_y/2+400);
TlineDDA_y1.setParent(this);
TlineDDA_y1.resize(50,50);
TlineDDA_y1.move(board_x+button_x+160,button_y/2+400);
TlineDDA_x2.setParent(this);
TlineDDA_x2.resize(50,50);
TlineDDA_x2.move(board_x+button_x+240,button_y/2+400);
TlineDDA_y2.setParent(this);
TlineDDA_y2.resize(50,50);
TlineDDA_y2.move(board_x+button_x+320,button_y/2+400);
Tcircular1_x.setParent(this);
Tcircular1_x.resize(50,50);
Tcircular1_x.setText("x");
Tcircular1_x.move(board_x+button_x+60,2*button_y/2+400);
Tcircular1_y.setParent(this);
Tcircular1_y.resize(50,50);
Tcircular1_y.setText("y");
Tcircular1_y.move(board_x+button_x+140,2*button_y/2+400);
Tcircular1_r.setParent(this);
Tcircular1_r.resize(50,50);
Tcircular1_r.setText("r");
Tcircular1_r.move(board_x+button_x+220,2*button_y/2+400);
Tcircular_x.setParent(this);
Tcircular_x.resize(50,50);
Tcircular_x.move(board_x+button_x+80,2*button_y/2+400);
Tcircular_y.setParent(this);
Tcircular_y.resize(50,50);
Tcircular_y.move(board_x+button_x+160,2*button_y/2+400);
Tcircular_r.setParent(this);
Tcircular_r.resize(50,50);
Tcircular_r.move(board_x+button_x+240,2*button_y/2+400);
Tellipse1_x.setParent(this);
Tellipse1_x.resize(50,50);
Tellipse1_x.setText("x");
Tellipse1_x.move(board_x+button_x+60,3*button_y/2+400);
Tellipse1_y.setParent(this);
Tellipse1_y.resize(50,50);
Tellipse1_y.setText("y");
Tellipse1_y.move(board_x+button_x+140,3*button_y/2+400);
Tellipse1_rx.setParent(this);
Tellipse1_rx.resize(50,50);
Tellipse1_rx.setText("rx");
Tellipse1_rx.move(board_x+button_x+220,3*button_y/2+400);
Tellipse1_ry.setParent(this);
Tellipse1_ry.resize(50,50);
Tellipse1_ry.setText("ry");
Tellipse1_ry.move(board_x+button_x+300,3*button_y/2+400);
Tellipse_x.setParent(this);
Tellipse_x.resize(50,50);
Tellipse_x.move(board_x+button_x+80,3*button_y/2+400);
Tellipse_y.setParent(this);
Tellipse_y.resize(50,50);
Tellipse_y.move(board_x+button_x+160,3*button_y/2+400);
Tellipse_rx.setParent(this);
Tellipse_rx.resize(50,50);
Tellipse_rx.move(board_x+button_x+240,3*button_y/2+400);
Tellipse_ry.setParent(this);
Tellipse_ry.resize(50,50);
Tellipse_ry.move(board_x+button_x+320,3*button_y/2+400);
}
QPoint MainWindow::translate(int x,int y)
{
QPoint p;
p.setX(x+board_x/2);
p.setY(board_y/2-y);
return p;
}
int MainWindow::translate_x(int x)
{
int x_=x+board_x/2;
return x_;
}
int MainWindow::translate_y(int y)
{
int y_=board_y/2-y;
return y_;
}
void MainWindow::exchange(int* a,int* b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int MainWindow::max(int a,int b)
{
return (a>b)?a:b;
}
MainWindow::~MainWindow()
{
delete ui;
}