#include "widget.h"
#include "aca.h"
#include "ui_widget.h"
#include <cstdlib>
#include <QLabel>
#include <QTime>
#include <QTimer>
#include <QMutex>
Ant pa[NUMBER_ANTS];
Ant pba;
int pcnt = 0;
extern int nc;
extern int na;
extern int cnt;
extern Ant a[];
extern City c[];
extern QMutex mutex;
extern Ant ba;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
image = QImage(IMAGE_WIDTH, IMAGE_HEIGHT, QImage::Format_RGB32); //画布的初始化大小,使用32位颜色
QColor backColor = qRgb(255, 255, 255); //画布初始化背景色使用白色
image.fill(backColor); //对画布进行填充
setWindowTitle(tr("TSP: ACA"));
setupButton();
/* 初始化随机城市群坐标,需要在Paint()之前. */
// Initialize random seed.
// QTime t;
// t = QTime::currentTime();
// qsrand(t.msec() + t.second() * 1000);
for(int i = 0; i < nc; i++){
int j = i;
c[i].randPosiInit(CITY_POSI_RANGE);
while(j >= 0){
j--;
if((c[j].getx() == c[i].getx()) || (c[j].gety() == c[i].gety())){
j = i;
c[i].randPosiInit(CITY_POSI_RANGE);
}
}
}
Paint();
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(rePaint()));
acathread = new ACAThread(this);
}
void Widget::setupButton(){
QFont buttonfont("Noto Sans", 12, 63);
buttonstart = new QPushButton(tr("Start"),this);
buttonstart->setFont(buttonfont);
buttonstart->setGeometry(228, 458, 65, 34);
buttonstart->setEnabled(true);
buttonstop = new QPushButton(tr("Stop"),this);
buttonstop->setFont(buttonfont);
buttonstop->setGeometry(301, 458, 65, 34);
buttonstop->setEnabled(false);
buttonquit = new QPushButton(tr("Quit"),this);
buttonquit->setFont(buttonfont);
buttonquit->setGeometry(374, 458, 65, 34);
connect(buttonstart, SIGNAL(clicked()), this, SLOT(buttonstartclick()));
connect(buttonstop, SIGNAL(clicked()), this, SLOT(buttonstopclick()));
connect(buttonquit, SIGNAL(clicked()), this, SLOT(buttonquitclick()));
}
void Widget::buttonstartclick(){
qDebug() << " Widget : 0x" << hex << QThread::currentThreadId();
acathread->start();
timer->start(TIMER_INTERVAL);
buttonstart->setEnabled(false);
buttonstop->setEnabled(true);
// qDebug() << "Finished buttonstartclick().\n";
}
void Widget::buttonstopclick(){
acathread->terminate();
timer->stop();
buttonstart->setEnabled(true);
buttonstop->setEnabled(false);
}
void Widget::buttonquitclick(){
exit(0);
}
void Widget::Paint()
{
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing, true); //设置反锯齿模式,好看一点
/* 绘制坐标系 *********************************************************************************/
int orgx = AXIS_X_ORIGIN_FIX; //确定坐标轴原点
int orgy = AXIS_Y_ORIGIN_FIX;
int imgw = IMAGE_WIDTH - AXIS_RIGHT_MARGIN - orgx; //确定坐标轴宽度跟高度
int imgh = orgy - AXIS_TOP_MARGIN;
//绘制坐标轴
QPen penaxis;
penaxis.setColor(QColor(0, 0, 0));
penaxis.setWidth(AXIS_LINE_WIDTH);
painter.setPen(penaxis);
painter.setBrush(Qt::NoBrush);
painter.drawLine(orgx,orgy,imgw + orgx,orgy); //坐标轴x宽度为width
painter.drawLine(orgx,orgy - imgh,orgx,orgy); //坐标轴y高度为height
painter.drawLine(imgw + orgx,orgy,imgw + orgx,orgy - imgh);
painter.drawLine(imgw + orgx,orgy - imgh,orgx,orgy - imgh);
//绘制刻度线
QPen pendegree;
pendegree.setColor(Qt::black);
pendegree.setWidth(AXIS_LINE_WIDTH);
painter.setPen(pendegree);
painter.setBrush(Qt::NoBrush);
for(int i=1;i<=10;i++) //分成10份
{
//选取合适的坐标,绘制一段长度为4的直线,用于表示刻度
painter.drawLine(orgx+i*imgw/10, orgy, orgx+i*imgw/10, orgy-4);
painter.drawText(orgx+(i-0.15)*imgw/10, orgy+15,
QString::number((int)(i*CITY_POSI_RANGE/10)));
painter.drawLine(orgx, orgy-i*imgw/10, orgx+4, orgy-i*imgw/10);
painter.drawText(orgx-20, orgy-(i-0.12)*imgw/10,
QString::number((int)(i*CITY_POSI_RANGE/10)));
}
painter.drawText(orgx-10, orgy+15,
QString::number((int)0));
double kx=(double)imgw / CITY_POSI_RANGE; //x的比例系数
double ky=(double)imgh / CITY_POSI_RANGE; //y的比例系数
/* 绘制城市点. ****************************************************************/
QBrush brushpoint;
brushpoint.setColor(QColor(0, 0, 255, 255));
brushpoint.setStyle(Qt::SolidPattern);
painter.setPen(Qt::NoPen); //蓝色的笔,用于标记各个点
painter.setBrush(brushpoint);
for(int i = 0; i < nc; i++){
painter.drawEllipse(orgx+kx*c[i].getx()-POINT_RADIUS,orgy-ky*c[i].gety()-POINT_RADIUS,
2*POINT_RADIUS, 2*POINT_RADIUS);
}
/* 设置标签并显示数据 *****************************************************************************/
/*
QFont labelfont("Times",15,63);
QLabel *dsclabelcity = new QLabel(tr("Citys:"));
dsclabelcity->setFont(labelfont);
QLabel *dsclabeldist = new QLabel(tr("Distance:"));
dsclabeldist->setFont(labelfont);
QLabel *dsclabelstep = new QLabel(tr("Steps:"));
dsclabelstep->setFont(labelfont);
labelfont.setFamily("Helvetica");
QLabel *vallabelcity = new QLabel(QString::number((int)n));
vallabelcity->setFont(labelfont);
QLabel *vallabeldist = new QLabel(QString::number(sum,'f',3));
vallabeldist->setFont(labelfont);
QLabel *vallabelstep = new QLabel(QString::number((int)213));
vallabelstep->setFont(labelfont);
QHBoxLayout *labellayout = new QHBoxLayout;
labellayout->addWidget(dsclabelcity,Qt::AlignLeft);
labellayout->addWidget(vallabelcity,Qt::AlignRight);
labellayout->addWidget(dsclabeldist,Qt::AlignLeft);
labellayout->addWidget(vallabeldist,Qt::AlignRight);
labellayout->addWidget(dsclabelstep,Qt::AlignLeft);
labellayout->addWidget(vallabelstep,Qt::AlignRight);
// labellayout->addWidget(dsclabelcity);
// labellayout->addWidget(vallabelcity);
// labellayout->addWidget(dsclabeldist);
// labellayout->addWidget(vallabeldist);
// labellayout->addWidget(dsclabelstep);
// labellayout->addWidget(vallabelstep);
// labellayout->addStretch();
// QVBoxLayout *mainlayout = new QVBoxLayout;
// mainlayout->addWidget(image);
// mainlayout->addLayout(labellayout);
labellayout->setGeometry(QRect(0,0,100,50));
setLayout(labellayout);
*/
QFont labelfont("Times",12,63);
labelcitystr = new QLabel(tr("Citys"),this);
labelcitystr->setFont(labelfont);
labelcitystr->setAlignment(Qt::AlignHCenter);
labelcitystr->setGeometry(10,450,50,25);
labelcityval = new QLabel(this);
labelcityval->setText(QString::number((int)nc));
labelcityval->setFont(labelfont);
labelcityval->setAlignment(Qt::AlignHCenter);
labelcityval->setGeometry(10,475,50,25);
labeldiststr = new QLabel(tr("Distance"),this);
labeldiststr->setFont(labelfont);
labeldiststr->setAlignment(Qt::AlignHCenter);
labeldiststr->setGeometry(75,450,70,25);
labeldistval = new QLabel(this);
labeldistval->setText(QString("-"));
labeldistval->setFont(labelfont);
labeldistval->setAlignment(Qt::AlignHCenter);
labeldistval->setGeometry(75,475,70,25);
labelstepstr = new QLabel(tr("Steps"),this);
labelstepstr->setFont(labelfont);
labelstepstr->setAlignment(Qt::AlignHCenter);
labelstepstr->setGeometry(160,450,50,25);
labelstepval = new QLabel(this);
labelstepval->setText(QString::number((int)pcnt));
labelstepval->setFont(labelfont);
labelstepval->setAlignment(Qt::AlignHCenter);
labelstepval->setGeometry(160,475,50,25);
q