第二个封装类:鼠标对圆的三个操作
public class ROI_Cirle
{
public RoiBase2 m_RoiCircle;
public E_HANDLES m_eHandle;
public Cursor m_cur;
public ROI_Cirle()
{
m_RoiCircle = new RoiBase2();
}
public void DrawRectFrame(bool lbtn, PointF point)
{
if (lbtn)
{
switch (m_eHandle)
{
case E_HANDLES.E_HANDLE_INSIDE:
m_RoiCircle.Drag(point);//拖动圆心
break;
case E_HANDLES.E_HANDLE_SOUTH:
m_RoiCircle.DragRadius(point);//拖动半径,改变圆大小
break;
case E_HANDLES.E_HANDLE_SOUTH_EAST:
m_RoiCircle.DragTolerance(point);//拖动another点,改变内外圆大小(操作弹性)
break;
default:
break;
}
}
else
{
m_eHandle = (E_HANDLES)m_RoiCircle.IsPointInRect(point);
}
Insteadof((int)m_eHandle);
return;
}
................ (参考前面,已有)
}
内外圆(受弹性控制)有什么用呢?相应的内外圆上点相连,便是线图像,线图像延伸,会通过圆心。再联想一下纸扇的辐条。下面我们就要制造这些辐条线图像,要不如何去感知圆或者弧线,或者非圆曲线呢?花费功夫折弯找线工具(通格本)是也!好的,上面所有,我们把它封装在找圆工具mg_CircleCaliper类中:
public class mg_CircleCaliper//使得线图像在圆工具上发挥作用
{
public int SPLITNUM = 8;//圆被分成四象限8个分区
public ROI_Cirle m_cirRoi;
public mg_CircleCaliper()
{
m_cirRoi = new ROI_Cirle();//初始化我们准备的杰作
}
public PointF[] SPlitPassThroughPointsimprove(ref byte[] buffer8,//0246分区寻找穿越点
ref PointF[] BackResult, int thresDelta, int Dir, Size wh,
ref List<Point> onradpoints, ref List<Point> onradpointsin, ref PointF[] inback){........}
public PointF[] SPlitPassThroughPointsimprove1357(ref byte[] buffer8,//1357分区寻找穿越点
ref PointF[] BackResult, int thresDelta, int Dir, Size wh,
ref List<Point> onradpoints, ref List<Point> onradpointsin, ref PointF[] inback){........}
public PointF DdaFindPtImprove(ref byte[] buffer8, PointF Start, PointF End, int thresDelta, int Dir, Size wh)
{..............}//前面找线工具已经用到
public PointF FindCrosspointimprove(ref List<float> lineTiDu, ref List<PointF> ijRecord, int Dir, int thresDelta)
{..............}//前面找线工具已经用到
}
每个分区8条线图像,8个区,一共64条线图像。1357分区寻找穿越点函数或许可以和0246分区寻找穿越点函数进化而合并,有机会可以去试一试,当下我先用这个稳定的版本。两个函数基本相同(略有差别),示范1357分区寻找穿越点函数如下:
{//buffer8感兴趣区域图像,BackResult找到的穿越点,onradpoints外圆上点,onradpointsin内圆上点
//inback,SPlitSegPoint是内外圆上取到的构成线图像的样本点,其他参数前面找线工具已经用到
PointF[] SPlitSegPoint = new PointF[SPLITNUM];
if (onradpoints.Count == 0 || onradpointsin.Count == 0) return SPlitSegPoint;
PointF startxy = onradpointsin[0];
PointF endxy = onradpoints[0];
if (startxy.X < 0 || startxy.X > wh.Width - 1 ||
startxy.Y < 0 || startxy.Y > wh.Height - 1 ||
endxy.X < 0 || endxy.X > wh.Width - 1 ||
endxy.Y < 0 || endxy.Y > wh.Height - 1)
{
return SPlitSegPoint;
}
else
{
BackResult[8] = DdaFindPtImprove(ref buffer8, onradpointsin[onradpointsin.Count - 1],
onradpoints[onradpoints.Count - 1], thresDelta, Dir, wh);
for (int i = 0; i < SPLITNUM; i++)
{
SPlitSegPoint[i].X = onradpoints[onradpoints.Count * (i) / (SPLITNUM)].X;
SPlitSegPoint[i].Y = onradpoints[onradpoints.Count * (i) / (SPLITNUM)].Y;
inback[i].X = onradpointsin[onradpointsin.Count * (i) / (SPLITNUM)].X;
inback[i].Y = onradpointsin[onradpointsin.Count * (i) / (SPLITNUM)].Y;
startxy = inback[i];
endxy = SPlitSegPoint[i];
if (startxy.X < 0 || startxy.X > wh.Width - 1 ||
startxy.Y < 0 || startxy.Y > wh.Height - 1 ||
endxy.X < 0 || endxy.X > wh.Width - 1 ||
endxy.Y < 0 || endxy.Y > wh.Height - 1) continue;
BackResult[i] = DdaFindPtImprove(ref buffer8, inback[i], SPlitSegPoint[i], thresDelta, Dir, wh);
}
return SPlitSegPoint;
}
}
下一步,在界面运行起来,show一把。
(未完待续..............)