下面的程序是我在视图类里面编写的画同心圆的程序,我期望能够达到这样一种效果:接下来能够用if语句判断每一组同心圆中各个圆周上象素值为0的点的个数,根据象素值为0的点的个数自动判断该圆心是节点还是边上的点。如果个数大于等于4则为节点,但是如果是边上的点个数定会有小于4个的情况存在。
现在的疑问就是:我这样画好同心圆直接加上if语句是不是就能够自动判别了呢?这样判别出是否节点之后,我怎么才能够知道节点的象素坐标值呢?用文本输出的方式吗?如果就让他在后台运行不要让他输出呢?
这个地方我非常困惑。另外,图像已经进行了轮廓跟踪,并将轮廓上点的象素坐标都已经保存在二维数组里面了,现在就是希望能够判别出轮廓上哪些是节点,以便利用节点的象素坐标和真实坐标找出二者之间的对应关系。谢谢大家了!
BOOL CMy2DREView::Ellipse(int x1, int y1, int x2, int y2)
{
int i;
int j;
EdgePoint m_EdgePoint;
int nNumNode;
int nCurX,nCurY,nNextX,nNextY,nFirstX,nFirstY;
nNumNode=TraceArray.GetSize();
if(nNumNode<1)
{
AfxMessageBox("是否没有进行轮廓跟踪?\n请进行正确的轮廓跟踪!");
return FALSE;
} //获取第0个节点的数据
    m_EdgePoint=TraceArray.GetAt(0);
    nCurX=m_EdgePoint.CurPoint.x;
nCurY=m_EdgePoint.CurPoint.y;
    nFirstX=nCurX;
    nFirstY=nCurY;
CClientDC dc(this);
//以第0个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nFirstX-j,nFirstY+j,nFirstX+j,nFirstY-j);
}
//dc.Ellipse(nFirstX-1,nFirstY+1,nFirstX+1,nFirstY-1);
for(i=1;i<nNumNode;i++)
{
//获取第i个节点的数据
        m_EdgePoint=TraceArray.GetAt(i);
nNextX=m_EdgePoint.CurPoint.x;
nNextY=m_EdgePoint.CurPoint.y;
//以第i个节点为圆心,画5个同心圆
for(j=1;j<6;j++)
{
dc.Ellipse(nNextX-j,nNextY+j,nNextX+j,nNextY-j);
}
}
return TRUE;
}

解决方案 »

  1.   

    你的问题归根到底就是为了求圆周的一系列点的坐标;
    1、可以先找出每个同心圆的行列像素范围(X,Y坐标范围);
    2、当列像素从小到大循环时(循环间距一个像素),计算它的行像素,用如下公式计算:
    (x-x0)^2+(y-y0)^2 = r^2;
    3、圆周上所有点的像素都计算出来了,应该知道怎么判断了吧。
      

  2.   

    象素坐标x和y与象素值f(x,y)之间不是有一个对应关系吗?如果那个圆心是节点的话,圆周上必有四个象素为0的点,如果我只知道这个点的坐标怎么判断它所在的圆周的圆心就是节点呢?
      

  3.   

    syy64(太平洋)同学,假设我的图像每一mm代表一个象素,那么象素坐标值就是该象素所在的行列数,然后利用公式求出象素值。如果该圆周上的点的象素值为0的个数大于等于4就判断为节点,此时这个圆心的坐标也就知道了,这样的话我就可以找出他跟真实坐标之间的关系了。你看这样行吗?
      

  4.   

    syy64(太平洋)同学,假设我的图像每一mm代表一个象素,那么象素坐标值就是该象素所在的行列数,然后利用公式求出象素值.
    -----------------------------------
    这句话的说法不够准确,用公式求出的不是像素值,而是该像素的行号或列号(坐标),然后根据该像素的行列号,从内存块中取出它的像素值。然后再按你后面说的作。
      

  5.   

    我明白你的意思了,//沿扫描方向查看一个像素
    lpSrc = (char *)lpDIBBits + lLineBytes * ( CurPoint.y + Direction[BeginDirect][1])
    + (CurPoint.x+ Direction[BeginDirect][0]);
    pixel = (unsigned char)*lpSrc;//这个地方的象素就是像你说的那样取出来的,是吗?
    if(pixel == 0)
    {
    bFindPoint = true;
    //结构数组中记录的第一个点是最左下边界点,即起始点
    //方向为到下一点的矢量方向
    m_EdgePoint.CurPoint.x = CurPoint.x;
    m_EdgePoint.CurPoint.y = CurPoint.y;
    m_EdgePoint.nCurVerct = (BYTE)BeginDirect;
    TraceArray.Add(m_EdgePoint);//你看我把边界点的坐标值都存到一个数组里面了,我的同心圆的圆心坐标就是从这个数组里面取出来的,在圆周上必定有四个点关于圆心在x或y方向对称,也就是说在x或y方向分别有两个点的x或y坐标跟圆心是一样的,这样我就可以知道他们的y或x坐标了。然后根据lpSrc = (char *)lpDIBBits + lLineBytes * ( CurPoint.y + Direction[BeginDirect][1])
    + (CurPoint.x+ Direction[BeginDirect][0]);
    pixel = (unsigned char)*lpSrc;来得到象素值,再去判断他是否为0。
    是吗?谢谢