【高分再求】如何在OpenGL中画椭圆??

yf2100 2004-10-21 01:56:53

好像没有相关的函数,用gluDisk倒是可以画出来圆环,但是椭圆的问题还是没有解决:(

请路过的高手赐教咯~
...全文
993 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yf2100 2004-10-29
  • 打赏
  • 举报
回复
多谢楼上的各位了,尤其是mangw()(虽然我没有看懂):)

结贴咯~
mangw 2004-10-23
  • 打赏
  • 举报
回复
用贝塞曲线模拟:

(原文是codeguru上面的,你去搜索一下源码,下面的是译文)

图形旋转和歪斜的椭圆


作者:Llew S. Goodstadt  编译:Touch
 介绍
 窗口中的矩形,带圆角的矩形和椭圆只能由GDI在轴向上绘制。假如有人希望在
Windows NT下绘制旋转或歪斜的图形,他可以使用世界坐标系变换。很不幸的是
在Windows 95/98下,是没有世界坐标系变换的。作为一个跨平台的解决方案,
就需要自己做更多的工作。矩形能由四边形模拟,这样它就能旋转和歪斜了。然
而,椭圆又该怎么办呢?基本上有三个选择
 两种选择
 使用一个定制的函数来画椭圆。
 椭圆的数学模型相对简单,而且还有用于在标准文本中旋转椭圆的修改过的
Bresenham方程。然而,这种方法必须自己执行光栅操作,这样在绘制宽线时
就变得复杂了。这种努力只有在向一个脱离屏幕的表面(比如DirectDraw)或
位图上绘制视才是值得的
 用连接的线段来绘制椭圆。
 实际的线条可以通过LineTo(...)或Polyline(...)图形设备接口调用。你可
以自己完成椭圆的近似,或者使用GDI的FlattenPath(...) 函数
 使用贝塞尔曲线来近似绘制椭圆。
 这里就举例说明这种方法。
 用贝塞尔曲线绘制椭圆
 使用四条贝塞尔曲线,每条代表原轴向椭圆的90度,这样就能获得一个相当
近似的椭圆,最大误差只有0.027%。这个最大误差相当于长径3700的椭圆的误
差小于一个像素,这已经超出我们所要求的准确度了。
 优点
 简单。
 只需要有四个GDI调用。贝塞尔曲线控制点的计算代价是很小的。
 快速
 你可以利用现在新的显卡对曲线绘制的硬件支持。在我的系统上,这和调用
GDI函数Ellipse(...)绘制椭圆的速度比,如果不是更快,至少也是一样快。
 变化
 因为贝塞尔曲线在旋转、缩放和平移时是不变的,在对椭圆做同样的变化时
就只需要传送控制点。更巧的是,因为在一个三次贝塞尔曲线上的每个点都是
控制点的重心组合,在仿射映射中曲线上控制点之间的关系是不变的。
 设备无关性
 假如想自己把椭圆转化为线段或光栅,那么每次表面的分辨率和设备描述
表改变时(例如向一个打印机设备描述表绘制时),就必须重新光栅化。而
使用贝塞尔曲线时就不需要这样做。还有一个好处就是椭圆能通过图元文件
输出到绘画程序,例如CORELDRAW,在其中可以没有失真的缩放图形。
 过程
 首先以一个轴向椭圆的外接边界矩形开始(使用一个普通的GDI调用)。
13个定义4条组成椭圆的贝塞尔曲线的控制点(以下标为0-12)可使用一
个经验常量计算得出。下列代码为Y轴正方向向下的的映射模式产生控制点
(例如MM_TEXT)。在Y轴正方向向上时,只要如注释中所示,把偏移量设
为负值就行了。
 // Create points to simulate ellipse using beziers
//使用贝塞尔曲线创建点,模拟椭圆
void EllipseToBezier(CRect& r, CPoint* cCtlPt)
  // MAGICAL CONSTANT to map ellipse to beziers
  //
/3*(sqrt(2)-1)
  // 把椭圆映射为贝塞尔曲线的常量 2/3*(sqrt(2)-1)
  const double EToBConst =
.2761423749154;
  CSize offset((int)(r.Width() * EToBConst), (int)(r.Height() * EToBConst));
