用GDIplus画小方块,怎么样让这些小方块都在一个外面的大的椭圆里?

万个函数千个类 2012-09-26 06:46:34
请问有谁在MFC里用过GDIplus,我有个问题想请教一下:就是在一个bitmap上用graphics画了个Ellipse,然后想在这个大椭圆里再画很多小方块(大概500个左右),这个方块的坐标是放在数组里的,其中有些方块的坐标是在那个椭圆的外面的。我想让椭圆外的小方块不显示或不画出来。请问这个怎么判断啊?谢了!
代码如下:
//Create Graphics Object from bitmap
int width=920, height=800;

Bitmap bitmap(width,height);
Graphics graphics(&bitmap);

widthX = width*(DieSizeX/WaferSize);
heightY = height*(DieSizeY/WaferSize);

graphics.DrawEllipse(&Pen(Color::Blue,3),0,0,width,height);

//Draw dies in bitmap file
Color frtColor;
Color brdColor(Color::Black);

for (i=0;i<k;i++)
{
StartX = dummydie[i].x*width*(DieSizeX/WaferSize);
StartY = dummydie[i].y*height*(DieSizeY/WaferSize);

if(dummydie[i].bin ==1)
{
frtColor.SetFromCOLORREF(m_PColor);
HatchBrush brush(HatchStyleCross,brdColor,frtColor);
graphics.FillRectangle(&brush, StartX, StartY, widthX, heightY);
}
else
{
frtColor.SetFromCOLORREF(m_FColor);//Fail Bin Color
HatchBrush brush(HatchStyleSphere,brdColor,frtColor);
graphics.FillRectangle(&brush, StartX, StartY, widthX, heightY);
}
}
...全文
206 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
C/C++ code

CRgn EllipticRgn;//椭圆区域
EllipticRgn.CreateEllipticRgn();//创建椭圆区域
for(.....)
{
CRect rc(.....);//小方块矩形
if(!EllipticRgn.RectInRegion(&rc))
{
//小方块的矩形不在椭圆区域内
……
[/Quote]

试了下,好用:-)
我来结分~
邓学彬 2012-09-26
  • 打赏
  • 举报
回复
5楼我发的是使用MFC的CRgn来判断矩形是否在椭圆内.
另外再补充一个使用GDIPlus里的Region来判断的:
GraphicsPath EllipsePath;//声明一个路径变量
EllipsePath.AddEllipse(.....);//往路径添加一个椭圆
Region EllipseRegion(&EllipsePath);//用椭圆路径创建一个区域
for(....)
{
Rect rc(....);//小方块
if(!EllipseRegion.IsVisible(&rc))
{
//小方块的矩形不在椭圆区域内
//画出小方块
}
}


参考:http://msdn.microsoft.com/zh-cn/library/system.drawing.region.aspx






邓学彬 2012-09-26
  • 打赏
  • 举报
回复
CRgn EllipticRgn;//椭圆区域
EllipticRgn.CreateEllipticRgn();//创建椭圆区域
for(.....)
{
CRect rc(.....);//小方块矩形
if(!EllipticRgn.RectInRegion(&rc))
{
//小方块的矩形不在椭圆区域内
//画出小方块
}
}


参考:
BOOL CRgn::RectInRegion( LPCRECT lpRect ) const;
返回值:
如果指定矩形的任何一部分在区域的边界内,则返回非零值;否则返回0。







  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
1.把椭圆方程建立起来
2.圆心到2焦点的距离小于等于y(椭圆最长的两端距离)
3.建立圆方程,与椭圆有1个焦点或者无焦点的保留

满足上述3点就是楼主要的圆
[/Quote]

这个貌似可以的,但是可能有复杂了点,椭圆内方块的4条边都不可以与圆边相交,否则就不画出来。。。

请问能具体些吗?特别是计算焦点那一块。。。谢谢:-)

详细到我可以直接拷贝过去用的话,可以加分...........
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
C/C++ code

GraphicsPath EllipsePath;//声明一个路径变量
EllipsePath.AddEllipse(.....);//往路径添加一个椭圆
Graphics.SetClip(&EllipsePath);//设置裁剪区域
Graphics.FillRectangle(....);//开始画你要的矩形,不会超出EllipsePath
Grap……
[/Quote]

谢谢:-)这个方法很简洁,我试了下,和圆边相交的方块被切割了,可能我的描述不太清楚,我的本意是椭圆内的方块要是完整的,要是与圆相交的话就不画了。。。
不知道有没有更好的办法。。。
邓学彬 2012-09-26
  • 打赏
  • 举报
回复
GraphicsPath EllipsePath;//声明一个路径变量
EllipsePath.AddEllipse(.....);//往路径添加一个椭圆
Graphics.SetClip(&EllipsePath);//设置裁剪区域
Graphics.FillRectangle(....);//开始画你要的矩形,不会超出EllipsePath
Graphics.ResetClip();//释放、清空裁剪区域







傻X 2012-09-26
  • 打赏
  • 举报
回复
1.把椭圆方程建立起来
2.圆心到2焦点的距离小于等于y(椭圆最长的两端距离)
3.建立圆方程,与椭圆有1个焦点或者无焦点的保留

满足上述3点就是楼主要的圆

19,468

社区成员

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

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