You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

346 lines
9.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "mainwindow.h"
#include "ui_mainwindow.h"
// #include <iostream>
#include <QtCharts/QLineSeries>
#include <QTimer>
#include <QIcon>
#include <QFile>
#include "UIcommon.h"
#include <QJsonObject>
#include <QScatterSeries>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
InitUI();
InitEnv();
//timer->start(800);
// updateUi();
// connect(series1, &QLineSeries::clicked, chart, &UChart::keepCallout);
// connect(series1, &QLineSeries::hovered, chart, &UChart::tooltip);
// connect(series2, &QLineSeries::clicked, chart, &UChart::keepCallout);
// connect(series2, &QLineSeries::hovered, chart, &UChart::tooltip);
}
MainWindow::~MainWindow()
{
delete ui;
}
//设置初始环境变量
void MainWindow::InitEnv()
{
std::vector<AgentState> init_states {{1, 2, M_PI/2},
{2, 2, M_PI/2},
{3, 2, M_PI/2},
{3.1, 2, M_PI/2}};
std::vector<double> raduis = {RADUIS, RADUIS, RADUIS, RADUIS};
std::vector<double> blind_angle = {BLIND_ANGLE, BLIND_ANGLE, BLIND_ANGLE, BLIND_ANGLE};
multi_agent = std::vector<Agent *>();
Agent::InitMultiAgent(&multi_agent, init_states, raduis, blind_angle);
env = new Enviroment(&multi_agent, 50, 50);
env->Observe();
DispEnvNow();
}
//初始化ui
void MainWindow::InitUI()
{
step_now = 0;
play_flag = false;
data = new QJsonObject();
chart = ui->displayer;
ui->back_botton->setIcon(QIcon(":/control_bar/img/icon/rewind_mini_fill.png"));
ui->back_botton->setIconSize(QSize(50, 50));
ui->next_botton->setIcon(QIcon(":/control_bar/img/icon/speed_mini_fill.png"));
ui->next_botton->setIconSize(QSize(50, 50));
ui->start_botton->setIcon(QIcon(":/control_bar/img/icon/play_fill.png"));
ui->start_botton->setIconSize(QSize(50, 50));
ui->start_botton->setEnabled(false);
ui->back_botton->setEnabled(false);
ui->next_botton->setEnabled(false);
connect(timer, &QTimer::timeout, this, &MainWindow::UpdateUI);
}
void MainWindow::PaintAgent(QLineSeries* serial, AgentState state, double r, double blind_angle)
{
int arc_sample = 180;
int line_sample = 10;
double x0 = state.x;
double y0 = state.y;
double header = state.head;
double start_angle = header - (2*M_PI - blind_angle)/2;
double end_angle = header + (2*M_PI - blind_angle)/2;
QPointF p_start(x0+r*cos(start_angle), y0+r*sin(start_angle));
QPointF p_end(x0+r*cos(end_angle), y0+r*sin(end_angle));
double step_x = (p_start.x() - x0) / line_sample;
double step_y = (p_start.y() - y0) / line_sample;
double x = x0;
double y = y0;
serial->append(x, y);
for(int i=0; i<line_sample; i++)
{
x += step_x;
y += step_y;
serial->append(x, y);
}
double step = (2*M_PI - blind_angle) / arc_sample;
double angle = start_angle;
while(angle < end_angle)
{
angle += step;
serial->append(x0+r*cos(angle), y0+r*sin(angle));
}
step_x = (x0 - serial->at(serial->count()-1).x()) / line_sample;
step_y = (y0 - serial->at(serial->count()-1).y()) / line_sample;
x = serial->at(serial->count()-1).x();
y = serial->at(serial->count()-1).y();
for(int i=0; i<line_sample; i++)
{
x += step_x;
y += step_y;
serial->append(x, y);
}
}
void MainWindow::UpdateUI()
{
if(step_now <= data->size()) //在数据步数内则++否则返回第0步
{
PlayByStep(step_now);
step_now++;
}
else
{
step_now = 0;
PlayByStep(step_now);
timer->stop();
ui->start_botton->setIcon(QIcon(":/control_bar/img/icon/play_fill.png"));
play_flag = false;
}
}
void MainWindow::UpdateUIDebug()
{
if(step_now <= ui->set_step_lineEdit->text().toInt()) //在数据步数内则++否则返回第0步
{
env->RunOnce();
step_now++;
}
else
{
step_now = 0;
env->RunOnce();
timer->stop();
ui->start_botton->setIcon(QIcon(":/control_bar/img/icon/play_fill.png"));
play_flag = false;
}
env->Observe();
DispEnvNow();
}
/*play指定步数数据*/
void MainWindow::PlayByStep(int step)
{
chart->clear_serials();
QString str_index = QString::fromStdString((std::to_string(step)));
if(data->contains(str_index)&&(*data)[str_index].isObject())
{
QJsonArray coor = (*data)[str_index].toObject()["coor"].toArray();
env->ObserveFromData(ConvertToVec(coor));
}
DispEnvNow();
}
//更新显示当前数据
void MainWindow::DispEnvNow()
{
chart->clear_serials();
for(auto agent:multi_agent)
{
QLineSeries *series = new QLineSeries;
PaintAgent(series, agent->GetState(), RADUIS, BLIND_ANGLE);
chart->add_serials(series);
}
QScatterSeries *scatter = new QScatterSeries;
for(auto target: env->GetTargets())
{
scatter->append(target.x, target.y);
}
chart->add_serials(scatter);
std::vector<std::vector<int>> adj_mat = env->GetAdjMat();
ui->neighbor_textEdit->setText(QString::fromStdString(vec2str(adj_mat)));
std::vector<AgentState> coor_mat = env->GetCoorMat();
ui->coordinat_textEdit->setText(QString::fromStdString(vec2str(coor_mat)));
ui->step_label->setText("Step:" + QString::fromStdString(std::to_string(step_now)) + "/" +
ui->set_step_lineEdit->text());
}
void MainWindow::on_start_botton_clicked()
{
if(!play_flag)
{
timer->start(800);
ui->start_botton->setIcon(QIcon(":/control_bar/img/icon/pause_fill.png"));
play_flag = true;
}
else
{
timer->stop();
ui->start_botton->setIcon(QIcon(":/control_bar/img/icon/play_fill.png"));
play_flag = false;
}
}
void MainWindow::on_calculate_pushButton_clicked()
{
int step = ui->set_step_lineEdit->text().toInt();
if(step == 0)
{
qDebug() << "step number error";
return ;
}
if(ui->debug_checkBox->isChecked())
{
ui->start_botton->setEnabled(true);
}
else
{
Calculator cal(env, data, step);
cal.run();
ui->file_name_lineEdit->setText(QDateTime::currentDateTime().toString("yyyy_MM_dd_HH_mm_ss") + ".json");
ui->start_botton->setEnabled(true);
ui->back_botton->setEnabled(true);
ui->next_botton->setEnabled(true);
}
}
void MainWindow::on_next_botton_clicked()
{
if(play_flag == false)
{
step_now++;
if(step_now <= data->size()) //在数据步数内则++否则返回第0步
{
PlayByStep(step_now);
}
else
{
step_now = 0;
PlayByStep(step_now);
}
}
}
void MainWindow::on_back_botton_clicked()
{
if(play_flag == false)
{
step_now--;
if(step_now >= 0) //在数据步数内则++否则返回第0步
{
PlayByStep(step_now);
}
else
{
step_now = 0;
PlayByStep(step_now);
}
}
}
void MainWindow::on_save_pushButton_clicked()
{
QJsonDocument jsonDoc(*data);
// 3. 写入文件
QFile file("./data/" + ui->file_name_lineEdit->text());
if (file.open(QIODevice::WriteOnly)) {
file.write(jsonDoc.toJson()); // 使用缩进格式
file.close();
qDebug() << "配置文件已保存。";
} else {
qDebug() << "错误:文件保存失败。";
}
}
void MainWindow::on_debug_checkBox_checkStateChanged(const Qt::CheckState &arg1)
{
if(arg1 == Qt::Unchecked)
{
connect(timer, &QTimer::timeout, this, &MainWindow::UpdateUI);
disconnect(timer, &QTimer::timeout, this, &MainWindow::UpdateUIDebug);
ui->calculate_pushButton->setEnabled(true);
ui->start_botton->setEnabled(false);
ui->back_botton->setEnabled(false);
ui->next_botton->setEnabled(false);
}
else if(arg1 == Qt::Checked)
{
disconnect(timer, &QTimer::timeout, this, &MainWindow::UpdateUI);
connect(timer, &QTimer::timeout, this, &MainWindow::UpdateUIDebug);
ui->calculate_pushButton->setEnabled(false);
ui->start_botton->setEnabled(true);
ui->back_botton->setEnabled(false);
ui->next_botton->setEnabled(false);
}
}
void MainWindow::on_reset_pushButton_clicked()
{
step_now = 0;
if(ui->debug_checkBox->isChecked())
{
std::vector<AgentState> init_states {{1, 2, M_PI/2},
{2, 2, M_PI/2},
{3, 2, M_PI/2},
{3.1, 2, M_PI/2}};
std::vector<double> raduis = {RADUIS, RADUIS, RADUIS, RADUIS};
std::vector<double> blind_angle = {BLIND_ANGLE, BLIND_ANGLE, BLIND_ANGLE, BLIND_ANGLE};
multi_agent = std::vector<Agent *>();
Agent::InitMultiAgent(&multi_agent, init_states, raduis, blind_angle);
env->Observe();
DispEnvNow();
}
else
{
PlayByStep(step_now);
}
}