计算机图形学初步

华南理工大学 梁宇正

老师教的直线段Bresenham扫描转换算法中直线段的两端均为整数,那么这里也同样假设 $c_x, c_y ,r $均为整数。公式推导时需要使用的是与圆心的相对坐标,所以只考虑圆心在原点的情况,其他情况只需要进行一个坐标偏移。

\([\frac{\pi}{4},\frac{\pi}{2}]\) 的圆弧段中,圆切线的斜率范围为 \([-1,0]\) ,仿照直线段Bresenham扫描转换算法,每次 \(x_{i+1}=x_i+1\) ,而因为斜率的范围的原因,所以 \(y_{i+1}\) 只有两种取法:\(y_{i+1}=y_i\)\(y_{i+1}=y_i-1\)

考虑即将点亮的两个像素与圆的位置关系。一共有4种情况

当圆恰好穿过其中一个点时,点亮对应的点即可。

当两个点都在圆外时,\(y_i-1\) 的误差显然更小,选择 \(y_{i+1}=y_i-1\)
当两个点都在圆内时,\(y_i\) 的误差显然更小,选择 \(y_{i+1}=y_i\)

最后一种情况,点 \((x_i+1,y_i-1)\) 在圆内,而 \((x_i+1,y_i)\) 在圆外,比较他们与圆的误差关系。

首先我选择的“误差”是指点亮的点到圆心的距离与半径r的差的绝对值:

圆外的点 \((x_i+1,y_i)\) 满足
$dH= \sqrt{(x_i+1)^2+y_i^2} - R $
圆内的点 \((x_i+1,y_i-1)\) 满足
\(dL= R - \sqrt{(x_i+1)^2+(y_i-1)^2}\)

仿照直线段Bresenham扫描转换算法,现在要比较 \(dH\)\(dL\) 的大小关系,作差
判别式为

\(\Delta = dH- dL= \sqrt{(x_i+1)^2+y_i^2} + \sqrt{(x_i+1)^2+(y_i-1)^2} - 2R\)

这个方法到这里我就做不下去了,貌似没有办法再化简了,而上面的方程和暴力使用方程计算没有分别。

考虑到两个像素实际上只有1个 \(y\) 坐标的差异,所以一个点在圆内一个点在圆外时,点到圆心的距离与半径 \(r\) 的差必定不超过1。

因为在 \(x_1∈[0,1]\) ,且 \(x_2∈[0,1]\) 时,假如 \(x1>x2\) 必有 \(x1^2>x2^2\) ,根据这个性质我认为可以改作比较点到圆心的距离与半径 \(r\) 的差的平方。

最后我把“误差”定为点亮的点到圆心的距离的平方与半径 \(r\) 的平方的差,则有:

圆外的点 \((x_i+1,y_i)\) 满足
\(dH= (x_i+1)^2+y_i^2 – R^2\)
圆内的点 \((x_i+1,y_i-1)\) 满足
\(dL= R^2 - (x_i+1)^2-(y_i-1)^2\)

仿照直线段Bresenham扫描转换算法,现在要比较 \(dH\)\(dL\) 的大小关系,作差,判别式为

\(\Delta = dH- dL= (x_i+1)^2+y_i^2 + (x_i+1)^2+(y_i-1)^2 - 2R^2\)

定义第 \(i\) 个点有 \(p_{i}= x_i^2+y_i^2 – 2R^2\)

则上式可化简为
\(\begin{align} \Delta&= x_i^2+2x_i+1+y_i^2 +x_i^2+2x_i+1+y_i^2-2y_i+1 - 2R^2\\ &=2p_i+4x_i -2y_i+3\\ \end{align}\)

那么根据 $\Delta $ 的符号就可以确定选择哪个点了。但是看起来还是有多余的计算,设一个 \(q_i=2p_i+4x_i -2y_i\) ,那么只需要比较 \(\Delta=q_i+3\) 的符号就可以了。

再考虑如何从 \(q_i\) 推导出 \(q_{i+1}\)

当选择点 \((x_i+1,y_i)\) 时,得

新的点:
\(\begin{align} q_{i+1}&=2((x_i+1)^2+y_i^2 – 2R^2)+ 4(x_i+1)-2y_i\\ &=2x_i^2+2 y_i^2+8 x_i-2y_i+6-4R^2 \end{align}\)

旧的点:
\(\begin{align} q_{i}&=2p_i+4x_i -2y_i\\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i\\ \end{align}\)

