微软的画图板小程序 有个功能是选中一块区域 然后可以剪切出来的功能。
矩形差不多搞定,多边形的那个选取是怎么做的呢?给点提示吧。

解决方案 »

  1.   

    多边形应该牵扯到数学里的问题了。我觉得可以从CDC的根本上去着手。我们把屏幕上的每个点做为一个结构对象,那么图像就是一个结构对象链表
    结构里包括(坐标,颜色值等)。那么多边形也是这么一个链表,这个链表里有多少个点,哪些点,就要靠数学去计算了
      

  2.   

    现在有了一些基本的思路
    1:算出图形的最小外接矩形
    2:把图形外和小矩形的空隙全部画线填充为单色
    3:用TransparentBlt转换成透明的位图。
    第二步骤的时候 出了很多问题。
    大家帮我看看。
    算法是收集鼠标画轮廓的时候的移动点集,然后遍历这个点集 找出Y坐标相同的两个点 然后从矩形框的边往这个点连线,最终目的可以把空隙全部填充完。
    这是我的算法
    参数points是监控mousemove收集到的点集,mixRect是鼠标勾画轮廓时候的最小外界矩形,memDc即是用作画线的设备上下文.void ConvertToOriginalRectPicture(CArray<CPoint,CPoint> &points, CRect& mixRect, CDC &memDc)
    { CPoint ptTemp = NULL;
    int iNumSameY = 0;
    long lY = 0;//矩形从上往下扫描
    CArray<CPoint,CPoint> linePoints;
    CPen pen(PS_SOLID,1,RGB(0,255,255));
    CPen* oldPen = (CPen*)memDc.SelectObject(&pen); int size = points.GetSize();
    for (int n = 0;n < size ;n++)
    {
    if ( (n+1) == size)
    {
    break;
    }
    //Bresenham(points[n].x,points[n].y,points[n+1].x,points[n+1].y,points);
    GenerateAllPointsBetween2points(points[n],points[n+1],points);
    }
    int z = 0;
    for (int j = 0;j<(mixRect.bottom - mixRect.top);j++)
    {
    linePoints.RemoveAll();
    lY = mixRect.top + j;
    for (int i = 0;i<points.GetSize();i++)
    {
    if(lY == points[i].y)
    {
    iNumSameY++;
    if (2 == iNumSameY)
    {
    linePoints.Add(ptTemp);
    linePoints.Add(points[i]);
    iNumSameY = 0;
    }
    ptTemp = points[i];
    }
    }
    memDc.MoveTo(0,j);

    for (int m = 0;m < linePoints.GetSize();m++)
    {
    if (m>linePoints.GetSize()-1)
    {
    memDc.LineTo(mixRect.right,j);
    break;
    }
    else
    {
    memDc.LineTo(linePoints[m].x-mixRect.left,j);
    }

    if (m+1>linePoints.GetSize()-1)
    {
    break;
    }
    m += 1;
    memDc.MoveTo(linePoints[m].x-mixRect.left,j);
    }
    iNumSameY = 0;
    } memDc.SelectObject(oldPen);
    }应为鼠标move时候收集的点有很多遗漏,所以我会判断相邻的两个点 如果不连续 继续计算出这两点确定的直线上的所有点 加入到这个点集中(points)。这是我计算两点的间所有点的算法。void GenerateAllPointsBetween2points(IN CPoint start, IN CPoint end, OUT CArray<CPoint,CPoint> &points)
    {
    //points.RemoveAll();
    if (start.x == end.x)
    {
    for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++)
    {
    points.Add(CPoint(start.x,i));
    }
    return;
    }
    if (start.y == end.y)
    {
    return;
    } double k,b;
    k = (start.y-end.y) / (start.x - end.x);
    b = start.y - (k * start.x);

    for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++)
    {
    points.Add(CPoint(i,k*i+b));
    }}按理来说 没什么问题 但是却只在图形上画出了几道横线。
    唉 找不出问题所在。
      

  3.   

    void GenerateAllPointsBetween2points(IN CPoint start, IN CPoint end, OUT CArray<CPoint,CPoint> &points)
    {
    //points.RemoveAll();
    if (start.x == end.x)
    {
    for (int i = ((start.y>end.y)?end.y : start.y) + 1;i < ((start.y>end.y) ? start.y : end.y);i++)
    {
    points.Add(CPoint(start.x,i));
    }
    return;
    }
    if (start.y == end.y)
    {
    return;
    } double k,b;
    k = (start.y-end.y) / (start.x - end.x);
    b = start.y - (k * start.x);

    for (int i = ((start.x>end.x)?end.x : start.x) + 1;i < ((start.x>end.x)?start.x : end.x);i++)
    {
    points.Add(CPoint(i,k*i+b));
    }}