// Use the following line instead for mapping systems where +ve Y is upwards
// 在Y轴正方向向上时,使用下面一行
// CSize offset((int)(r.Width() * EToBConst), -(int)(r.Height() * EToBConst));
  CPoint centre((r.left + r.right) / 2, (r.top + r.bottom) / 2);
  cCtlPt[0].x =              //------------------------/
  cCtlPt[1].x =              //            /
  cCtlPt[11].x =              //    2___3___4    /
  cCtlPt[12].x = r.left;          //   1       5  /
  cCtlPt[5].x =              //   |       |  /
  cCtlPt[6].x =              //   |       |  /
  cCtlPt[7].x = r.right;          //   0,12     6  /
  cCtlPt[2].x =              //   |       |  /
  cCtlPt[10].x = centre.x - offset.cx;   //   |       |  /
  cCtlPt[4].x =              //  11       7  /
  cCtlPt[8].x = centre.x + offset.cx;   //    10___9___8    /
  cCtlPt[3].x =              //            /
  cCtlPt[9].x = centre.x;         //------------------------*
  cCtlPt[2].y =
  cCtlPt[3].y =
  cCtlPt[4].y = r.top;
  cCtlPt[8].y =
  cCtlPt[9].y =
  cCtlPt[10].y = r.bottom;
  cCtlPt[7].y =
  cCtlPt[11].y = centre.y + offset.cy;
  cCtlPt[1].y =
  cCtlPt[5].y = centre.y - offset.cy;
  cCtlPt[0].y =
  cCtlPt[12].y =
  cCtlPt[6].y = centre.y;
Rotation of the Ellipse can be accomplished using code similar to:
使用与下面近似的代码可完成椭圆的旋转
// LDPoint is an equivalent type to CPoint but with floating point precision
// LDPoint是一个和CPoint相当的类型,不过它还具有浮点精度。
void Rotate(double radians, const CPoint& c, CPoint* vCtlPt, unsigned Cnt)
  double sinAng      = sin(radians);
  double cosAng      = cos(radians);
  LDPoint constTerm(   c.x - c.x * cosAng - c.y * sinAng,
              c.y + c.x * sinAng - c.y * cosAng);
  for (int i = Cnt-1; i>=0; --i)
  {
    vCtlPt[i] = (LDPoint(  vCtlPt[i].x * cosAng + vCtlPt[i].y * sinAng,
                -vCtlPt[i].x * sinAng + vCtlPt[i].y * cosAng) + constTerm).GetCPoint();
  }
// Create Ellipse
// 创建椭圆
CRect rect; GetClientRect(&rect);
CPoint ellipsePts[13];
EllipseToBezier(ellipseR, ellipsePts);
// Rotate
// 旋转
Rotate(m_Radians, midPoint, ellipsePts, 13);
Filled Ellipses
Of course, four bezier curves together only make up the outline of an ellipse, whether rotated or not. Thankfully, Win32 Path functions are there for filled ellipses. One only needs to enclose the PolyBezier(...) call in a Path Bracket. The resulting path can be stroked and filled to one's satisfaction. If one is feeling adventurous, further special fills like gradients, custom bitmaps or fractals etc. can be achieved by first setting the clipping region to the path via SelectClipPath(...).
填充椭圆
当然,无论是不是旋转,四条贝塞尔曲线只完成了椭圆的轮廓。幸运的是,
Win32路径功能可用于填充椭圆。你只在需要调用PolyBezier(...)来封闭路径。
完成的路径是一笔画出的,而且能被让人满意的填充。假如有人觉得还不够,
比如更特殊的填充,比如斜线、用户位图或不规则碎片等。这些能由
SelectClipPath(...)来把剪贴区域设置到路径上来而获得。
dc.BeginPath();
dc.PolyBezier(ellipsePts);
dc.EndPath();
dc.StrokePath;
// or FillPath();
// or StrokeAndFillPath();
// or PathToRegion(dc.m_hDC);
//
//或者 FillPath();
//或者StrokeAndFillPath();
//或者PathToRegion(dc.m_hDC);
 在Win95/8下宽的虚线或点椭圆轮廓
 Win95/8只支持实体宽线。然而,虚线或点椭圆轮廓能容易的由一系列贝塞尔曲
线段模拟。
chery2010 2004-10-23
  • 打赏
  • 举报
回复
顶!!
yf2100 2004-10-23
  • 打赏
  • 举报
回复
回复人: chonboy(一只来自南方的羊) ( ) 信誉:100 2004-10-22 12:00:00 得分: 0


http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=185182


============================================

圆弧!=椭圆
chonboy 2004-10-22
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=185182
hy1080 2004-10-22
  • 打赏
  • 举报
回复
帮顶
happyct 2004-10-22
  • 打赏
  • 举报
回复
好像很有难道,帮你UP
yf2100 2004-10-22
  • 打赏
  • 举报
回复
每人知道?