两式作差得:
\(q_{i+1}- q_{i}=4x_i+6=4x_{i+1}+2\)

当选择点 \((x_i+1,y_i-1)\) 时,得

新的点:
\(\begin{align} q_{i+1} &= 2((x_i+1)^2+(y_i-1)^2 – 2R^2)+ 4(x_i+1)-2(y_i-1)\\ &=2 x_i^2+2 y_i^2+8 x_i-6y_i+10-4R^2 \end{align}\)

旧的点:

\(\begin{align} q_i&=2p_i+4x_i -2y_i\\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i \end{align}\)

两者作差得:
\(q_{i+1}- q_{i}=4x_i-4y_i+10=4x_{i+1}-4y_{i+1}+10\)

转载于:https://www.cnblogs.com/Inko/p/11552889.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 1.Please download and install the glut library. 2.Write a complete program using the following codes to draw a Sierpinski gasket. void myinit() { // attributes glClearColor(1.0,1.0,1.0,1.0); glColor3f(1.0,0.0,0.0); // set up viewing glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 50.0,0.0,50.0); glMatrixMode(GL_MODELVIEW); } void display() { GLfloat vertices[3][3] = {{0.0,0.0,0.0}, {25.0, 50.0,0.0}, {50.0,0.0,0.0}}; // an arbitrary triangle in the plane z = 0; GLfloat p[3] = {7.5, 5.0, 0.0}; // or set any desired initial point which is inside the triangle; int j,k; int rand(); glBegin(GL_POINTS); for (k = 0; k < 5000; k++) { /* pick a random vertex from 0, 1, 2*/ j = rand()%3; // compute new location; p[0] = (p[0]+vertices[j][0])/2; p[1] = (p[1]+vertices[j][1])/2; // display new point glVertex3fv(p); } glEnd(); glFlush(); } #include void main(int argc, char **argv) { glutInit(&argc;, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitAWindowSize(500,500); glutInitWindowPosition(0,0); glutCreateWindow(“Simple OpenGL Example”); glutDisplayFunc(display); myinit(); glutMainLoop(); } 3.实现 DDA 和 Bresenham 画线算法 (1)画10万以上随机生成的直线段,比较两个算法的平均时间. (2)分别把屏幕上的1*1,5*5, 9*9像素当作直线段上的一个点,观察线段的走样情况. 二、 请写一个OpenGL (如果熟悉WebGL也可以用)程序完成如下任务 (1)读入三维网格模型的obj文件; (2)用OpenGL函数glTranslatef()对模型模型进行平移,使得其重心位于原点; (3)用函数glLookAt()设置视点,并且要求试点绕模型一周,以便用透视投影观察各个侧面; (4)要求利用真实感绘制对模型进行渲染. (利用OpenGL函数设置光源,材质,计算好每个三角形的法向量后,利用OpenGL的glNormal函数给待绘制的三角形设置法向量). 绘制的结果大概如下: 三、 本实验为综合实验, 任务是利用光线跟踪算法进行Whitted全局光照计算,并对读入场景进行真实感绘制。(特别提醒: 网上类似的projects可以参考,但不能照抄. 如http://tobias.isenberg.cc/graphics/LabSessions/RaytracingProject, http://physbam.stanford.edu/links/ray_tracing/project_ray_tracing.html https://www.cs.utexas.edu/~fussell/courses/cs354/assignments/raytracing/handout.shtml ) (1)参加对象: 本实验针对所有选课同学,3-5人组成一个小组,共同实现;非15级同学在组队方面有困难的话可与老师沟通. (2)实验结果提交: 每人都要求提交一份. 内容包括 a.源程序; 可执行代码; 三维场景数据; 同组的同学这部分可以相同. b.实验报告; c.ppt一份, 应该有绘制结果的视频展示. (3)功能方面的基本要求: a.实现光线跟踪算法, 能利用Whitted光照模型对场景进行渲染; (optional) 通过亚像素采样实现反混淆. b.材质: 支持环境光、漫反射、高光反射、透射等光学现象; (optional)支持纹理绘制可加分. c.光源: 在场景中至少有一个点光源, 支持阴影; (optional)增加点光源数可加分). d.场景: 支持圆和三角网格模型; (optional)增加椭圆、参数曲面可加分. e.输入输出:读入网格模型文件,保存渲染图像成位图格式(bmp),渲染图像的大小可通过参数调节;(optinal)可读入mtl材质库文件. f.加速:利用空间划分(八叉树或BSP)进行加速.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值