用qt 写DDA ,Bresenham画线,中点圆和椭圆

计算机图形学课内实验

用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;
}

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值