EmbHMI/datafile/outline.cpp
2024-02-06 14:27:07 +08:00

2034 lines
72 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "outline.h"
OutLine::OutLine(QObject *parent) : QObject(parent)
{
m_maxX = 0;
m_minX = 0;
m_maxY = 0;
m_minY = 0;
}
void OutLine::setRangeXY(int maxX,int minX,int maxY,int minY)
{
m_maxX = maxX;
m_minX = minX;
m_maxY = maxY;
m_minY = minY;
}
//获取花样轮廓
QList<DsrStep> OutLine::getOutLine(QImage *img)
{
int distance_lunkuo = 10;
unsigned int *data = (unsigned int *)img->bits();
int x = img->width();
//int y = img->height();
//记录xy最大最小范围
int x_max = 0;
int x_min = 1000000;
int y_max = 0;
int y_min = 1000000;
//当前点xy坐标
int x_now = 0;
int y_now = 0;
int red;
//int green;
//int blue;
int size = img->width() * (img->height() - 12);
for (int i = 1; i < size; i++)
{
red = qRed(data[i]);
//green= qGreen(data[i]);
//blue= qBlue(data[i]);
if (red == 255 && qRed(data[i-1]) == 0)
{
y_now = i / x;
x_now = i % x;
if (y_now > y_max)
{
y_max = y_now;
}
if (y_now < y_min)
{
y_min = y_now;
}
if(x_now < x_min)
{
x_min = x_now;
}
}
if (red == 0 && qRed(data[i - 1]) == 255)
{
x_now = i % x;
if(x_now > x_max)
{
x_max = x_now;
}
}
}
qDebug()<<"x_max:"<<x_max;
qDebug()<<"x_min:"<<x_min;
qDebug()<<"y_max:"<<y_max;
qDebug()<<"y_min:"<<y_min;
//画4条线用于检测轮廓
QStringList list_x_up;//最上面的线
QStringList list_y_up;
QStringList list_x_down;//最下面的线
QStringList list_y_down;
QStringList list_x_right;//最右面的线
QStringList list_y_right;
QStringList list_x_left;//最左面的线
QStringList list_y_left;
QStringList list_x_contour;//轮廓坐标
QStringList list_y_contour;
QStringList list_point_true;//判断点是否有效
QStringList list_drawwhit_x;
QStringList list_drawwhit_y;
//上面的线
for (int i = x_min ; i <= x_max ; i++ )
{
list_x_up.append(QString("%1").arg(i));
list_y_up.append(QString("%1").arg(y_min - 6));
}
//右边的线
for (int i = y_min ; i <= y_max ; i++)
{
list_x_right.append(QString("%1").arg(x_max + 6));
list_y_right.append(QString("%1").arg(i));
}
//下边的线
for (int i = x_max ; i >= x_min ; i--)
{
list_x_down.append(QString("%1").arg(i));
list_y_down.append(QString("%1").arg(y_max + 6));
}
//左边的线
for (int i = y_max ; i >= y_min ; i--)
{
list_x_left.append(QString("%1").arg(x_min - 6));
list_y_left.append(QString("%1").arg(i));
}
QStringList list_X_temp1;
QStringList list_Y_temp1;
list_X_temp1.clear();
list_Y_temp1.clear();
// 最上面的点向下索引
for (int i = 0; i < list_x_up.size(); i++)
{
QString str_x = list_x_up.at(i);
QString str_y = list_y_up.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
if (red == 255)
{
}
else
{
//黑点,向下搜索
for (int j = 1; j < (y_max - point_y + 1) / 2; j++)
{
//循环向下搜索,找到分界点
if (qRed(data[(point_y + j) * x + point_x]) == 255)
{
list_y_up[i] = QString("%1").arg(point_y + j - 1);
list_X_temp1.append(list_x_up.at(i));
list_Y_temp1.append(list_y_up.at(i));
break;
}
}
}
}
list_x_up.clear();
list_x_up = list_X_temp1;
list_y_up.clear();
list_y_up = list_Y_temp1;
list_X_temp1.clear();
list_Y_temp1.clear();
//最右面的线向左索引
for (int i = 0; i < list_y_right.size(); i++)
{
QString str_x = list_x_right.at(i);
QString str_y = list_y_right.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
if (red == 255)
{
}
else
{
//黑色,向左搜索
for (int j = 1; j < (point_x) / 2; j++)
{
//循环向左搜索,找到分界点
if (qRed(data[point_y * x + point_x - j]) == 255)
{
list_x_right[i] = QString("%1").arg(point_x - j + 1);
list_X_temp1.append(list_x_right.at(i));
list_Y_temp1.append(list_y_right.at(i));
break;
}
}
}
}
list_x_right.clear();
list_x_right = list_X_temp1;
list_y_right.clear();
list_y_right = list_Y_temp1;
list_X_temp1.clear();
list_Y_temp1.clear();
//最下面的线向上索引
for (int i = 0; i < list_x_down.size(); i++)
{
QString str_x = list_x_down.at(i);
QString str_y = list_y_down.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
if (red == 255)
{
}
else
{
//黑点,向上搜索
for (int j = 1; j < (point_y ) / 2; j++)
{
//循环向上搜索,找到分界点
if (qRed(data[(point_y - j) * x + point_x]) == 255)
{
list_y_down[i] = QString("%1").arg(point_y - j + 1);
list_X_temp1.append(list_x_down.at(i));
list_Y_temp1.append(list_y_down.at(i));
break;
}
}
}
}
list_x_down.clear();
list_x_down = list_X_temp1;
list_y_down.clear();
list_y_down = list_Y_temp1;
list_X_temp1.clear();
list_Y_temp1.clear();
//最左面的线向右索引
for (int i = 0; i < list_x_left.size(); i++)
{
QString str_x = list_x_left.at(i);
QString str_y = list_y_left.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
if (red == 255)
{
}
else
{
//黑色,向右搜索
for (int j = 1; j < (y_max) / 2; j++)
{
//循环向右搜索,找到分界点
if (qRed(data[point_y * x + point_x + j]) == 255)
{
list_x_left[i] = QString("%1").arg(point_x + j - 1);
list_X_temp1.append(list_x_left.at(i));
list_Y_temp1.append(list_y_left.at(i));
break;
}
}
}
}
list_x_left.clear();
list_x_left = list_X_temp1;
list_y_left.clear();
list_y_left = list_Y_temp1;
QList <int> list_int_loaction;
int int_location = 0;
QStringList listXTemp;
QStringList listYTemp;
list_int_loaction.clear();
for (int i = 0; i < list_x_up.size(); i++)
{
for (int j = 0; j < list_x_right.size(); j++)
{
if (list_x_up.at(i) == list_x_right.at(j) && list_y_up.at(i) == list_y_right.at(j))
{
list_int_loaction.append(i);
break;
}
}
}
int_location = list_x_up.size() - 1;
if (list_int_loaction.size() > 0)
{
int_location = list_int_loaction.at(list_int_loaction.size()-1);
}
listXTemp.clear();
listYTemp.clear();
for (int i = 0; i <= int_location; i++)
{
listXTemp.append(list_x_up.at(i));
listYTemp.append(list_y_up.at(i));
}
list_x_up.clear();
list_x_up = listXTemp;
list_y_up.clear();
list_y_up = listYTemp;
int_location = 0;
for (int i = 0; i < list_x_right.size(); i++)
{
if (list_x_right.at(i) == list_x_up.at(list_x_up.size()-1) && list_y_right.at(i) == list_y_up.at(list_y_up.size()-1))
{
int_location = i;
}
}
listXTemp.clear();
listYTemp.clear();
for (int i = int_location; i < list_x_right.size(); i++)
{
listXTemp.append(list_x_right.at(i));
listYTemp.append(list_y_right.at(i));
}
list_x_right.clear();
list_x_right = listXTemp;
list_y_right.clear();
list_y_right = listYTemp;
list_int_loaction.clear();
for (int i = 0; i < list_x_right.size(); i++)
{
for (int j = 0; j < list_x_down.size(); j++)
{
if (list_x_right.at(i) == list_x_down.at(j) && list_y_right.at(i) == list_y_down.at(j))
{
list_int_loaction.append(i);
break;
}
}
}
int_location = list_x_right.size() - 1;
if (list_int_loaction.size() > 0)
{
int_location = list_int_loaction.at(list_int_loaction.size()-1);
}
listXTemp.clear();
listYTemp.clear();
for (int i = 0; i <= int_location; i++)
{
listXTemp.append(list_x_right.at(i));
listYTemp.append(list_y_right.at(i));
}
list_x_right.clear();
list_x_right = listXTemp;
list_y_right.clear();
list_y_right = listYTemp;
int_location = 0;
for (int i = 0; i < list_x_down.size(); i++)
{
if (list_x_down.at(i) == list_x_right.at(list_x_right.size()-1) && list_y_down.at(i) == list_y_right.at(list_y_right.size()-1))
{
int_location = i;
}
}
listXTemp.clear();
listYTemp.clear();
for (int i = int_location; i < list_x_down.size(); i++)
{
listXTemp.append(list_x_down.at(i));
listYTemp.append(list_y_down.at(i));
}
list_x_down.clear();
list_x_down = listXTemp;
list_y_down.clear();
list_y_down = listYTemp;
list_int_loaction.clear();
for (int i = 0; i < list_x_down.size(); i++)
{
for (int j = 0; j < list_x_left.size(); j++)
{
if (list_x_down.at(i) == list_x_left.at(j) && list_y_down.at(i) == list_y_left.at(j))
{
list_int_loaction.append(i);
break;
}
}
}
int_location = list_x_down.size() - 1;
if (list_int_loaction.size() > 0)
{
int_location = list_int_loaction.at(list_int_loaction.size()-1);
}
listXTemp.clear();
listYTemp.clear();
for (int i = 0; i <= int_location; i++)
{
listXTemp.append(list_x_down.at(i));
listYTemp.append(list_y_down.at(i));
}
list_x_down.clear();
list_x_down = listXTemp;
list_y_down.clear();
list_y_down = listYTemp;
int_location = 0;
for (int i = 0; i < list_x_left.size(); i++)
{
if (list_x_left.at(i) == list_x_down.at(list_x_down.size()-1) && list_y_left.at(i) == list_y_down.at(list_y_down.size()-1))
{
int_location = i;
}
}
listXTemp.clear();
listYTemp.clear();
for (int i = int_location; i < list_x_left.size(); i++)
{
listXTemp.append(list_x_left.at(i));
listYTemp.append(list_y_left.at(i));
}
list_x_left.clear();
list_x_left = listXTemp;
list_y_left.clear();
list_y_left = listYTemp;
#if 1
list_int_loaction.clear();
for (int i = 0; i < list_x_left.size(); i++)
{
for (int j = 0; j < list_x_up.size(); j++)
{
if (list_x_left.at(i) == list_x_up.at(j) && list_y_left.at(i) == list_y_up.at(j))
{
list_int_loaction.append(i);
break;
}
}
}
int_location = list_x_left.size() - 1;
if (list_int_loaction.size() > 0)
{
int_location = list_int_loaction.at(list_int_loaction.size()-1);
}
listXTemp.clear();
listYTemp.clear();
for (int i = 0; i <= int_location; i++)
{
listXTemp.append(list_x_left.at(i));
listYTemp.append(list_y_left.at(i));
}
list_x_left.clear();
list_x_left = listXTemp;
list_y_left.clear();
list_y_left = listYTemp;
int_location = 0;
for (int i = 0; i < list_x_up.size(); i++)
{
if (list_x_up.at(i) == list_x_left.at(list_x_left.size()-1) && list_y_up.at(i) == list_y_left.at(list_y_left.size()-1))
{
int_location = i;
}
}
listXTemp.clear();
listYTemp.clear();
for (int i = int_location; i < list_x_up.size(); i++)
{
listXTemp.append(list_x_up.at(i));
listYTemp.append(list_y_up.at(i));
}
list_x_up.clear();
list_x_up = listXTemp;
list_y_up.clear();
list_y_up = listYTemp;
#endif
#if 0
//最上面的线向下索引
for (int i = 0; i < list_x_up.size(); i++)
{
QString str_x = list_x_up.at(i);
QString str_y = list_y_up.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
//green= qGreen(data[location]);
//blue= qBlue(data[location]);
if (red == 255)
{
//白点,为分界线
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y - distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
}
else
{
//黑点,向下搜索
for (int j = 1; j < (y_max - point_y + 1); j++)
{
//循环向下搜索,找到分界点
if (qRed(data[(point_y + j) * x + point_x]) == 255)
{
list_drawwhit_x.append(QString("%1").arg(point_x));
list_drawwhit_y.append(QString("%1").arg(point_y + j));
if (list_x_contour.size() > 0)
{
//如果不是起始点,判断与上一个点的位置关系
//QString last_x_contour = list_x_contour.at(list_x_contour.size()-1);
QString last_y_contour = list_y_contour.at(list_y_contour.size()-1);
//int point_last_x_contour = last_x_contour.toInt();
int point_last_y_contour = last_y_contour.toInt() + distance_lunkuo;
if (0)
//if ((point_last_y_contour - (point_y + j)) > (10) || (point_last_y_contour - (point_y + j)) < -10)
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_last_y_contour - distance_lunkuo));
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y + j - distance_lunkuo));
}
QString str_check_x = list_x_contour.at(list_x_contour.size()-1);
QString str_check_y = list_y_contour.at(list_y_contour.size()-1);
int point_check_x = str_check_x.toInt();
int point_check_y = str_check_y.toInt();
for (int check = 0; check <= 5; check++)
{
//判断当前点是否可用,是否需要移动
if (qRed(data[point_check_y * x + point_check_x + check]) == 255 )
{
//需要向右移动
for (int check_1 = 1; check_1 <= distance_lunkuo * 2; check_1++)
{
if (qRed(data[point_check_y * x + point_check_x + check - check_1]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_x_contour.replace(list_x_contour.size()-1,QString("%1").arg(point_check_x + check - distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else if (qRed(data[point_check_y * x + point_check_x - check]) == 255)
{
//需要向左移动
for (int check_1 = 1; check_1 <= distance_lunkuo * 2; check_1++)
{
if (qRed(data[point_check_y * x + point_check_x - check + check_1]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_x_contour.replace(list_x_contour.size()-1,QString("%1").arg(point_check_x - check + distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x - check + distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else
{
//不需要移动
if (check == 5)
{
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
break;
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y + j - distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
//----------------------------------
if (0)
{
QString str_y_finally = list_y_contour.at(list_y_contour.size() - 1);
QString str_y_finally_last;
for (int j = list_y_contour.size() - 2; j > 0; j--)
{
if (list_point_true.at(j) == "1")
{
str_y_finally_last = list_y_contour.at(j);
break;
}
}
int str_y_finally_int = str_y_finally.toInt();
int str_y_finally_last_int = str_y_finally_last.toInt();
if ((str_y_finally_int - str_y_finally_last_int) > 20 || (str_y_finally_last_int - str_y_finally_int) > 20)
{
list_point_true.replace(list_point_true.size() - 1, QString("%1").arg(0));
}
}
//---------------------------------------
}
}
QStringList list_get_up_x;
QStringList list_get_up_y;
QStringList list_get_up_true;
for (int i = 0; i < list_x_contour.size(); i++)
{
if (list_point_true.at(i) == "1")
{
list_get_up_x.append(list_x_contour.at(i));
list_get_up_y.append(list_y_contour.at(i));
list_get_up_true.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_x_contour = list_get_up_x;
list_y_contour = list_get_up_y;
list_point_true = list_get_up_true;
int next_line_star = 0;
for (int i = 0; i < list_y_right.size(); i++)
{
QString str = list_y_right.at(i);
QString str_1 = list_y_contour.at(list_y_contour.size()-1);
if (str.toInt() == str_1.toInt())
{
next_line_star = i;
break;
}
}
//最右面的线向左索引
for (int i = next_line_star; i < list_y_right.size(); i++)
{
QString str_x = list_x_right.at(i);
QString str_y = list_y_right.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
//green= qGreen(data[location]);
//blue= qBlue(data[location]);
if (red == 255)
{
//白点,为分界线
list_x_contour.append(QString("%1").arg(point_x + distance_lunkuo));
list_y_contour.append(QString("%1").arg(point_y));
list_point_true.append(QString("%1").arg(1));
}
else
{
//黑色,向左搜索
for (int j = 1; j < (point_x); j++)
{
//循环向左搜索,找到分界点
if (qRed(data[point_y * x + point_x - j]) == 255)
{
list_drawwhit_x.append(QString("%1").arg(point_x - j));
list_drawwhit_y.append(QString("%1").arg(point_y));
if (list_x_contour.size() > 0)
{
//如果不是起始点,判断与上一个点的位置关系
list_x_contour.append(QString("%1").arg(point_x - j + distance_lunkuo));
list_y_contour.append(QString("%1").arg(point_y));
QString str_check_x = list_x_contour.at(list_x_contour.size()-1);
QString str_check_y = list_y_contour.at(list_y_contour.size()-1);
int point_check_x = str_check_x.toInt();
int point_check_y = str_check_y.toInt();
for (int check = 0; check <= 5; check++)
{
//判断当前点是否可用,是否需要移动
if (qRed(data[(point_check_y + check) * x + point_check_x]) == 255)
{
//需要向上移动
for (int check_1 = 1; check_1 <= distance_lunkuo; check_1++)
{
if (qRed(data[(point_check_y + check - check_1) * x + point_check_x]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_y_contour.replace(list_y_contour.size()-1,QString("%1").arg(point_check_y + check - distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else if (qRed(data[(point_check_y - check) * x + point_check_x]) == 255)
{
//需要向下移动
for (int check_1 = 1; check_1 <= distance_lunkuo; check_1++)
{
if (qRed(data[(point_check_y - check + check_1) * x + point_check_x]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_y_contour.replace(list_y_contour.size()-1,QString("%1").arg(point_check_y - check + distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else
{
//不需要移动
if (check == 5)
{
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
break;
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y + j - distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
}
//----------------------------------
QString str_x_finally = list_x_contour.at(list_x_contour.size() - 1);
QString str_x_finally_last;
for (int j = list_x_contour.size() - 2; j > 0; j--)
{
if (list_point_true.at(j) == "1")
{
str_x_finally_last = list_x_contour.at(j);
break;
}
}
int str_x_finally_int = str_x_finally.toInt();
int str_x_finally_last_int = str_x_finally_last.toInt();
if ((str_x_finally_int - str_x_finally_last_int) > 20 || (str_x_finally_last_int - str_x_finally_int) > 20)
{
list_point_true.replace(list_point_true.size() - 1, QString("%1").arg(0));
}
//---------------------------------------
}
QStringList list_get_right_x;
QStringList list_get_right_y;
QStringList list_get_right_true;
for (int i = 0; i < list_x_contour.size(); i++)
{
if (list_point_true.at(i) == "1")
{
list_get_right_x.append(list_x_contour.at(i));
list_get_right_y.append(list_y_contour.at(i));
list_get_right_true.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_x_contour = list_get_right_x;
list_y_contour = list_get_right_y;
list_point_true = list_get_right_true;
for (int i = 0; i < list_x_down.size(); i++)
{
QString str = list_x_down.at(i);
QString str_1 = list_x_contour.at(list_y_contour.size()-1);
if (str.toInt() == str_1.toInt())
{
next_line_star = i;
break;
}
}
//最下面的线向上索引
for (int i = next_line_star; i < list_x_down.size(); i++)
{
QString str_x = list_x_down.at(i);
QString str_y = list_y_down.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
//green= qGreen(data[location]);
//blue= qBlue(data[location]);
if (red == 255)
{
//白点,为分界线
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y + distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
}
else
{
//黑点,向上搜索
for (int j = 1; j < (point_y ); j++)
{
//循环向上搜索,找到分界点
list_drawwhit_x.append(QString("%1").arg(point_x));
list_drawwhit_y.append(QString("%1").arg(point_y - j));
if (qRed(data[(point_y - j) * x + point_x]) == 255)
{
if (list_x_contour.size() > 0)
{
//如果不是起始点,判断与上一个点的位置关系
//QString last_x_contour = list_x_contour.at(list_x_contour.size()-1);
QString last_y_contour = list_y_contour.at(list_y_contour.size()-1);
//int point_last_x_contour = last_x_contour.toInt();
int point_last_y_contour = last_y_contour.toInt() + distance_lunkuo;
if (0)
//if ((point_last_y_contour - (point_y + j)) > (10) || (point_last_y_contour - (point_y + j)) < -10)
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_last_y_contour - distance_lunkuo));
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y - j + distance_lunkuo));
}
QString str_check_x = list_x_contour.at(list_x_contour.size()-1);
QString str_check_y = list_y_contour.at(list_y_contour.size()-1);
int point_check_x = str_check_x.toInt();
int point_check_y = str_check_y.toInt();
for (int check = 0; check <= 5; check++)
{
//判断当前点是否可用,是否需要移动
if (qRed(data[point_check_y * x + point_check_x + check]) == 255 )
{
//需要向右移动
for (int check_1 = 1; check_1 <= distance_lunkuo * 2; check_1++)
{
if (qRed(data[point_check_y * x + point_check_x + check - check_1]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_x_contour.replace(list_x_contour.size()-1,QString("%1").arg(point_check_x + check - distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else if (qRed(data[point_check_y * x + point_check_x - check]) == 255)
{
//需要向左移动
for (int check_1 = 1; check_1 <= distance_lunkuo * 2; check_1++)
{
if (qRed(data[point_check_y * x + point_check_x - check + check_1]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_x_contour.replace(list_x_contour.size()-1,QString("%1").arg(point_check_x - check + distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x - check + distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else
{
//不需要移动
if (check == 5)
{
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
break;
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y - j + distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
}
//----------------------------------
QString str_y_finally = list_y_contour.at(list_y_contour.size() - 1);
QString str_y_finally_last;
for (int j = list_y_contour.size() - 2; j > 0; j--)
{
if (list_point_true.at(j) == "1")
{
str_y_finally_last = list_y_contour.at(j);
break;
}
}
int str_y_finally_int = str_y_finally.toInt();
int str_y_finally_last_int = str_y_finally_last.toInt();
if ((str_y_finally_int - str_y_finally_last_int) > 20 || (str_y_finally_last_int - str_y_finally_int) > 20)
{
list_point_true.replace(list_point_true.size() - 1, QString("%1").arg(0));
}
//---------------------------------------
}
QStringList list_get_down_x;
QStringList list_get_down_y;
QStringList list_get_down_true;
for (int i = 0; i < list_x_contour.size(); i++)
{
if (list_point_true.at(i) == "1")
{
list_get_down_x.append(list_x_contour.at(i));
list_get_down_y.append(list_y_contour.at(i));
list_get_down_true.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_x_contour = list_get_down_x;
list_y_contour = list_get_down_y;
list_point_true = list_get_down_true;
for (int i = 0; i < list_y_left.size(); i++)
{
QString str = list_y_left.at(i);
QString str_1 = list_y_contour.at(list_y_contour.size()-1);
if (str.toInt() == str_1.toInt())
{
next_line_star = i;
break;
}
}
int next_line_end = 0;
for (int i = 0; i < list_y_left.size(); i++)
{
QString str = list_y_left.at(i);
QString str_1 = list_y_contour.at(0);
if (str.toInt() == str_1.toInt())
{
next_line_end = i;
break;
}
}
qDebug()<<"next_line_star:"<<next_line_star;
qDebug()<<"next_line_end:"<<next_line_end;
//最左面的线向右索引
for (int i = next_line_star; i < next_line_end; i++)
{
QString str_x = list_x_left.at(i);
QString str_y = list_y_left.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int location = point_y * x + point_x;
red = qRed(data[location]);
//green= qGreen(data[location]);
//blue= qBlue(data[location]);
if (red == 255)
{
//白点,为分界线
list_x_contour.append(QString("%1").arg(point_x - distance_lunkuo));
list_y_contour.append(QString("%1").arg(point_y));
list_point_true.append(QString("%1").arg(1));
}
else
{
//黑色,向右搜索
for (int j = 1; j < (y_max); j++)
{
//循环向右搜索,找到分界点
if (qRed(data[point_y * x + point_x + j]) == 255)
{
list_drawwhit_x.append(QString("%1").arg(point_x + j));
list_drawwhit_y.append(QString("%1").arg(point_y));
if (list_x_contour.size() > 0)
{
//如果不是起始点,判断与上一个点的位置关系
list_x_contour.append(QString("%1").arg(point_x + j - distance_lunkuo));
list_y_contour.append(QString("%1").arg(point_y));
QString str_check_x = list_x_contour.at(list_x_contour.size()-1);
QString str_check_y = list_y_contour.at(list_y_contour.size()-1);
int point_check_x = str_check_x.toInt();
int point_check_y = str_check_y.toInt();
for (int check = 0; check <= 5; check++)
{
//判断当前点是否可用,是否需要移动
if (qRed(data[(point_check_y + check) * x + point_check_x]) == 255)
{
//需要向上移动
for (int check_1 = 1; check_1 <= distance_lunkuo; check_1++)
{
if (qRed(data[(point_check_y + check - check_1) * x + point_check_x]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_y_contour.replace(list_y_contour.size()-1,QString("%1").arg(point_check_y + check - distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else if (qRed(data[(point_check_y - check) * x + point_check_x]) == 255)
{
//需要向下移动
for (int check_1 = 1; check_1 <= distance_lunkuo; check_1++)
{
if (qRed(data[(point_check_y - check + check_1) * x + point_check_x]) == 255 )
{
//无法移动,需要舍弃
list_point_true.append(QString("%1").arg(0));
break;
}
else
{
//可以移动
if (check_1 == distance_lunkuo)
{
//list_y_contour.replace(list_y_contour.size()-1,QString("%1").arg(point_check_y - check + distance_lunkuo));
//list_x_contour[list_x_contour.size()-1] = QString("%1").arg(point_check_y * x + point_check_x + check - distance_lunkuo);
list_point_true.append(QString("%1").arg(1));
//list_point_true.append(QString("%1").arg(0));
break;
}
}
}
break;
}
else
{
//不需要移动
if (check == 5)
{
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
break;
}
else
{
list_x_contour.append(QString("%1").arg(point_x));
list_y_contour.append(QString("%1").arg(point_y + j - distance_lunkuo));
list_point_true.append(QString("%1").arg(1));
break;
}
}
}
}
//----------------------------------
QString str_x_finally = list_x_contour.at(list_x_contour.size() - 1);
QString str_x_finally_last;
for (int j = list_x_contour.size() - 2; j > 0; j--)
{
if (list_point_true.at(j) == "1")
{
str_x_finally_last = list_x_contour.at(j);
break;
}
}
int str_x_finally_int = str_x_finally.toInt();
int str_x_finally_last_int = str_x_finally_last.toInt();
if ((str_x_finally_int - str_x_finally_last_int) > 20 || (str_x_finally_last_int - str_x_finally_int) > 20)
{
list_point_true.replace(list_point_true.size() - 1, QString("%1").arg(0));
}
//---------------------------------------
}
QStringList list_get_left_x;
QStringList list_get_left_y;
QStringList list_get_left_true;
for (int i = 0; i < list_x_contour.size(); i++)
{
if (list_point_true.at(i) == "1")
{
list_get_left_x.append(list_x_contour.at(i));
list_get_left_y.append(list_y_contour.at(i));
list_get_left_true.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_x_contour = list_get_left_x;
list_y_contour = list_get_left_y;
list_point_true = list_get_left_true;
for (int i = 0; i < list_x_down.size(); i++)
{
QString str = list_x_down.at(i);
QString str_1 = list_x_contour.at(list_y_contour.size()-1);
if (str.toInt() == str_1.toInt())
{
next_line_star = i;
break;
}
}
qDebug()<<"list_x:"<<list_x_contour.size();
qDebug()<<"list_y:"<<list_y_contour.size();
qDebug()<<"list_point:"<<list_point_true.size();
QStringList list_x_cache_1;
QStringList list_y_cache_1;
QStringList list_point_true_cache_1;
#endif
#if 0
//删除距离图像外边界距离小于轮廓的点
for (int i = 0; i< list_x_contour.size(); i++)
{
QString str_point_x = list_x_contour.at(i);
QString str_point_y = list_y_contour.at(i);
int point_x = str_point_x.toInt();
int point_y = str_point_y.toInt();
if (point_x > distance_lunkuo && point_x < (x - distance_lunkuo) && point_y > distance_lunkuo && point_y < (y - distance_lunkuo))
{
for (int j = 0; j < distance_lunkuo; j++)
{
if((qRed(data[point_y * x + point_x + j]) == 255) //向右搜索
|| (qRed(data[point_y * x + point_x - j]) == 255) //向左搜索
|| (qRed(data[(point_y + j)* x + point_x]) == 255) //向下搜索
|| (qRed(data[(point_y - j)* x + point_x]) == 255) //向下搜索
|| (qRed(data[(point_y - j / 2)* x + point_x + j / 2]) == 255) //向右上搜索
|| (qRed(data[(point_y - j / 2)* x + point_x - j / 2]) == 255) //向左上搜索
|| (qRed(data[(point_y + j / 2)* x + point_x + j / 2]) == 255) //向右下搜索
|| (qRed(data[(point_y + j / 2)* x + point_x - j / 2]) == 255) //向左下搜索
)
{
list_point_true.replace(i,QString("%1").arg(0));
}
}
}
}
list_x_cache_1.clear();
list_y_cache_1.clear();
list_point_true_cache_1.clear();
for(int i = 0; i < list_point_true.size(); i++)
{
if(list_point_true.at(i) == "1")
{
QString str_1 = list_x_contour.at(i);
QString str_2 = list_y_contour.at(i);
list_x_cache_1.append(str_1);
list_y_cache_1.append(str_2);
list_point_true_cache_1.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_point_true = list_point_true_cache_1;
list_x_contour = list_x_cache_1;
list_y_contour = list_y_cache_1;
#endif
#if 0
//删除距离太远的点
for (int i = 1; i < list_x_contour.size(); i++)
{
QString str_x = list_x_contour.at(i);
QString str_y = list_y_contour.at(i);
QString str_x_lasr = list_x_contour.at(i - 1);
QString str_y_lasr = list_y_contour.at(i - 1);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int point_x_last = str_x_lasr.toInt();
int point_y_last = str_y_lasr.toInt();
if ( ((point_x - point_x_last) > 100) || ((point_x_last - point_x) > 100)
|| ((point_y - point_y_last) > 100) || ((point_y_last - point_y) > 100)
)
{
list_point_true.replace(i,QString("%1").arg(0));
}
}
list_x_cache_1.clear();
list_y_cache_1.clear();
list_point_true_cache_1.clear();
for(int i = 0; i < list_point_true.size(); i++)
{
if(list_point_true.at(i) == "1")
{
QString str_1 = list_x_contour.at(i);
QString str_2 = list_y_contour.at(i);
list_x_cache_1.append(str_1);
list_y_cache_1.append(str_2);
list_point_true_cache_1.append(QString("%1").arg(1));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_point_true = list_point_true_cache_1;
list_x_contour = list_x_cache_1;
list_y_contour = list_y_cache_1;
#endif
#if 0
//对获取的点重新排序
QStringList list_x_reset;
QStringList list_y_reset;
QStringList list_point_true_reset;
QString str_reset_x_now;
QString str_reset_x_last;
QString str_reset_y_now;
QString str_reset_y_last;
int reset_x_now = 0;
int reset_x_last = 0;
int reset_y_now = 0;
int reset_y_last = 0;
double distance_point_min = 100000.0;
int jilupointposition = 0;
for (int i = 0; i < list_x_contour.size(); i++)
{
jilupointposition = 0;
if(i == 0)
{
list_x_reset.append(list_x_contour.at(0));
list_y_reset.append(list_y_contour.at(0));
list_point_true_reset.append(list_point_true.at(0));
list_x_contour.replace(0,QString("%1").arg(100000));
list_y_contour.replace(0,QString("%1").arg(100000));
}
else
{
double distance = 0.0;
distance_point_min = 100000.0;
for (int j = 1; j < list_x_contour.size(); j++)
{
str_reset_x_now = list_x_contour.at(j);
str_reset_x_last = list_x_reset.at(list_x_reset.size()-1);
str_reset_y_now = list_y_contour.at(j);
str_reset_y_last = list_y_reset.at(list_y_reset.size()-1);
reset_x_now = str_reset_x_now.toInt();
reset_x_last = str_reset_x_last.toInt();
reset_y_now = str_reset_y_now.toInt();
reset_y_last = str_reset_y_last.toInt();
if (reset_x_now != 100000 || reset_y_now != 100000)
{
distance = sqrt((reset_x_now - reset_x_last) * (reset_x_now - reset_x_last) * 1.0 + (reset_y_now - reset_y_last) * (reset_y_now - reset_y_last) * 1.0);
if(distance < distance_point_min)
{
distance_point_min = distance;
jilupointposition = j;
}
}
}
list_x_reset.append(list_x_contour.at(jilupointposition));
list_y_reset.append(list_y_contour.at(jilupointposition));
list_point_true_reset.append(list_point_true.at(jilupointposition));
list_x_contour.replace(jilupointposition,QString("%1").arg(100000));
list_y_contour.replace(jilupointposition,QString("%1").arg(100000));
}
}
list_x_contour.clear();
list_y_contour.clear();
list_point_true.clear();
list_x_contour = list_x_reset;
list_y_contour = list_y_reset;
list_point_true = list_point_true_reset;
#endif
//输出的xy坐标
QStringList list_output_x;
QStringList list_output_y;
//画图
//按点画图
#if 0
for (int i = 0 ; i < list_x_contour.size(); i++)
{
if (list_point_true.at(i) == "1")
{
QString str_x = list_x_contour.at(i);
QString str_y = list_y_contour.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int weizhi = point_y * x + point_x;
int rgb = 255;
data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
#endif
//按线画图
#if 0
QString str_x_first = list_x_contour.at(0);
QString str_y_first = list_y_contour.at(0);
list_x_contour.append(str_x_first);
list_y_contour.append(str_y_first);
for (int i = 0 ; i < list_x_contour.size() - 1; i++)
{
QStringList list_Cache_x;
QStringList list_Cache_y;
QString str_x = list_x_contour.at(i);
QString str_y = list_y_contour.at(i);
QString str_x_lasr = list_x_contour.at(i + 1);
QString str_y_lasr = list_y_contour.at(i + 1);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int point_x_last = str_x_lasr.toInt();
int point_y_last = str_y_lasr.toInt();
if (point_x_last >= point_x)
{
if (point_y_last >= point_y)
{
for (int x_huatu = 1; x_huatu <= (point_x_last - point_x); x_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x + x_huatu));
list_Cache_y.append(QString("%1").arg(point_y));
// int weizhi = point_y * x + point_x + x_huatu;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
for (int y_huatu = 1; y_huatu <= (point_y_last - point_y); y_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x_last));
list_Cache_y.append(QString("%1").arg(point_y + y_huatu));
// int weizhi = (point_y + y_huatu) * x + point_x_last;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
else
{
for (int y_huatu = 1; y_huatu <= (point_y - point_y_last); y_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x));
list_Cache_y.append(QString("%1").arg(point_y - y_huatu));
// int weizhi = (point_y - y_huatu) * x + point_x;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
for (int x_huatu = 1; x_huatu <= (point_x_last - point_x); x_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x + x_huatu));
list_Cache_y.append(QString("%1").arg(point_y_last));
// int weizhi = point_y_last * x + point_x + x_huatu;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
}
else
{
if (point_y_last >= point_y)
{
for (int y_huatu = 1; y_huatu <= (point_y_last - point_y); y_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x));
list_Cache_y.append(QString("%1").arg(point_y + y_huatu));
// int weizhi = (point_y + y_huatu) * x + point_x;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
for (int x_huatu = 1; x_huatu <= (point_x - point_x_last); x_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x - x_huatu));
list_Cache_y.append(QString("%1").arg(point_y_last));
// int weizhi = point_y_last * x + point_x - x_huatu;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
else
{
for (int x_huatu = 1; x_huatu <= (point_x - point_x_last); x_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x - x_huatu));
list_Cache_y.append(QString("%1").arg(point_y));
// int weizhi = point_y * x + point_x - x_huatu;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
for (int y_huatu = 1; y_huatu <= (point_y - point_y_last); y_huatu++)
{
list_Cache_x.append(QString("%1").arg(point_x_last));
list_Cache_y.append(QString("%1").arg(point_y - y_huatu));
// int weizhi = (point_y - y_huatu) * x + point_x_last;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
}
// int weizhi = point_y * x + point_x;
// int rgb = 255;
// data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
for (int check_num = 0; check_num < list_Cache_x.size(); check_num++)
{
QString str_x_check = list_Cache_x.at(check_num);
QString str_y_check = list_Cache_y.at(check_num);
int point_x_check = str_x_check.toInt();
int point_y_check = str_y_check.toInt();
if(qRed(data[point_y_check * x + point_x_check]) == 255)
{//判断画的线是否经过图像
list_Cache_x.clear();
list_Cache_y.clear();
}
}
if(list_Cache_x.size()>0)
{
for (int size = 0; size < list_Cache_x.size(); size++)
{
QString str_x_save = list_Cache_x.at(size);
QString str_y_save = list_Cache_y.at(size);
int point_x_save = str_x_save.toInt();
int point_y_save = str_y_save.toInt();
list_output_x.append(QString("%1").arg(point_x_save));
list_output_y.append(QString("%1").arg(point_y_save));
}
}
}
list_x_contour.clear();
list_y_contour.clear();
list_x_contour = list_output_x;
list_y_contour = list_output_y;
//画图
for (int i = 0 ; i < list_x_contour.size(); i++)
{
//if (list_point_true.at(i) == "1")
{
QString str_x = list_x_contour.at(i);
QString str_y = list_y_contour.at(i);
int point_x = str_x.toInt();
int point_y = str_y.toInt();
int weizhi = point_y * x + point_x;
int rgb = 255;
data[weizhi] = qRgba(rgb, 0, 0, qAlpha(data[weizhi]));
}
}
#endif
#if 1
for (int i = 0; i < list_x_up.size(); i++)
{
if (i == 0)
{
QString str_y = list_y_up.at(i);
int point_y = str_y.toInt();
list_y_up[i] = QString("%1").arg(point_y - distance_lunkuo);
QString str_x = list_x_up.at(i);
int point_x = str_x.toInt();
list_x_up[i] = QString("%1").arg(point_x - distance_lunkuo);
}
else if (i == list_x_up.size()-1)
{
QString str_y = list_y_up.at(i);
int point_y = str_y.toInt();
list_y_up[i] = QString("%1").arg(point_y - distance_lunkuo);
QString str_x = list_x_up.at(i);
int point_x = str_x.toInt();
list_x_up[i] = QString("%1").arg(point_x + distance_lunkuo);
}
else
{
QString str_y = list_y_up.at(i);
int point_y = str_y.toInt();
list_y_up[i] = QString("%1").arg(point_y - distance_lunkuo);
}
}
for (int i = 0; i < list_x_right.size(); i++)
{
if ( i == 0)
{
QString str_x = list_x_right.at(i);
int point_x = str_x.toInt();
list_x_right[i] = QString("%1").arg(point_x + distance_lunkuo);
QString str_y = list_y_right.at(i);
int point_y = str_y.toInt();
list_y_right[i] = QString("%1").arg(point_y - distance_lunkuo);
}
else if (i == list_x_right.size() - 1)
{
QString str_x = list_x_right.at(i);
int point_x = str_x.toInt();
list_x_right[i] = QString("%1").arg(point_x + distance_lunkuo);
QString str_y = list_y_right.at(i);
int point_y = str_y.toInt();
list_y_right[i] = QString("%1").arg(point_y + distance_lunkuo);
}
else
{
QString str_x = list_x_right.at(i);
int point_x = str_x.toInt();
list_x_right[i] = QString("%1").arg(point_x + distance_lunkuo);
}
}
for (int i = 0; i < list_x_down.size(); i++)
{
if (i == 0)
{
QString str_y = list_y_down.at(i);
int point_y = str_y.toInt();
list_y_down[i] = QString("%1").arg(point_y + distance_lunkuo);
QString str_x = list_x_down.at(i);
int point_x = str_x.toInt();
list_x_down[i] = QString("%1").arg(point_x + distance_lunkuo);
}
else if (i == list_x_down.size() - 1)
{
QString str_y = list_y_down.at(i);
int point_y = str_y.toInt();
list_y_down[i] = QString("%1").arg(point_y + distance_lunkuo);
QString str_x = list_x_down.at(i);
int point_x = str_x.toInt();
list_x_down[i] = QString("%1").arg(point_x - distance_lunkuo);
}
else
{
QString str_y = list_y_down.at(i);
int point_y = str_y.toInt();
list_y_down[i] = QString("%1").arg(point_y + distance_lunkuo);
}
}
for (int i = 0; i < list_x_left.size(); i++)
{
if ( i == 0)
{
QString str_x = list_x_left.at(i);
int point_x = str_x.toInt();
list_x_left[i] = QString("%1").arg(point_x - distance_lunkuo);
QString str_y = list_y_left.at(i);
int point_y = str_y.toInt();
list_y_left[i] = QString("%1").arg(point_y + distance_lunkuo);
}
else if (i == list_x_left.size() - 1)
{
QString str_x = list_x_left.at(i);
int point_x = str_x.toInt();
list_x_left[i] = QString("%1").arg(point_x - distance_lunkuo);
QString str_y = list_y_left.at(i);
int point_y = str_y.toInt();
list_y_left[i] = QString("%1").arg(point_y - distance_lunkuo);
}
else
{
QString str_x = list_x_left.at(i);
int point_x = str_x.toInt();
list_x_left[i] = QString("%1").arg(point_x - distance_lunkuo);
}
}
list_x_contour.clear();
list_y_contour.clear();
for (int i = 0; i < list_x_up.size(); i++)
{
list_x_contour.append(list_x_up.at(i));
list_y_contour.append(list_y_up.at(i));
}
for (int i = 0; i < list_x_right.size(); i++)
{
list_x_contour.append(list_x_right.at(i));
list_y_contour.append(list_y_right.at(i));
}
for (int i = 0; i < list_x_down.size(); i++)
{
list_x_contour.append(list_x_down.at(i));
list_y_contour.append(list_y_down.at(i));
}
for (int i = 0; i < list_x_left.size(); i++)
{
list_x_contour.append(list_x_left.at(i));
list_y_contour.append(list_y_left.at(i));
}
#endif
int dsr_x_max = m_maxX;
int dsr_x_min = m_minX;
int dsr_y_max = m_maxY;
int dsr_y_min = m_minY;
int point_x_max = x_max;
int point_x_min = x_min;
int point_y_max = y_max;
int point_y_min = y_min;
int Stitch_length = 4; //输入的针步长度参数,单位mm
int Stitch_length_calculate = Stitch_length / 0.01;
int Stitch_length_calculate_min = (Stitch_length - 1) / 0.01;
int Stitch_length_calculate_max = (Stitch_length + 1) / 0.01;
qDebug()<<"dsr_x_max:"<<dsr_x_max;
qDebug()<<"dsr_x_min:"<<dsr_x_min;
qDebug()<<"dsr_y_max:"<<dsr_y_max;
qDebug()<<"dsr_y_min:"<<dsr_y_min;
QStringList list_dsr_point_x = getDsrPointX(list_x_contour, dsr_x_max, dsr_x_min, point_x_max, point_x_min);
QStringList list_dsr_point_y = getDsrPointY(list_y_contour, dsr_y_max, dsr_y_min, point_y_max, point_y_min);
// if (list_dsr_point_x.size() > 2)
// {
// list_dsr_point_x.append(list_dsr_point_x.at(0));
// list_dsr_point_y.append(list_dsr_point_y.at(0));
// }
QStringList list_x_1;
QStringList list_y_1;
int cont_x = 0;
int x_check = (dsr_x_max - dsr_x_min) * 3 /4 + dsr_x_min;
int y_check = (dsr_y_max - dsr_y_min) / 2 + dsr_y_min;
int x_use_check = 10000000;
for (int i = 0 ; i < list_dsr_point_x.size(); i++)
{
QString str_get_x = list_dsr_point_x.at(i);
QString str_get_y = list_dsr_point_y.at(i);
int str_get_x_int = str_get_x.toInt();
int str_get_y_int = str_get_y.toInt();
if ((str_get_x_int - x_check) <= x_use_check && str_get_y_int <= y_check && str_get_x_int > x_check )
{
x_use_check = str_get_x_int - x_check;
cont_x = i;
}
}
qDebug()<<"list_dsr_point_x.size="<<list_dsr_point_x.size();
qDebug()<<"cont_x="<<cont_x;
list_x_1.append(list_dsr_point_x.at(cont_x));
list_x_1.append(QString("%1").arg((dsr_x_max + dsr_x_min) / 2));
list_y_1.append(list_dsr_point_y.at(cont_x));
list_y_1.append(QString("%1").arg((dsr_y_max + dsr_y_min) / 2));
for(int i = 0; i < list_dsr_point_x.size(); i++)
{
list_x_1.append(list_dsr_point_x.at(i));
list_y_1.append(list_dsr_point_y.at(i));
}
list_x_1.append(list_dsr_point_x.at(0));
list_y_1.append(list_dsr_point_y.at(0));
list_dsr_point_x.clear();
list_dsr_point_y.clear();
list_dsr_point_x = list_x_1;
list_dsr_point_y = list_y_1;
QStringList list_dsr_x_save;
QStringList list_dsr_y_save;
list_dsr_x_save.append(list_dsr_point_x.at(0));
list_dsr_y_save.append(list_dsr_point_y.at(0));
for (int i = 0; i < list_dsr_point_x.size() - 2;)
{
QString str_dsr_x_now = list_dsr_point_x.at(i);
QString str_dsr_y_now = list_dsr_point_y.at(i);
int int_dsr_x_now = str_dsr_x_now.toInt();
int int_dsr_y_now = str_dsr_y_now.toInt();
for (int j = i + 1; j < list_dsr_point_x.size(); j++)
{
QString str_dsr_x_nest = list_dsr_point_x.at(j);
QString str_dsr_y_nest = list_dsr_point_y.at(j);
int int_dsr_x_next = str_dsr_x_nest.toInt();
int int_dsr_y_next = str_dsr_y_nest.toInt();
double point_length = getPointLength(int_dsr_x_now, int_dsr_y_now, int_dsr_x_next, int_dsr_y_next);
if (point_length < Stitch_length_calculate_min)
{
if (j == list_dsr_point_x.size() - 1)
{
list_dsr_x_save.append(list_dsr_point_x.at(list_dsr_point_x.size() - 1));
list_dsr_y_save.append(list_dsr_point_y.at(list_dsr_point_y.size() - 1));
i = j;
break;
}
}
else if (point_length >= Stitch_length_calculate_min && point_length <= Stitch_length_calculate_max)
{
list_dsr_x_save.append(list_dsr_point_x.at(j));
list_dsr_y_save.append(list_dsr_point_y.at(j));
i = j;
break;
}
else if (point_length > Stitch_length_calculate_max)
{
int point_length_int = point_length;
int num = point_length_int / Stitch_length_calculate + 1;
for (int k = 1; k <= num; k++)
{
int point_x_now = ((int_dsr_x_next - int_dsr_x_now) * (k * Stitch_length_calculate) / point_length_int ) + int_dsr_x_now;
int point_y_now = ((int_dsr_y_next - int_dsr_y_now) * (k * Stitch_length_calculate) / point_length_int ) + int_dsr_y_now;
list_dsr_x_save.append(QString("%1").arg(point_x_now));
list_dsr_y_save.append(QString("%1").arg(point_y_now));
}
i = j;
break;
}
else
{
}
if (i == list_dsr_point_x.size() - 1)
{
break;
}
}
}
//list_dsr_x_save.append(list_dsr_point_x.at(0));
//list_dsr_y_save.append(list_dsr_point_y.at(0));
DsrStep point_dsr_item;
QList<DsrStep> dsr_item_list;//记录DSR文件内所有点信息
//第一针插入0
// memset(&point_dsr_item, 0, sizeof(DsrStep));
// point_dsr_item.ctrl = DSR_EMB;
// point_dsr_item.attr = 0;
// point_dsr_item.action = 0;
// point_dsr_item.dx =0;
// point_dsr_item.dy = 0;
// point_dsr_item.dr = 0;
// dsr_item_list.append(point_dsr_item);
int point_move_x;
int point_move_y;
//----生成数据点
for (int i = 0; i< list_dsr_x_save.size(); i++)
{
QString str_point_x = list_dsr_x_save.at(i);
QString str_point_y = list_dsr_y_save.at(i);
int point_x = str_point_x.toInt();
int point_y = str_point_y.toInt();
if (i == 0)
{
memset(&point_dsr_item, 0, sizeof(DsrStep));
point_dsr_item.ctrl = DSR_EMB;
point_dsr_item.attr = 0;
point_dsr_item.action = 0;
point_dsr_item.dx = 0;
point_move_x = point_x * (-1);
point_dsr_item.dy = 0;
point_move_y = point_y;
point_dsr_item.dr = 0;
dsr_item_list.append(point_dsr_item);
}
else
{
memset(&point_dsr_item, 0, sizeof(DsrStep));
point_dsr_item.ctrl = DSR_EMB;
point_dsr_item.attr = 0;
point_dsr_item.action = 0;
point_dsr_item.dx = point_x * (-1) - point_move_x;
point_dsr_item.dy = point_y - point_move_y;
point_dsr_item.dr = getDsrDr(point_dsr_item.dx, point_dsr_item.dy);
dsr_item_list.append(point_dsr_item);
}
if (i == list_dsr_x_save.size() - 1)
{
memset(&point_dsr_item, 0, sizeof(DsrStep));
point_dsr_item.ctrl = DSR_NULL;
point_dsr_item.attr = 0;
point_dsr_item.action = 0;
point_dsr_item.dx = point_x * (-1) - point_move_x;
point_dsr_item.dy = point_y - point_move_y;
point_dsr_item.dr = getDsrDr(point_dsr_item.dx, point_dsr_item.dy);
dsr_item_list.append(point_dsr_item);
}
}
qDebug()<<dsr_item_list.size();
return dsr_item_list;
}
int OutLine::getDsrDr(int dx, int dy)
{
float angle = atan(dy *1.0 / dx *1.0)*180/M_PI;
int angle_return = angle;
return angle_return;
}
QStringList OutLine::getDsrPointX(QStringList list_x_contour, int dsr_x_max, int dsr_x_min, int point_x_max, int point_x_min)
{
QStringList list_reture;
for (int i = 0; i< list_x_contour.size(); i++)
{
QString str_x = list_x_contour.at(i);
int point_x = str_x.toInt();
int point_x_dsr = dsr_x_min + ((dsr_x_max - dsr_x_min) * (point_x - point_x_min)) / (point_x_max - point_x_min);
list_reture.append(QString("%1").arg(point_x_dsr));
}
return list_reture;
}
QStringList OutLine::getDsrPointY(QStringList list_y_contour, int dsr_y_max, int dsr_y_min, int point_y_max, int point_y_min)
{
QStringList list_reture;
for (int i = 0; i< list_y_contour.size(); i++)
{
QString str_y = list_y_contour.at(i);
int point_y = str_y.toInt();
int point_y_dsr = dsr_y_min + ((dsr_y_max - dsr_y_min) * (point_y - point_y_min)) / (point_y_max - point_y_min);
list_reture.append(QString("%1").arg(point_y_dsr));
}
return list_reture;
}
double OutLine::getPointLength(int x1, int y1, int x2, int y2)
{
return sqrt(((x1 - x2) * (x1 - x2) * 1.0) + ((y1 - y2) * (y1 - y2) * 1.0));
}