求绘制椭圆的函数实现(不是现成的函数)

zhao1zhong6 2009-02-03 09:29:01
这是我写的绘制圆的函数:
//P是一个STL容器(VECTOR)储存了圆的每一个点的坐标
#include <windows.h>
#include <math.h>
#include <vector>
using namespace std;

typedef vector< POINT > VECPT;
VECPT *P;
P= new VECPT;
void Store(POINT pt1,POINT pt2)
{
int dx=abs(pt2.x-pt1.x);
int dy=abs(pt2.y-pt1.y);
int r=sqrt(dx*dx+dy*dy);//半径
int r45=ceil(r*0.70710678);//八分之一

int ve;
POINT pt3;
for (int i=0;i<=r45;i++)
{

ve=ceil(sqrt(r*r-i*i));

pt3.x=pt1.x+i;
pt3.y=pt1.y+ve;
P->push_back(pt3);//将点存入容器
pt3.x=pt1.x-i;
pt3.y=pt1.y+ve;
P->push_back(pt3);
pt3.x=pt1.x+i;
pt3.y=pt1.y-ve;
P->push_back(pt3);
pt3.x=pt1.x-i;
pt3.y=pt1.y-ve;
P->push_back(pt3);
pt3.x=pt1.x+ve;
pt3.y=pt1.y+i;
P->push_back(pt3);
pt3.x=pt1.x-ve;
pt3.y=pt1.y+i;
P->push_back(pt3);
pt3.x=pt1.x+ve;
pt3.y=pt1.y-i;
P->push_back(pt3);
pt3.x=pt1.x-ve;
pt3.y=pt1.y-i;
P->push_back(pt3);
}

}
绘制椭圆我就不会了
...全文
448 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-02-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 laviewpbt 的回复:]
//简单的说就是通过一组点(如8 x 8的点),

请问这一组点的数据是如何得到的啊?得到后要隐射为一个点是取加权平均吗?
[/Quote]
所谓加权计算的方法就是Filter:平均加权就是Boxfilter,当然也有圆锥Filter,效果最好的就是高斯Filter;这在计算机图形学的书中都有;
LS是研究图象学的,图象学和图形学是不同的学科,矢量技术侧重的是图形学的内容,图象学方面我还是门外汉,有机会还要向LS的好好请教;
「已注销」 2009-02-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fyzqzpd 的回复:]
我换了VC2008打开了,不错好东西,不会是你自己搞出来的吧?
[/Quote]
所有算法都是我自己写的(甚至包括内存管理程序),因为并没有使用特别的库,所以事实上可以移植到任何的系统中(我专门规划了一个Platform层,见文档)
zhao1zhong6 2009-02-07
  • 打赏
  • 举报
回复
我换了VC2008打开了,不错好东西,不会是你自己搞出来的吧?
laviewpbt 2009-02-07
  • 打赏
  • 举报
回复
//简单的说就是通过一组点(如8 x 8的点),

请问这一组点的数据是如何得到的啊?得到后要隐射为一个点是取加权平均吗?
「已注销」 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 laviewpbt 的回复:]
倾斜的椭圆也可以借助API函数PolyBezier实现,不过不抗锯齿。
参考:http://tlcheng.twbbs.org/TLCheng/Basic/

http://tlcheng.twbbs.org/TLCheng/Basic/MyStdInclude/Basic/Graphic.txt


tomsoft能给我谈谈抗锯齿的实现过程,你的那些名词我不熟悉。
[/Quote]
Super Sample实际是超采样算法,有些网友也称之为子像素算法;简单的说就是通过一组点(如8 x 8的点),通过Filter计算出实际显示的像素;多数矢量图形引擎,如"开罗",FlashPlayer和我自己的gingkoVG用的都是这个算法;
Box Filter:在将Super Sample的子像素到实际像素的变换涉及到具体的变换方式,目前一般有两种Filter:Box Filter和Gauss Filter;其中高斯Filter的效果最为好,运算点数最少,但运算复杂度最大;所以我使用了Box Filter---虽然效果差些,运算点数也最多,但实际整体效率最好----只是为了更好的效果,我只能选择更高的采样率:我使用的是8 x 8,及实际上屏幕显示的一个点可能是由8 x 8个点变换而来的(实际优化后没有这么大的运算量);
「已注销」 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fyzqzpd 的回复:]
tomsoft 你好,你的项目我下载了,但好像用VC6.0编译不行,能通过但运行不了,提示
应用程序正常初始化失败。
[/Quote]
VC++ 6我没有试过,我用的环境是VC++ 2005,您说问题应该是我第一版本的问题(具体说应该是VC++2005常见问题),您使用修正版本就可以了:http://download.csdn.net/source/328524
或直接从:http://www.hygraphics.com/download/gingkoVG/OpenVG%20Release.zip下载
zhao1zhong6 2009-02-07
  • 打赏
  • 举报
