机器视觉入门之路(五一,找线工具的设计A)
继续我们昨天的工作,先把这个有中间分隔线(rccentreline)的矩形画出来,然后等间隔增加线图像,让他变成找线工具。对比“丁”字型线图像工具roibase类,有如下增加:
1,增加了三条线声明: public mg_line otherLine1;//上----------
public mg_line otherLine2;//下----------
public mg_line lastline;//-------|
2, public RoiBase()//构造函数增加: start = new PointF(10, 10);
end = new PointF(70, 10);
otherLine1 = new mg_line(start, end);
start = new PointF(10, 70);
end = new PointF(70, 70);
otherLine2 = new mg_line(start, end);
start = new PointF(70, 10);
end = new PointF(70, 70);
lastline = new mg_line(start, end);
3, public int IsPointInRect(PointF point)//判断操作是否在相应区域增加:
PointF Herline2centre = new PointF((otherLine2.pt_start.X + otherLine2.pt_end.X) / (float)2,
(otherLine2.pt_start.Y + otherLine2.pt_end.Y) / (float)2);
......
else if (point.X <= Herline2centre.X + 5 && point.X >= Herline2centre.X - 5
&& point.Y >= Herline2centre.Y - 5 && point.Y <= Herline2centre.Y + 5)
{
return (int)E_HANDLES.E_HANDLE_SOUTH;//新增了变宽弹性操作与第十项对应
}
4, public void RoiReset(float deltaChang, float deltaKuan)//线图像工具重置增加:
start = new PointF(RcCentreLine.pt_start.X, RcCentreLine.pt_start.Y - 30 - deltaKuan / (float)2);
end = new PointF(RcCentreLine.pt_start.X + 60 + deltaChang, RcCentreLine.pt_start.Y - 30 - deltaKuan / (float)2);
otherLine1 = new mg_line(start, end);
start = new PointF(RcCentreLine.pt_start.X, RcCentreLine.pt_start.Y + 30 + deltaKuan / (float)2);
end = new PointF(RcCentreLine.pt_start.X + 60 + deltaChang, RcCentreLine.pt_start.Y + 30 + deltaKuan / (float)2);
otherLine2 = new mg_line(start, end);
start = new PointF(RcCentreLine.pt_start.X + 60 + deltaChang, RcCentreLine.pt_start.Y - 30 - deltaKuan / (float)2);
end = new PointF(RcCentreLine.pt_start.X + 60 + deltaChang, RcCentreLine.pt_start.Y + 30 + deltaKuan / (float)2);
lastline = new mg_line(start, end);
5, public void updateRoi(float rotationAngle)//更新我们设计的线图像工具增加:
otherLine1.Rotate(RcCentreLine.pt_start, rotationAngle);
otherLine2.Rotate(RcCentreLine.pt_start, rotationAngle);
lastline.Rotate(RcCentreLine.pt_start, rotationAngle);
6, public void Drag(PointF point)//拖动线图像工具增加: otherLine1.Move(delta);
otherLine2.Move(delta);
lastline.Move(delta);
7, public void DrawLineAndRect(Graphics g, Pen p, int Dir)//画出线图像工具增加:
g.DrawLine(p, otherLine1.pt_start, otherLine1.pt_end);
g.DrawLine(p, otherLine2.pt_start, otherLine2.pt_end);
g.DrawLine(p, lastline.pt_start, lastline.pt_end);
//Down
g.DrawRectangle(p, (int)(otherLine2.pt_end.X + otherLine2.pt_start.X) / 2 - 5,
(int)(otherLine2.pt_end.Y + otherLine2.pt_start.Y) / 2 - 5, 10, 10);
//白到黑 CentreToDown
if (Dir == 0)
{
string str1 = "白";
Font drawfont = new Font("Arial", 9);
g.DrawString(str1, drawfont, Brushes.Brown, m_RcCenter.X - 5, m_RcCenter.Y + 5);
str1 = "黑";
g.DrawString(str1, drawfont, Brushes.Blue, (otherLine2.pt_end.X + otherLine2.pt_start.X) / 2 - 5,
(otherLine2.pt_end.Y + otherLine2.pt_start.Y) / 2 + 5);
}
//黑到白 DownToCentre
if (Dir == 1)
{
string str1 = "黑";
Font drawfont = new Font("Arial", 9);
g.DrawString(str1, drawfont, Brushes.Blue, m_RcCenter.X - 5, m_RcCenter.Y + 5);
str1 = "白";
g.DrawString(str1, drawfont, Brushes.Brown, (otherLine2.pt_end.X + otherLine2.pt_start.X) / 2 - 5,
(otherLine2.pt_end.Y + otherLine2.pt_start.Y) / 2 + 5);
}
10,最后一个,弹性改变后整个基础框架的更新,函数是
public void DragTolerancey(PointF point)//程序逻辑不对20160627,已经更正
{
double k2 = 0; double k = 0;
PointF QQ = new PointF();
PointF AA = new PointF((otherLine2.pt_end.X + otherLine2.pt_start.X) / 2, (otherLine2.pt_end.Y + otherLine2.pt_start.Y) / 2);
if ((otherLine2.pt_end.X - otherLine2.pt_start.X) == 0)
{
// k2 = 65535;//还需进化20160623
QQ.X = point.X;
QQ.Y = AA.Y;
PointF delta = new PointF(QQ.X - AA.X, QQ.Y - AA.Y);
otherLine2.Move(delta);
PointF delta1 = new PointF(-delta.X, -delta.Y);
otherLine1.Move(delta1);
//deal with startline and endline
startLine.updatePstart(otherLine1.pt_start);
startLine.updatePend(otherLine2.pt_start);
lastline.updatePstart(otherLine1.pt_end);
lastline.updatePend(otherLine2.pt_end);
return;
}
if ((m_RcCenter.X - AA.X) == 0)
{
// k = 65535;
QQ.X = AA.X;
QQ.Y = point.Y;
}
else
{
k2 = (otherLine2.pt_end.Y - otherLine2.pt_start.Y) / (otherLine2.pt_end.X - otherLine2.pt_start.X);
k = (m_RcCenter.Y - AA.Y) / (m_RcCenter.X - AA.X);//计算一个k就可以了,k*k2=-1;20160701暂时不改变
QQ.X = (float)((AA.Y - point.Y + k2 * point.X - k * AA.X) / (k2 - k));
QQ.Y = (float)(AA.Y + k * QQ.X - k * AA.X);
}
PointF deltadelta = new PointF(QQ.X - AA.X, QQ.Y - AA.Y);
otherLine2.Move(deltadelta);
PointF delta11 = new PointF(-deltadelta.X, -deltadelta.Y);
otherLine1.Move(delta11);
//deal with startline and endline
startLine.updatePstart(otherLine1.pt_start);
startLine.updatePend(otherLine2.pt_start);
lastline.updatePstart(otherLine1.pt_end);
lastline.updatePend(otherLine2.pt_end);
}
(待续...........................)
更多推荐


所有评论(0)