wreasy
清风云淡1991
采纳率0%
2016-01-20 03:21

请教:请问如何把一个多边形区域像素化?

把这些像素的值存到数组里,多边形内部元素值为1,外部为0。谢谢了!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • 91program 91program 5年前
  • gischenjun04 gischenjun04 5年前

    long CVectorToGrid::RegionNumber(int regionx,int regiony)
    {
    return (long)regiony*Cols+regionx;
    }
    int CVectorToGrid::RealRegionX(double X)
    {
    return (X-FullExtent.Left)/CellSize;
    }
    int CVectorToGrid::RealRegionY(double Y)
    {
    return (FullExtent.Top-Y)/CellSize;
    }
    int CVectorToGrid::RegionX(double X)
    {
    int x=(X-FullExtent.Left)/CellSize;
    if(x x=0;
    else if(x>=Cols)
    x=Cols-1;
    return x;
    }
    int CVectorToGrid::RegionY(double Y)
    {
    int y=(FullExtent.Top-Y)/CellSize;
    if(y y=0;
    else if(y>=Rows)
    y=Rows-1;
    return y;
    }
    void CVectorToGrid::ConvertRing(IPoints*pnts,IMemFourValueArray*pArray)
    {
    double XMin,YMin,XMax,YMax;
    IEnvelope*ext;
    pnts->get_Envelope(&ext);
    ext->GetCoord(&XMin,&YMax,&XMax,&YMin);
    ext->Release();
    int RegionX1=RealRegionX(XMin);
    int RegionY1=RealRegionY(YMax);
    int RegionX2=RealRegionX(XMax);
    int RegionY2=RealRegionY(YMin);
    double X1,Y1,X2,Y2;
    long RegionN;
    int rx1,rx2,ry1,ry2,j,min;
    LONG ptCount;
    pnts->get_Count(&ptCount);
    if(ptCount pnts->GetItem(0,&X1,&Y1);
    rx1=RealRegionX(X1);ry1=RealRegionY(Y1);
    double InterX;
    double centery;
    double lx=FullExtent.Left+CellSize*RegionX1;
    double rx=FullExtent.Left+CellSize*(RegionX2+1);
    int leftr;
    int FormerY;
    int FormerDeri=0;
    bool IsIntersect;
    int V;
    float fV;
    for(long k=1;k {
    if(k==ptCount-1)
    pnts->GetItem(0,&X2,&Y2);
    else
    pnts->GetItem(k,&X2,&Y2);
    rx2=RealRegionX(X2);ry2=RealRegionY(Y2);
    if(Y1>Y2)
    {
    if((FormerDeri==1)&&(FormerY>=ry1)) ry1=FormerY+1;
    double r=(X2-X1)/(Y2-Y1);
    for(int p=ry1;p<=ry2;p++)
    {
    centery=FullExtent.Top-CellSize/2-p*CellSize;
    IsIntersect=false;
    if((centery>=Y2-DifFuzzy)&&(centery<=Y1+DifFuzzy))
    {
    FormerY=p;
    FormerDeri=1;
    IsIntersect=true;
    InterX=r*(centery-Y1)+X1;
    }
    if((IsIntersect)&&(p>=0)&&(p<=Rows-1))
    {
    leftr=RealRegionX(InterX);
    if(InterX>FullExtent.Left+CellSize/2+CellSize*leftr)
    {
    leftr++;
    }
    if(leftr>0)
    {
    RegionN=RegionNumber(max(RegionX1,0),p);
    min=min(leftr,Cols);
    for(j=max(RegionX1,0);j {
    pArray->get_ValueAsFloat(RegionN,&fV);
    V=(int)fV-1;
    if(V pArray->put_ValueAsFloat(RegionN,V);
    RegionN++;
    }
    }
    if(leftr if(leftr {
    RegionN=RegionNumber(leftr,p);
    min=min(RegionX2,Cols-1);
    for(j=leftr;j {
    pArray->get_ValueAsFloat(RegionN,&fV);
    V=(int)fV+1;
    if(V>3) V-=4;
    pArray->put_ValueAsFloat(RegionN,V);
    RegionN++;
    }
    }
    }
    }
    }
    else if(Y1 {
    if((FormerDeri==-1)&&(FormerY double r=(X2-X1)/(Y2-Y1);
    for(int p=ry1;p>=ry2;p--)
    {
    centery=FullExtent.Top-CellSize/2-p*CellSize;
    IsIntersect=false;
    if((centery>=Y1-DifFuzzy)&&(centery<=Y2+DifFuzzy))
    {
    FormerY=p;
    FormerDeri=-1;
    IsIntersect=true;
    InterX=r*(centery-Y1)+X1;
    }
    if((IsIntersect)&&(p>=0)&&(p<=Rows-1))
    {
    leftr=RealRegionX(InterX);
    if(InterX>FullExtent.Left+CellSize/2+CellSize*leftr)
    {
    leftr++;
    }
    if(leftr>0)
    {
    RegionN=RegionNumber(max(RegionX1,0),p);
    min=min(leftr,Cols);
    for(j=max(RegionX1,0);j {
    pArray->get_ValueAsFloat(RegionN,&fV);
    V=(int)fV+1;
    if(V>3) V-=4;
    pArray->put_ValueAsFloat(RegionN,V);
    RegionN++;
    }
    }
    if(leftr if(leftr {
    RegionN=RegionNumber(leftr,p);
    min=min(RegionX2,Cols-1);
    for(j=leftr;j {
    pArray->get_ValueAsFloat(RegionN,&fV);
    V=(int)fV-1;
    if(V pArray->put_ValueAsFloat(RegionN,V);
    RegionN++;
    }
    }
    }
    }
    }
    X1=X2;Y1=Y2;
    rx1=rx2;ry1=ry2;
    }
    }

    点赞 评论 复制链接分享
  • John_ToStr John_ToDebug 5年前

    调用API函数,获取像素值。存于数组, 循环读取就行呀

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 5年前

    这还不简单么,循环遍历这个数组,根据下标等比例算出坐标,根据坐标计算它在多边形内还是外,然后设置0和1。
    判断是否在多边形内,可以取多边形内一点和这一点得到直线方程,如果有奇数个解,就在内部,否则在外部。

    点赞 评论 复制链接分享

相关推荐