最小包围圆课件资料.docx
《最小包围圆课件资料.docx》由会员分享,可在线阅读,更多相关《最小包围圆课件资料.docx(17页珍藏版)》请在冰豆网上搜索。
最小包围圆课件资料
《C程序设计》
课程设计报告
(2014—2015学年第二学期)
题目:
最小包围圆问题
学院:
电气与电子工程学院
班级:
电气1309
学号:
********09
**********
*******
时间:
起2015.4.27止2015.4.30
一、课程设计基本信息
课程代码:
05190124
课程名称:
计算机基础课程设计
课程英文名称:
Computer-basedCourseDesign
课程所属单位(院(系)、教研室):
数学与计算机学院计算机基础课程群
课程面向专业:
食品科学与工程学院、机械工程学院、电气与电子工程学院、土建学院、动物科学与营养工程学院、化学与环境工程学院、工商管理类、国际经济与贸易、旅游管理、金融学、行政管理、汉语言文学、英语、护理学、康复治疗专业、生物科学类、制药工程、制药工程(生物制药)、药物制剂、物流管理
课程类型:
必修课
先修课程:
大学计算机基础通识选修课程、程序设计课程
学分:
1总学时:
1周
二、课程设计目标
掌握所学语言程序设计的方法,熟悉所学语言的开发环境及调试过程,熟悉所学语言中的数据类型,数据结构、语句结构、运算方法,巩固和加深对理论课中知识的理解,提高学生对所学知识的综合运用能力。
通过综合设计要求达到下列基本技能:
1.培养查阅参考资料、手册的自学能力,通过独立思考深入钻研问题,学会自己分析、解决问题。
2.通过对所选题目方案分析比较,确立方案,编制与调试程序,初步掌握程序设计的方法,能熟练调试程序。
3.系统设计编程简练,可用,功能全面,并有一定的容错能力。
用户界面良好,有较好的输出功能。
在完成课题基本要求后,具有创新型设计,具有一定的实用价值。
4.根据个人的设计调试过程,撰写设计报告。
三、课程设计内容
熟练掌握所学语言的基本知识:
数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。
进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。
四、课程设计要求
1.要求每个同学都要认真对待,积极参与。
2.课程设计结束时,提交完成的所有源程序、相关文件和可执行文件。
同时填写并完成《课程设计报告册》。
3.不符合要求的程序、设计报告、抄袭的设计报告或源程序代码、在设计中完全未参与的将作不及格处理。
五、考核方式
指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,百分制计算,具体考核标准主要包含以下几个部分:
1.程序运行情况20分
2.程序功能的完善程度10分
3.程序结构的合理性10分
4.对问题的答辩情况20分
5.创新情况10分
6.学生的工作态度与独立工作能力10分
7.设计报告内容的规范性20分
备注:
1.按规定时间填写各阶段文档,学习态度加5分
2.设计报告内容雷同扣40分,无调试过程问题分析扣10分,无参考文献扣10分
3.源程序无注释则在程序结构合理性扣10分
六、课程设计主要参考资料
1.谭浩强著.C程序设计(第3版).北京:
清华大学出版社,2005.7
2.刘光蓉、汪靖、陆登波主编.C程序设计实验与实践教程.北京:
清华大学出版社,2011.2
3.游洪跃主编.C语言程序设计实验与课程设计教程.北京:
清华大学出版社,2011.5
4.(美) Perter VanDer Linden著,徐波 译.C专家编程(C编程语言经典之作).北京:
人民邮电出版社,2008.2
5.凯尼格著,高巍译.C陷阱与缺陷.北京:
人民邮电出版社,2008.2
6.MarkdeBerg等著,邓俊辉译,《计算几何-算法与应用(第3版)》,清华大学出版社,2009年8月
7.杨克昌编著,《计算机程序设计典型例题精解》,国防科技大学大学出版社,1999年3月
七、课程设计计划安排
时间
任务
课程设计前一周
选择课程设计题目,分析课题的要求,确定设计方案,完成报告册中“课程设计概述”
课程设计第1天
按功能模块编写详细设计说明,完成报告册中“总体设计”
课程设计第2天
编写程序、调试程序
课程设计第3天
编写程序、调试程序,完成报告册中“详细设计”
课程设计第4天
调试程序,完成报告册中“调试分析过程”
课程设计第5天
完成报告册中“总结”、“参考文献”、“课程设计评审表”部分内容,提交课程设计报告、源程序、面试或答辩
一、课程设计概述
课程设计问题描述
最小包围圆问题是计算几何中的一个很经典的问题:
输入平面上n个点的坐标,输出一个圆的圆心和半径,这个圆刚好包围了给出的n个点,即这个圆是包围了给出所有点的最小的圆,求最小包围圆的圆心位置和半径。
设计要求
1.定义一个结构体类型表示平面上点的位置坐标。
2.编写一个函数求两点之间的距离。
3.编写一个函数确定三点是否在同一条直线上。
4.编写一个函数求n个点集的最小包围圆。
5.编写一个函数求通过点q,包含了n个点集中所有点的最小包围圆。
6.编写一个函数求通过点q1和q2,包含了n个点集中所有点的最小包围圆。
7.主函数中实现平面坐标点个数及坐标的输入,调用以上函数,求出最小包围圆的坐标位置及半径。
设计目的
掌握所学语言程序设计的方法,熟悉所学语言的开发环境及调试过程,熟悉所学语言中的数据类型,数据结构、语句结构、运算方法,巩固和加深对理论课中知识的理解,提高学生对所学知识的综合运用能力。
开发环境
1.Visualc++6.0.
2.电脑
3.Win7操作系统
二、总体设计
(1)
系统功能需求分析
最小包围圆问题是输入平面上n个点的坐标,输出一个圆的圆心和半径。
因此,这程序设计需要运用到最小包围圆的求解方法。
1.定义一个结构体类型来表示平面上的点的坐标位置。
定义结构体数组存放n座摩天大楼的坐标位置。
2.编写一个函数求两点之间的距离。
求平面上两点之间的距离公式为
d=sqrt[(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)]
3.编写一个函数确定三点是否共线。
先求叉积,若叉积为0,即三点共线;反之,三点不共线。
4.编写一个函数求n个点集的最小包围圆。
任意取两个点,以这两个点的连线为直径作圆,再以此判断剩余的点是否都在圆上或圆内。
5.编写一个函数求通过点q,包含了n个点集中所有点的最小包围圆。
先用p[1]和p[i]作圆,再从2到i-1判断是否有点不在圆上。
6.编写一个函数求通过点q1和q2,包含了n个点集中所有点的最小包围圆。
7.主函数实现平面坐标点个数及坐标输入,调用以上函数,求出最小包围圆的坐标位置和半径。
二、总体设计
(2)
系统总体设计框架
三、详细设计
(1)
主要功能模块的算法设计
1.利用结构体类型定义平面上点的坐标
typedefstructpoint
{intx;
inty;
}POINT;
2.定义结构体数组存放n座摩天大楼的位置坐标
#defineN100
POINTa[N];结构体数组元素的引用:
a[i].x,a[i].y,结构体数组元素的使用等同于同类型的普通变量。
3.求最小包围圆的求解方法可以转换为3个子问题进行求解。
由于三个点确定一个圆,因此可以从没有确定点,到有一个确定点,再到两个确定点,再到三个确定点来求圆的问题。
(1)通过三个点求圆
判断三点是否共线,找到距离最远的一对点,以其连线为直径作圆,若不共线转换为三角形的外接圆问题。
利用doublemultiply(Pointp1,Pointp2,Pointp0)
{return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y))
}判断三点是否共线
(2)求三角形外接圆
假设三个点(x1,y1),(x2,y2),(x3,y3).设过(x1,y1),(x2,y2)的直线L1方程为Ax+By=C,它的中点为((x1+x2)/2,(y1+y2)/2),L1中垂线方程为A1x+B1y=C1;则它的中垂线方程中
A1=-B=x2-x1,B1=A=y2-y1,C1=-B*(x1+x2)/2+A*(y1+y2)/2
同理可得过(x1,y1),(x3,y3)的直线的中垂线方程。
这两条中垂线的交点就是圆心。
(3)求两条直线交点
设两条直线为A1x+B1y=C1和A2x+B2y=C2.
设一个变量det=A1*B2-A2*B1;
如果det=0,两直线平行;反之,则交点
x=(B2*C1-B1*C2)/det,y=(A1*C2-A2*C1)/det
4.通过点Pi,包含n个点集中所有点的最小包围圆,利用
for(j=2;j<=n;j++)
{if(distance(d,a[j])<=r)continue;
else
{MiniDiscWith2Point(pi,a[j],j-1);
}从第一点开始查找。
三、详细设计
(1)
主要功能模块源程序
#include
#include
structPoint
{
doublex,y;
};
Pointa[1000],d;
doubler;
doubledistance(Pointp1,Pointp2)
{
return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
doublemultiply(Pointp1,Pointp2,Pointp0)
{
return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
voidMiniDiscWith2Point(Pointp,Pointq,intn)
{
d.x=(p.x+q.x)/2.0;
d.y=(p.y+q.y)/2.0;
r=distance(p,q)/2;
intk;
doublec1,c2,t1,t2,t3;
for(k=1;k<=n;k++)
{
if(distance(d,a[k])<=r)continue;
if(multiply(p,q,a[k])!
=0.0)
{
c1=(p.x*p.x+p.y*p.y-q.x*q.x-q.y*q.y)/2.0;
c2=(p.x*p.x+p.y*p.y-a[k].x*a[k].x-a[k].y*a[k].y)/2.0;d.x=(c1*(p.y-a[k].y)-c2*(p.y-q.y))/((p.x-q.x)*(p.y-a[k].y)-(p.x-a[k].x)*(p.y-q.y));d.y=(c1*(p.x-a[k].x)-c2*(p.x-q.x))/((p.y-q.y)*(p.x-a[k].x)-(p.y-a[k].y)*(p.x-q.x));
r=distance(d,a[k]);
}
else
{
t1=distance(p,q);
t2=distance(q,a[k]);
t3=distance(p,a[k]);
if(t1>=t2&&t1>=t3)
{d.x=(p.x+q.x)/2.0;d.y=(p.y+q.y)/2.0;r=distance(p,q)/2.0;}
elseif(t2>=t1&&t2>=t3)
{d.x=(a[k].x+q.x)/2.0;d.y=(a[k].y+q.y)/2.0;r=distance(a[k],q)/2.0;}
else
{d.x=(a[k].x+p.x)/2.0;d.y=(a[k].y+p.y)/2.0;r=distance(a[k],p)/2.0;}
}
}
}
voidMiniDiscWithPoint(TPointpi,intn)
{
d.x=(pi.x+a[1].x)/2.0;
d.y=(pi.y+a[1].y)/2.0;
r=distance(pi,a[1])/2.0;
intj;
for(j=2;j<=n;j++)
{
if(distance(d,a[j])<=r)continue;
else
{
MiniDiscWith2Point(pi,a[j],j-1);
}
}
}
voidMinDisc(intn)
{
d.x=(a[1].x+a[2].x)/2.0;
d.y=(a[1].y+a[2].y)/2.0;
r=distance(a[1],a[2])/2.0;
intj;
for(j=3;j<=n;j++)
{
if(distance(d,a[j])<=r)continue;
else
{
MiniDiscWith2Point(a[1],a[j],j-1);
}
}
}
intmain()
{
inti,n;
三、详细设计
(2)
主要功能模块的算法设计
5.通过点p,q,包含n个点集中所有点的最小包围圆,利用
for(k=1;k<=n;k++)
{
if(distance(d,a[k])<=r)continue;
if(multiply(p,q,a[k])!
=0.0)
{
…
}
else
{
…
}
}通过判断是否共线,求出最小包围圆。
6.主函数利用while语句和循环语句实现n个点的输入,输出最小包围圆的圆心和半径
+
三、详细设计
(2)
主要功能模块源程序
while(scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
if(n==1)
{printf("%.2lf%.2lf0.00\n",a[1].x,a[1].y);continue;}
r=distance(a[1],a[2])/2.0;
d.x=(a[1].x+a[2].x)/2.0;
d.y=(a[1].y+a[2].y)/2.0;
for(i=3;i<=n;i++)
{
if(distance(d,a[i])<=r)continue;
else
MiniDiscWithPoint(a[i],i-1);
}
printf("%.2lf%.2lf%.2lf\n",d.x,d.y,r);
}
return0;
}
四、调试分析过程
(1)
调试过程出现的问题
及解决方法
1.在定义变量时出现错误,得到的数据出现错误.重新定义变量的数据类型。
2.使用循环语句while时,没有确定循环结束的条件,出现死循环。
重新检查,修正循环终止条件。
3.忘记对所调用的函数进行声明,在编译时有出错信息。
在main函数中增加一个对所调用函数的声明。
4.在使用scanf函数时,忘记用变量的地址符。
重新书写。
5.使用一维数组时,数组的下标出现错误,导致输出的结果有误。
修正数组下标。
6.输入数据的形式与要求不符合,导致运行程序时没有得到相应的输出结果。
对照scanf函数中的输入形式重新输入数据。
四、调试分析过程
(2)
测试数据
及测试结果
五、总结
设计用到的知识点
1.函数的递归调用
2.循环结构
3.函数的定义与使用
4.数组的使用
5.最小包围圆的求解问题
收获与体会
在这次的C语言程序设计实习中,让我对以往所学的理论知识有了进一步的了解,更重要的是能够独自分析一些简单的程序,对于一些错误的程序也能进行改正。
在完成这个课题之后,我对C语言的也有一定的掌握了。
不足与努力方向
在刚得到这个题目时还是有一点不知所措,最小包围圆的求解问题相对来说算法比较复杂,在查阅原程序时很多地方都不理解,必须查阅相关资料。
本身对C语言的运用不够熟练,在课题上也没办法做到创新,拓展到最小包围球的算法偏难,希望在今后的学习中能够有所进步,具备一定创新能力。
六、参考文献
参考书籍及
参考论文与
网址
1.谭浩强著.C程序设计(第3版).北京:
清华大学出版社,2005.7
2.刘光蓉、汪靖、陆登波主编.C程序设计实验与实践教程.北京:
清华大学出版社,2011.2.
3.游洪跃主编.C语言程序设计实验与课程设计教程.北京:
清华大学出版社,2011.5
4.(美)PerterVanDerLinden著,徐波译.C专家编程(C编程语言经典之作).北京:
人民邮电出版社,2008.2
5.凯尼格著,高巍译.C陷阱与缺陷.北京:
人民邮电出版社,2008.2
6.MarkdeBerg等著,邓俊辉译,《计算几何-算法与应用(第3版)》,清华大学出版社,2009年8月
7.杨克昌编著,《计算机程序设计典型例题精解》,国防科技大学大学出版社,1999年3月
课程设计成绩评审表
姓名
唐永亮
学号
1304080009
班级
1309
设计题目
最小包围圆问题
作品描述
用随即增量式算法求解最小包围圆问题,将最小包围圆问题转化为三个子问题进行求解
(1)通过三个点求圆;
(2)求三角形外接圆;(3)求两条直线交点,从而得出平面上n个点坐标的最小包围圆的位置和半径。
指导教师评语
观测内容
分值
评分(上限)
得分
A
B
C
D
E
程序运行情况
20
20
15
10
5
3
程序功能的完善程度
10
10
8
6
4
2
程序结构的合理性
10
10
8
6
4
2
对问题的答辩情况
20
20
15
10
5
3
创新情况
10
10
8
6
4
2
工作态度与独立工作能力
10
10
8
6
4
2
设计报告内容的规范性
20
20
15
10
5
3
指导教师评定成绩
指导教师(签名)
年月日