回复
tomsoft 你好,你的项目我下载了,但好像用VC6.0编译不行,能通过但运行不了,提示
应用程序正常初始化失败。
laviewpbt 2009-02-07
  • 打赏
  • 举报
回复
倾斜的椭圆也可以借助API函数PolyBezier实现,不过不抗锯齿。
参考:http://tlcheng.twbbs.org/TLCheng/Basic/

http://tlcheng.twbbs.org/TLCheng/Basic/MyStdInclude/Basic/Graphic.txt


tomsoft能给我谈谈抗锯齿的实现过程,你的那些名词我不熟悉。
zhao1zhong6 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 tomsoft 的回复:]
针对以上算法,我详细描述一下算法,其中有圆到椭圆的变换:
1)计算出您要绘制椭圆到单位圆的变换矩阵;
2)利用Cubic Bezier曲线(针对一个整圆最多用4条Bezier曲线)拟合这个圆----注意这个算法很容易找;当然更多的Bezier曲线可以获得更多的精度,但通常最多4条就足够了,多了会影响效能,也没有必要;
3)利用1)获得的矩阵的逆变换计算Bezier曲线的控制点; 注意这里:仅仅是计算很少的控制点;
4)利用新的控制点通过绘制Cubic Bezie…
[/Quote]
我用容器的目的是为了可以选择。
「已注销」 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 laviewpbt 的回复:]
请问楼上的这个图的边缘抗锯齿是如何坐到的,用了什么算法?有那本书有介绍啊?
[/Quote]

不错,您居然看出我使用了抗锯齿 :)

上边的程序我使用的是最简单的"Super Sample",算法上当然有改进,因为"Super Sample"内存消耗较大;Filter部分使用的是Box Filter;之所以这样主要当时写gingkoVG时效能优先,同时考虑到应用到嵌入系统;
只是当前使用的是8 x 8的Super Sample----为了保证质量
「已注销」 2009-02-07
  • 打赏
  • 举报
回复
针对以上算法,我详细描述一下算法,其中有圆到椭圆的变换:
1)计算出您要绘制椭圆到单位圆的变换矩阵;
2)利用Cubic Bezier曲线(针对一个整圆最多用4条Bezier曲线)拟合这个圆----注意这个算法很容易找;当然更多的Bezier曲线可以获得更多的精度,但通常最多4条就足够了,多了会影响效能,也没有必要;
3)利用1)获得的矩阵的逆变换计算Bezier曲线的控制点; 注意这里:仅仅是计算很少的控制点;
4)利用新的控制点通过绘制Cubic Bezier曲线绘制需要的椭圆或圆弧;

注意到楼主的算法大量使用了容器,不认为是个好主意;同时计算中大量的sqrt也是一大忌讳;

好了相信应该没什么问题了吧
laviewpbt 2009-02-07
  • 打赏
  • 举报
回复
请问楼上的这个图的边缘抗锯齿是如何坐到的,用了什么算法?有那本书有介绍啊?
「已注销」 2009-02-07
  • 打赏
  • 举报
回复

以上图形的算法是完全自己编写的,具体样例从我的资源中下载;
基本思路:使用Cubic Bezier曲线或样条曲线就可以拟合出标准的圆,再将圆变换成椭圆就可以了;因为Cubic Bezier在运算时代价最小,所以不推荐使用样条曲线
另外除了书籍外,多数矢量图形算法中都会涉及圆和椭圆算法,基本上都是以Cubic Bezier曲线进行拟合,如我自己写的gingkoVG
cofanz 2009-02-04
  • 打赏
  • 举报
回复
推荐一个网站http://antigrain.com
#Page# 2009-02-04
  • 打赏
  • 举报
回复
帮你顶,turbo c吗?看来你的项目不单用在windows啊。
csgdseed 2009-02-04
  • 打赏
  • 举报
回复
up
sixmiles 2009-02-04
  • 打赏
  • 举报
回复
好好看看图形学上的书吧,基本上每一本图形学都有相关的描述,要代码也可以上www.codeproject.com看看,很多开源的代码
梧桐168 2009-02-04
  • 打赏
  • 举报
回复
Codeguru上有拿bezier曲线绘制斜椭圆的例子,
jxufeng 2009-02-03
  • 打赏
  • 举报
回复
应该就是填充点的算法,要考虑曲线中间点的位置以及线宽的绘制方法,好像很多关于图形编程的书籍里有介绍
cnzdgs 2009-02-03
  • 打赏
  • 举报
回复
可以用极坐标系,变换角度计算出各个点的坐标,再转换为直角坐标。
加载更多回复(1)

19,464

社区成员

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

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