关于多边形填充的问题

starytx 2010-12-16 10:54:44
在做一个矢量图绘制的工作,环境vc6.0 +单文档。遇到如下图所示的一个图形。

已知的参数有大圆的圆心和半径,中空矩形的四个顶点,小圆的圆心和半径。如何构成图中红色部分的多边形并进行有效填充?
...全文
230 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2010-12-17
  • 打赏
  • 举报
回复
这个FloodFile确实很管用,但能不能说说其中那个坐标参数的使用技巧,我采用的是大圆最左边的那个切点往右挪2个像素(按照我给的例子参数,就是(152,300)),我先把那三个分别用PolyLine()勾出线来(颜色就是填充的颜色),然后就用这个FloodFill效果很好。[Quote=引用 10 楼 zgl7903 的回复:]
按大圆 小圆 和矩形绘制,然后 FloodFill
[/Quote]
starytx 2010-12-17
  • 打赏
  • 举报
回复
问题基本解决,解决方法是:得到大圆的多边形顶点数组,CreatePolygon构成多边形区域1,再得到要挖去的多边形区域顶点(本例中的矩形和小圆,可以连在一起)CreatePolygon形成一个区域2,然后区域1联合区域2,联合模式为RGN_DIFF,形成的新的区域1就是挖掉2后的区域,也就是本例的填充区域,然后FillRgn。
10楼的FloodFill也可以,但我发现该方法填充的图形居然可以擦掉!我就是绘制在OnDraw中的,还有就是那个填充起始点不好设定,也许是我的用法不对。感谢您和其他朋友的回复!
starytx 2010-12-16
  • 打赏
  • 举报
回复
呵呵,要是白色我也不用问了。我的方法是先CreatePolygonRgn,然后用FillRgn来填充[Quote=引用 2 楼 happyparrot 的回复:]
要是白色就简单了,先画大圆,再画小圆和矩形......
[/Quote]
starytx 2010-12-16
  • 打赏
  • 举报
回复
忘了说了,白色的部分都是透明的。另外,圆可以以10边形或近似绘制。
先假设参数大圆圆心(300,300),半径150。矩形(270,200),(330,200),(330,350),(270,350),小圆圆心(300,400),半径30
快乐鹦鹉 2010-12-16
  • 打赏
  • 举报
回复
要是白色就简单了,先画大圆,再画小圆和矩形......
快乐鹦鹉 2010-12-16
  • 打赏
  • 举报
回复
中间感叹号是白色还是透明?
zgl7903 2010-12-16
  • 打赏
  • 举报
回复
按大圆 小圆 和矩形绘制,然后 FloodFill
starytx 2010-12-16
  • 打赏
  • 举报
回复
详细说一下我的试验方法和结果吧,
只计算出圆上的10个等分点。首先循环计算大圆的10个点
double fStep = 2*PI/10;  // 间隔弧度
POINT ptCenter1 = {300,300}; // 大圆圆心坐标
POINT ptCenter2 = {300,400}; // 小圆元新坐标
float fRadii1 = 150.0f; // 大圆半径
float fRadii2 = 30; // 小圆半径
CArray<POINT,POINT> m_pt;
// 得到大圆的所有定点
for(double fAngle = 0.0f; fAngle <= 2*PI; fAngle += fStep)
{
m_pt.Add(CPoint(fRadii1*cos(fAngle)+ pCenter1.x ,fRadii1*sin(fAngle)+ pCenter1.y));
if(2*PI - fAngle < fStp)
m_pt.Add(CPoint(fRadii1*cos(0)+ pCenter1.x ,fRadii1*sin(0)+ pCenter1.y));
}
....// 得到矩形的5个顶点(首尾要重合,所以是5个)
// 得到小圆的所有顶点
for(fAngle = 0.0f; fAngle <= 2*PI; fAngle += fStep)
{
m_pt.Add(CPoint(fRadii2*cos(fAngle)+ pCenter2.x ,fRadii2*sin(fAngle)+ pCenter2.y));
if(2*PI - fAngle < fStp)
m_pt.Add(CPoint(fRadii2*cos(0)+ pCenter2.x ,fRadii2*sin(0)+ pCenter2.y));
}

// 再把数组链表中的数据依次装进一个new出的POINT指针中,指针大小为m_pt.GetSize();然后就CreatePolygonRgn,接着FillRgn,这样绘制出的是一个大圆,内部靠下有个掏空的小圆,还差一个矩形要掏空,可如果我在大院和小圆之间插入那个矩形的定点的话图形就会变成,下边的样子

把小圆的顶点代码放在矩形之前还是不对,可是去掉矩形的顶点,两个圆的情况确是对的,为什么加了矩形的几个顶点就会乱呢?
seugiser 2010-12-16
  • 打赏
  • 举报
回复
扫描线啊,从最上扫描到最下面,判断交点,奇数段画,偶数段不画,比如在矩形上面部分只有一段,那就用红线画,矩形和和小圆部分有三段,就第一第三段画,中间一段不画就可以了。
starytx 2010-12-16
  • 打赏
  • 举报
回复
就是说不绘制,只填充红色的部分[Quote=引用 5 楼 sparrow429 的回复:]
透明什么意思啊?不懂
[/Quote]
sparrow429 2010-12-16
  • 打赏
  • 举报
回复
透明什么意思啊?不懂

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