#include "ROICircle.h" #include"Util.h" ROICircle::ROICircle() { //控制点2个 numHandles = 2; // one at corner of circle + midpoint //默认控制点为圆心 activeHandleIdx = 1; roiType = ROIType::Circle; row1 = 0; col1 = 0; midC = 0; midR = 0; radius = 0; } void ROICircle::createROI(double midX, double midY) { //圆心为鼠标所在点 midR = midY; midC = midX; //半径为100 radius = 100; //圆上的点 row1 = midR; col1 = midC + radius; } void ROICircle::drawROI(HTuple winID, double scaleFactor) { //显示圆 //DispCircle(winID, midR, midC, radius); HObject ho_ContCircle; GenCircleContourXld(&ho_ContCircle, midR, midC, radius, 0, 6.28318, "positive", 1); DispObj(ho_ContCircle, winID); double width=handleWidth; //显示两个控制框 //DispRectangle2(winID, row1, col1, 0, width, width); //DispRectangle2(winID, midR, midC, 0, width, width); HObject ho_Rectangle1, ho_Rectangle2; GenRectangle2ContourXld(&ho_Rectangle1, row1, col1, 0, width / scaleFactor, width / scaleFactor); GenRectangle2ContourXld(&ho_Rectangle2, midR, midC, 0, width / scaleFactor, width / scaleFactor); DispObj(ho_Rectangle1, winID); DispObj(ho_Rectangle2, winID); } double ROICircle::distToClosestHandle(double x, double y) { //ROI::distToClosestHandle(x, y); double max = 10000; double val[2]; val[0] = HMisc::DistancePp(y, x, row1, col1); // border handle val[1] = HMisc::DistancePp(y, x, midR, midC); // midpoint for (int i = 0; i < numHandles; i++) { if (val[i] < max) { max = val[i]; activeHandleIdx = i; } }// end of for return val[activeHandleIdx]; } void ROICircle::displayActive(HTuple winID, double scaleFactor) { double width=handleWidth; HObject ho_Rectangle; // Util::notify(QString(GBK("结果:%1")).arg(width)); switch (activeHandleIdx) { case 0://圆上的点 //DispRectangle2(winID, row1, col1, 0, width, width); GenRectangle2ContourXld(&ho_Rectangle, row1, col1, 0, width / scaleFactor, width / scaleFactor); DispObj(ho_Rectangle, winID); break; case 1://圆心 //DispRectangle2(winID, midR, midC, 0, width, width); GenRectangle2ContourXld(&ho_Rectangle, midR, midC, 0, width / scaleFactor, width / scaleFactor); DispObj(ho_Rectangle, winID); break; } } void ROICircle::moveByHandle(double newX, double newY) { HTuple distance; double shiftX, shiftY; switch (activeHandleIdx) { case 0: // 鼠标在圆上的一点时 row1 = newY; col1 = newX; distance = HMisc::DistancePp(row1, col1, midR, midC); radius = distance; break; case 1: // 鼠标在圆心上时 shiftY = midR - newY; shiftX = midC - newX; midR = newY; midC = newX; row1 -= shiftY; col1 -= shiftX; break; } } QCursor ROICircle::showByHandle() { QCursor cursor; switch (activeHandleIdx) { case 0: // 鼠标在圆上的一点时 cursor= Qt::SizeBDiagCursor ; break; case 1: // 鼠标在圆心上时 cursor= Qt::SizeAllCursor; break; } return cursor; } HRegion ROICircle::getRegion() { HRegion region; region.GenCircle(midR, midC, radius); return region; } HTuple ROICircle::getROIData() { HTuple dat; dat.Clear(); dat[0] = midR; dat[1] = midC; dat[2] = radius; return dat; } void ROICircle::setROIData(HTuple dat) { Q_UNUSED(dat); } void ROICircle::save(QDataStream &dataStream) { ROI::save(dataStream); int paranum;//参数数量 paranum = 6; dataStream << paranum;//先保存参数数量 dataStream << (int)1 << radius; dataStream << (int)2 << row1; dataStream << (int)3 << col1; dataStream << (int)4 << midR; dataStream << (int)5 << midC; dataStream << (int)6 << m_strTitle; } void ROICircle::load(QDataStream &dataStream) { ROI::load(dataStream); int paranum;//参数数量 int para; dataStream >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { dataStream >> para; switch (para) { case 1: dataStream >> radius; break; case 2: dataStream >> row1; break; case 3: dataStream >> col1; break; case 4: dataStream >> midR; break; case 5: dataStream >> midC; break; case 6: dataStream >> m_strTitle; break; default: { qWarning () << "配置文档错误!"; } break; } } }