圆填充算法
① 圆形 最大利用率问题
这是从你遇到的问题中提出的数学模型吧。但是你到底想要什么呢?1.既然有大小之分那么N≥2,既然要小远直径最大那么只好等于2了;2.你的提问又要求最大利用率,如wade_freedom 回答一样,小圆越小越好,N无穷大。1和2是矛盾的,因此你的问题本身就有问题。
② 计算机图形学 问题 中点圆算法和扫描线算法
写个文档解释一下。
③ 区域填充算法可以填充圆吗
可以的。在圆规则范围之内,由圆心至圆上,任意两条线段(半径)之间,可以用扇形填充并进行计算。
④ 矩形长宽比变化时矩形里能放最多的圆或者正多边形(正多边形面积和圆相同),要写出函数表达式
⑤ MFC区域填充
无论是对什么图形进行填充,或者构造任何区域,其本质就是将这片区域的每一个像素的属性表达出来。。。
既然你已经确认了5个点的坐标,那么就是平常人们用手来画五角星的过程,你应该是会的。一共画5笔,从最左边的点开始,先到最右边的点,再到左下角的点,再到最上面的点,再到右下角的点,最后返回最左边的点把图形闭合。如此用LineTo()将五角星闭合。
如此一来,就会形成6个闭合的图形,分别是5个以5个点为一点的三角形,和中心的5边型。将这5个图形中的所有像素全部填充为红色即可。
填充的算法有很多,像是三角形和矩形,都有现成的API进行填充。对于中间的五边形,可以采用矩阵边缘检测的方法取得空白矩阵向量然后填色(这也是最有效的算法);也可以采用接近逼近法来填充,就是在五边形的内部生成无数个红色的小三角形,将五边形填充满;也可以采用覆盖法来填充(前提是正五角星),就是用数学公式算出五角星的内接圆,把这个圆形填充为红色即可。
我建议你将整幅画布按照矩阵的方式进行操作,最后用BitBlt扫描到前台,这些操作都会异常简单。。。
⑥ 画圆为什么要用Bresenham算法
算法引入的本意是解决像素填充的问题的
点和线这种东西在理论上都是没有宽度的,但是要在屏幕上绘制的时候就要去填充像素以形成痕迹
一行上经常有2个以上的像素都被线所贯穿, 如何填充是个问题
而且像素填充本身是使用非常频繁的需求,故而画线的算法效率是非常重要的,对整个系统影响巨大
Bresenham算法是通过增量计算的方式快速判别下一个行或者列上的要填充的像素的位置,从计算上来说非常的节省,几乎都是整数的算法,速度非常的快
⑦ MATLAB编程问题,要在一个400*400矩形框里随机的填充圆,要求不能重叠,已知圆的个数N和所有半径Ri。
N=30;%填充30个
b=round(10+20*rand(1,N));%30个圆半径在10~30之间(这里用随机数产生)
S=[400,400];%区域大小
%以上是给定的条件,根据你自己的数据给出
%不过根据半径数据的大小,N不能太大
%要不然可能要化很多时间,或者找不到填充位置进入死循环
p=b(1)+(S-2*b(1)).*rand(1,2);%差生一个随机点
A=p';%第一点坐标记录进矩阵A中
t=0:360;
plot([040040000],[004004000]);holdon%画区域方框
forii=2:N
p=b(ii)+(S-2*b(ii)).*rand(1,2);%产生一个新随机点
whileany((A(1,:)-p(1)).^2+(A(2,:)-p(2)).^2<((b(1:ii-1)+b(ii)).^2))
p=b(ii)+(S-2*b(ii)).*rand(1,2);
end%根据距离判断新的点是否和所有旧的点距离都满足条件
%如果有一点不满足条件,重新生成随机点,知道完全满足条件
A=[A,p'];%保存新的点到矩阵A中
patch(p(1)+b(ii)*cosd(t),p(2)+b(ii)*sind(t),'r');%填充一个圆
end
holdoff
axisequal
axis([-50450-50450]);
A=[b;A];
%最终A是3xN的矩阵,第一行是半径,第二行是x坐标,第三行是y坐标
以下是某次填充的结果
不过这个填充的算法并不健壮,
当圆的半径较大,或者要填的N数目较多时
留下的缝隙太小,以至随机产生的坐标经常失败
甚至很可能留下缝隙不足以再填圆,最终进入死循环
⑧ openGL中的glReadPixels函数问题
了解下glReadPixels参数的含义:
void glReadPixels( GLint x, GLint y, GLsizei width,GLsizei height, GLenum format, GLenum type, GLvoid *pixels) ;
前面几个参数指定读取的位置尺寸以及格式, 最后一个参数用来返回结果, 所以像素数据自然是读到pixels中。