:(

我自己顶
VTK用户指南 版本4.0 William J. Schroeder 1998-2000 第一部分 VTK 介绍 第1章 欢迎 机构-----------------------------------------------------------------------------------------------8 怎样使用VTK----------------------------------------------------------------------------------8 附加资源-----------------------------------------------------------------------------------------8 第2章 安装 2.1 概述-----------------------------------------------------------------------------------------------9 2.2 安装VTK到Windows9x/NT/ME/2000/XP------------------------------------------------9 二进制安装-------------------------------------------------------------------------------------9 源代码安装-------------------------------------------------------------------------------------9 2.3 安装VTK到Unix操作系统 源代码安装------------------------------------------------------------------------------------10 运行CMake------------------------------------------------------------------------------------11 编译源代码 建立VTK多平台 安装VTK 第3章 系统概述 3.1 系统设计---------------------------------------------------------------------------------------12 图形模型--------------------------------------------------------------------------------------13 可视化模型-----------------------------------------------------------------------------------15 3.2 创建一个应用---------------------------------------------------------------------------------19 用户方法、对象和命令--------------------------------------------------------------------19 Tcl----------------------------------------------------------------------------------------------19 C++---------------------------------------------------------------------------------------------20 Java Phthon Visual Basic/COM/ActiveX 3.3 在两种语言间转换 第二部分 通过例子学习VTK 第4章 基础 4.1 创建1个简单的模型-------------------------------------------------------------------------24 程序化源对象---------------------------------------------------------------------------------24 读取源对象------------------------------------------------------------------------------------26 4.2 使用VTK交互器-----------------------------------------------------------------------------27 vtk绘制窗口交互器 交互风格 4.3 滤波数据---------------------------------------------------------------------------------------29 4.4 控制相机---------------------------------------------------------------------------------------30 安装相机 简单操作方法 控制视角方向 透视与正交视 保存与恢复相机状态 4.5 控制光线---------------------------------------------------------------------------------------32 位置光 4.6 控制3D道具-----------------------------------------------------------------------------------32 指定vtk道具3D位置 演员 演员的详细级 装配 体 vtk装载3D道具 4.7 作用纹理---------------------------------------------------------------------------------------37 4.8 拾取---------------------------------------------------------------------------------------------38 vtk装配路线 例子 4.9 vtk坐标和坐标系---------------------------------------------------------------------------40 4.10 控制vtk演员2D----------------------------------------------------------------------------41 4.11 注释--------------------------------------------------------------------------------------------41 2D注释 3D注释和vtk跟踪 4.12 特殊绘图类-----------------------------------------------------------------------------------44 尺度棒 X-Y绘制 边界盒轴 标记数据 4.13 变换数据--------------------------------------------------------------------------------------48 高级变换 第5章 可视化技术 5.1 可视化VTK数据集vtkDataSet(和子类) -------------------------------------------------50 使用数据属性进行工作 颜色映射 轮廓化 浮雕化 流线图 流线表面 剪裁 融合数据 附加数据 用另外一个尺度给等值面赋颜色 抽取单元格子集 抽取单元格作为多边形数据 5.2 可视化多边形数据---------------------------------------------------------------------------67 手工产生多边形数据 产生表面当量 十比一抽取 平滑网格 粘贴数据 产生纹理坐标 5.3 可视化结构网格-----------------------------------------------------------------------------74 手工产生结构化网格 抽取计算平面 结构网格子样化 5.4 可视化直线网格-----------------------------------------------------------------------------76 手工产生VTK直线网格 抽取计算平面 5.5 可视化非结构网格--------------------------------------------------------------------------77 手工产生VTK非结构网格 抽取部分网格 非结构网格轮廓化 第6章 可视化图像和体数据 6.1 VTK结构化点的历史表示-----------------------------------------------------------------80 6.2 手工产生VTK图像数据-------------------------------------------------------------------80 6.3 抽取图像数据子样--------------------------------------------------------------------------81 6.4 基于尺度值的弯曲--------------------------------------------------------------------------83 6.5 图像显示--------------------------------------------------------------------------------------83 图像观察者 图像演员 6.6 图像源-----------------------------------------------------------------------------------------85 2D帆布图像源 3D椭圆体图像源 高斯图像源 网格图像源 噪声图像源 正弦曲线源 6.7 图像处理--------------------------------------------------------------------------------------88 梯度化 高斯平滑 直方图 图像逻辑 重新切片 6.8 体绘制-----------------------------------------------------------------------------------------92 一个简单的例子 为什么会有多种体绘制技术? 产生一个VTK体 使用片层化函数 使用颜色变换函数 在一个体属性中控制颜色和透明度 在一个体属性中控制阴影 产生一个体映射 裁剪一个体 粘贴一个体 对一个体应用3D纹理 控制标准编码 体素光线计算 2D纹理映射 VolumePro绘制硬件 速度和精确度交替使用 使用vtkLODProp3D改善性能 可行性/局限性技术 第7章 建立模型 7.1 隐模型----------------------------------------------------------------------------------------114 定义隐函数 对隐函数进行抽样 7.2 挤压-------------------------------------------------------------------------------------------117 7.3 构建表面-------------------------------------------------------------------------------------119 Delaunay三角形化 高斯油彩 无组织点产生表面 第三部分 VTK研发者指南 第8章 数据接口和其他 8.1 读入器----------------------------------------------------------------------------------------130 多边形数据读入器 图像和体素读入器 数据集读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.2 写入器----------------------------------------------------------------------------------------131 多边形数据读入器 图像和体素读入器 结构化网格读入器 线性网格读入器 非结构化网格读入器 8.3 输入者----------------------------------------------------------------------------------------132 8.4 输出者----------------------------------------------------------------------------------------132 8.5 创建硬拷贝----------------------------------------------------------------------------------132 保存图像 保存大(高分辨率)图像 8.6 产生动画(使用样条) -----------------------------------------------------------------------134 8.7 使用现场数据工作--------------------------------------------------------------------------136 第9章 贡献编码 9.1 编码补偿--------------------------------------------------------------------------------------141 为VTK贡献编码的条件 编码风格 如何贡献编码 9.2 标准方法: 创建和消除对象---------------------------------------------------------------142 9.3 拷贝对象和受保护的方法------------------------------------------------------------------143 9.4 写一个VTK类: 综述-----------------------------------------------------------------------144 找到一个相似类 识别一个超类 单个类Per.h 文件 必需的方法 文档编码 使用SetGet宏 向VTK中添加类 9.5 对象工厂--------------------------------------------------------------------------------------145 综述 如何写一个工厂 如何安装一个工厂 例子工厂 第10章 流水线执行管理 10.1 执行过程--------------------------------------------------------------------------------------151 概述和术语 更新信息通道 传播更新扩展通道 触发异步更新通道 更新数据通道 10.2 使用流---------------------------------------------------------------------------------------162 第11章 VTK数据对象接口 11.1 数据组---------------------------------------------------------------------------------------166 方法 11.2 数据集---------------------------------------------------------------------------------------169 11.3 VTK数据集接口---------------------------------------------------------------------------170 方法 例子 11.4 VTK图像数据接口-----------------------------------------------------------------------174 方法 例子 11.5 VTK点集接口-----------------------------------------------------------------------------176 方法 例子 11.6 VTK结构化网格接口---------------------------------------------------------------------178 方法 例子 11.7 VTK线性网格接口-----------------------------------------------------------------------178 方法 例子 11.8 VTK多边形数据接口---------------------------------------------------------------------179 方法 例子 11.9 VTK非结构化网格接口-----------------------------------------------------------------184 方法 例子 11.10 单元格接口(VTK单元格子类) ------------------------------------------------------185 11.11 其他接口----------------------------------------------------------------------------------187 点 单元格数组 单元格类型 单元格连接 11.12 现场和属性数据接口------------------------------------------------------------------193 现场数据方法 数据集属性方法 第12章 如何写一个过程方法 12.1 概述----------------------------------------------------------------------------------------196 永远不要修改输入数据 参考计数数据 使用Debug宏 回收/删除截入的内在 修改时间 过程事件和异常终止执行 12.2 如何写一个绘图过滤器---------------------------------------------------------------199 概述 简单过滤器 复杂过滤器和流水线执行 抽取绘图过滤器 程序过滤器 重载流水执行方法 12.3 如何写一个图像过滤器---------------------------------------------------------------210 实现一个图像过滤器 第13章 用窗口系统集成 13.1 绘制窗口交互风格--------------------------------------------------------------------------216 13.2 GUI交互的总指导线------------------------------------------------------------------------217 13.3 X Window, Xt, and Motif--------------------------------------------------------------------221 13.4 MS Windows/Microsoft Foundation Classes---------------------------------------------226 13.5 Tcl/Tk-------------------------------------------------------------------------------------------227 13.6 Java 第14章 编码资源 14.1 对象图表--------------------------------------------------------------------------------------230 基础 单元格 数据集 流水线 源 过滤器 映射器 图形 体绘制 成像 OpenGL绘制器 拾取 变换塔形结构 14.2 过滤器总结-----------------------------------------------------------------------------------237 可视化过滤器 映射者对象 演员对象 14.3 VTK文件格式--------------------------------------------------------------------------------244 二进制文件 数据集属性格式 例子 第15章 光盘 15.1 源代码 15.2 例子代码 15.3 Window 9x/NT/ME/2000/XP 预编译二进制 15.4 数据 15.5 文档 15.6 退化测试图像 15.7 Kitware 应用

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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