#include "marker.h" Marker::Marker(QObject *parent) : QObject(parent) { m_iDPMM = 40; m_listPolyline.clear(); m_nProducts = 0; m_nActualMatchRegions = 0; m_nMatchRegions = 0; m_strProductCode = ""; } Marker::~Marker() { } Marker::Marker(const Marker &a): QObject() { m_iDPMM = a.m_iDPMM; m_listPolyline.clear(); m_listPolyline.append(a.m_listPolyline); m_nProducts = a.m_nProducts; m_nActualMatchRegions = a.m_nActualMatchRegions; m_nMatchRegions = a.m_nMatchRegions; m_strProductCode = a.m_strProductCode; } Marker Marker::operator=(const Marker &a) { m_iDPMM = a.m_iDPMM; m_listPolyline.clear(); m_listPolyline.append(a.m_listPolyline); m_nProducts = a.m_nProducts; m_nActualMatchRegions = a.m_nActualMatchRegions; m_nMatchRegions = a.m_nMatchRegions; m_strProductCode = a.m_strProductCode; return *this; } void Marker::Initialize() { m_iDPMM = 40; m_listPolyline.clear(); m_nProducts = 0; m_nActualMatchRegions = 0; m_nMatchRegions = 0; m_strProductCode = ""; } QRectF Marker::GetRect() { QRectF rect; CRPPolyline RPPolyline; rect.setRect(0,0,0,0); for(int i = 0; i < m_listPolyline.size(); i++) { RPPolyline = m_listPolyline.at(i); if (RPPolyline.m_nDrawingType == 0) { rect |= RectofPolyline(RPPolyline.m_listPoint); } else if (RPPolyline.m_nDrawingType == 3) { rect |= QRectF(RPPolyline.m_text.m_ptPostLU,RPPolyline.m_text.m_ptPostRD); } else if (RPPolyline.m_nDrawingType == 1) { rect |= QRectF(RPPolyline.m_bitmapInfo.m_ptAbPostLU,RPPolyline.m_bitmapInfo.m_ptAbPostRD); } } return rect; } QRectF Marker::RectofPolyline(const QList &listPoint) { if(listPoint.empty()) { return QRectF(0,0,0,0); } int iXMin = INT_MAX; int iXMax = INT_MIN; int iYMin = INT_MAX; int iYMax = INT_MIN; int iValueX; int iValueY; int iPointCount = listPoint.size(); for(int i = 0 ;i < iPointCount; i++) { iValueX = listPoint.at(i).x(); iValueY = listPoint.at(i).y(); if( iValueX > iXMax ) { iXMax = iValueX; } if(iValueX < iXMin ) { iXMin = iValueX; } if( iValueY > iYMax ) { iYMax = iValueY; } if(iValueY < iYMin ) { iYMin = iValueY; } } return QRectF(QPointF(iXMin,iYMin),QPointF(iXMax,iYMax)); } double CNotch::angle_2(int startx, int starty, int endx, int endy) { //直线与X轴之间的夹角 X轴向量OE(1,0) double dAngle = 0; if((endx == startx) && (endy == starty)) { return dAngle; } //求直线的向量坐标 double dX = endx - startx; double dY = endy - starty; dAngle = qAcos((dX)/(qSqrt(dX*dX + dY*dY))); return dAngle; } void CNotch::CovertToOutputByOffset(int nOffSetX, int nOffsetY) { double a = 0; double b = 0; double c = 0; //范围在[0,2pi)之间 double dAngle = angle_2(m_ptStart.x(),m_ptStart.y(),m_ptEnd.x(),m_ptEnd.y()); m_nAngle = dAngle*180.0/CONST_PI*100.0 + 0.5; //double dX = m_ptEnd.x - m_ptStart.x; //double dY = m_ptEnd.y - m_ptStart.y; //double dLen = sqrt(dX*dX + dY*dY); //m_ptCorrect.x = nOffSetY/dLen * dX + m_ptStart.x; //m_ptCorrect.y = nOffsetY/dLen * dY + m_ptStart.y; QPoint ptY; ptY.setX(nOffsetY*cos(dAngle) + m_ptStart.x() + 0.5); ptY.setY(nOffsetY*sin(dAngle) + m_ptStart.y() + 0.5); if (nOffSetX == 0) { m_ptCorrect.setX(ptY.x()); m_ptCorrect.setY(ptY.y()); return; } int nX = m_ptEnd.x() - m_ptStart.x(); int nY = m_ptEnd.y() - m_ptStart.y(); if (nX == 0) { a = 0; b = 1; c = -ptY.y(); } if (nY == 0) { a = 1; b = 0; c = -ptY.x(); } double k = double(m_ptStart.x() - m_ptEnd.x())/double(m_ptEnd.y() - m_ptStart.y()); c = ptY.y() - k*ptY.x(); a = k; b = -1; int nRadius = abs(nOffSetX); QPoint ptInter1; QPoint ptInter2; if (IntOfLineCircle(a,b,c,ptY.x(),ptY.y(),nRadius,ptInter1,ptInter2) == 2) { //向量 int nYv = ptInter1.y() - ptY.y(); int nXv = ptInter1.x() - ptY.x(); //判断该点在起点到终点连线的哪一侧?>0 右侧 if((nXv*nY -nYv*nX)>0) { if (nOffSetX > 0)//右侧 { m_ptCorrect.setX(ptInter1.x()); m_ptCorrect.setY(ptInter1.y()); } else { m_ptCorrect.setX(ptInter2.x()); m_ptCorrect.setY(ptInter2.y()); } } else { if (nOffSetX < 0)//左侧 { m_ptCorrect.setX(ptInter1.x()); m_ptCorrect.setY(ptInter1.y()); } else { m_ptCorrect.setX(ptInter2.x()); m_ptCorrect.setY(ptInter2.y()); } } } } int CNotch::IntOfLineCircle(double a, double b, double c, int xc, int yc, int nR, QPoint &lpptIntersection1, QPoint &lpptIntersection2) { //点:(x0,y0) //线:Ax+By+C=0 //①距离=ABS(A*x0+B*y0+C) / SQRT(A*A+B*B) double dis = 0; dis = abs(a*xc+b*yc+c)/sqrt(a*a+b*b); int rel = 0; if(dis < nR) { rel = 0; } else if(dis == nR) { rel = 1; } else if(dis > nR) { double k = -a/b; double b1 = 2*xc-2*k*(b-yc); double sval = (b1/100.0)*(b1/100.0)*10000.0-4*a*c; if(sval < 0) { qDebug()<