最小包围圆课件资料.docx

上传人:b****8 文档编号:30282740 上传时间:2023-08-13 格式:DOCX 页数:17 大小:89.26KB
下载 相关 举报
最小包围圆课件资料.docx_第1页
第1页 / 共17页
最小包围圆课件资料.docx_第2页
第2页 / 共17页
最小包围圆课件资料.docx_第3页
第3页 / 共17页
最小包围圆课件资料.docx_第4页
第4页 / 共17页
最小包围圆课件资料.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

最小包围圆课件资料.docx

《最小包围圆课件资料.docx》由会员分享,可在线阅读,更多相关《最小包围圆课件资料.docx(17页珍藏版)》请在冰豆网上搜索。

最小包围圆课件资料.docx

最小包围圆课件资料

 

《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

指导教师评定成绩

 

指导教师(签名)

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 初中作文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1