教学班级:周三上午三四节

项目地址:https://github.com/875571216/-

PSP表格

psp2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 30
Estimate 估计这个任务需要多少时间 10 10
Development 开发
Analysis 需求分析 (包括学习新技术) 180 240
Design Spec 生成设计文档 30 10
Design Review 设计复审 10 10
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 10
Design 具体设计 50 50
Coding 具体编码 180 120
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 180 220
Reporting 报告 10 10
test Reporting 测试报告 30 20
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 10 10

解题思路描述

1)首先把输入文件中的直线,圆的信息都构造成相应的对象,存入到各自的容器中。(直线、圆和点各设置一个动态数组容器vector来存储)

2)交点分为:直线与直线相交;直线与圆相交;圆与圆相交,在各自的类中设置求交点的成员方法。具体求法为:

<1> 直线l1与直线l2:联立解方程

<2> 直线l与圆c:求出一条经过圆c的圆心且与直线l垂直的直线_l,l与_l的交点是c的圆心作l的垂线的垂足,通过这个垂足可以求出两个交点。

<3> 圆c1与圆c2:两圆的方程相减到它们焦点所在的直线,然后求直线与圆的交点。

3)交点加入加点集合(查重的方法是暴力遍历,如果这个点在数组中已经存在,就不加入集合,没找到更好的方法)

设计实现过程。

1)代码如何组织:

<1> 头文件:定义了line(直线)、dot(点)、cycle(圆)三个数据类型。

<2> 主体cpp文件:引用了头文件的三个数据类型。定义了line(直线)类中的“两直线求交点”的方法。定义了cycle(圆)类中“两圆求交点”的方法以及“圆与直线求交点”的方法。最后还有从文件读入圆与直线信息并构造相应数据类型的的main函数。

<3> 单元测试:设置了10组单元测试,引用了头文件中的三个数据类型,这三个数据类型的具体成员方法在主体cpp文件中定义好了。

2)单元测试:

<1> 直线与直线相交;

<2> 直线与直线平行;

<3> 圆与圆相离;

<4> 圆与圆外切;

<5> 圆与圆相交;

<6> 圆与圆内切;

<7> 圆包含圆;

<8> 直线与圆相离;

<9> 直线与圆相切;

<10> 直线与圆相交;

性能分析



可以看到,我的程序中,占用cpu最多的是solve,这个函数是我用来封装计算所有交点的函数,占用率高很正常。然后就是lintersectl这个函数,这个是用来计算直线交点的,由于我的测试样例只计算了直线与直线相交,这也比正常。有问题的是dotinsert这个函数,这个函数是用来插入点的,为什么会占用这么多的cpu呢,因为我的设计,是通过比较点的坐标来判断该点是否已经加入了交点集。我存储交点的数据结构是一个数组,这就导致没插入一个点就必须遍历一边数组,占用大量的cpu资源。看图:



我的改进办法是用hash表来存储交点,这样每次插入点的复杂度就有o(n)变成了o(1),节省了大量的时间开销。

关键代码:

<1> 两直线求交点方法:简单解方程。



<2> 直线l与圆c求交点的方法:求出一条经过圆c的圆心且与直线l垂直的直线_l,l与_l的交点是c的圆心作l的垂线的垂足。然后通过点到直线距离公式求圆c的圆心到直线l的垂直距离d。用勾股定理就能算出垂足点到两交点的距离,再结合直线l斜率,就可以求出两交点坐标。当然,如果圆心到直线的垂直距离d大于圆半径,那就没有交点,相等则只有一个交点——垂足点。



<3> 两圆相交:首先求出两圆心之间的距离d,如果d>r1+r2(两圆半径之和)或者d+r1(较小圆的半径)<r2,那么两个圆没有交点。然后从两个圆方程中解出通过他们交点的直线,再求直线与圆的交点



可以看出,确实大部分时间都消耗在了遍历数组上。于是,我决定用hash表来存储交点集,这样,在查找点集时的复杂度就有o(n)变为o(1),节省了大量的时间开销。

work2_求交点数的更多相关文章

  1. 洛谷P2789 直线交点数 [数论,递归]

    题目传送门 题目描述 平面上有N条直线,且无三线共点,那么这些直线能有多少不同的交点数? 输入格式 一个正整数N 输出格式 一个整数表示方案总数 输入输出样例 输入 #1 4 输出 #1 5 说明/提 ...

  2. ray与triangle/quad求交二三事

    引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...

  3. HDU-1466 计算直线的交点数 经典dp

    1.HDU-1466   计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...

  4. [NetTopologySuite](2)任意多边形求交

    任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...

  5. hdu----(1466)计算直线的交点数(dp)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  6. HDOJ 1466 计算直线的交点数

    将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,......,直线n 和其他n-1条直线最多有n-1个交点.由此得出n条直线互不平行且无三线共点的最多交点数 ...

  7. 计算直线的交点数(hdu1466简单的dp)

    题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...

  8. 计算直线的交点数(set + 打表)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. hdu1466 计算直线的交点数

    题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...

随机推荐

  1. 优化 ASP.NET Core Docker 镜像的大小

    在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...

  2. 「HTML+CSS」--自定义按钮样式【004】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  3. [树状数组]数星星 Stars

    数 星 星 S t a r s 数星星 Stars 数星星Stars 题目描述 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 k k k 颗星星 ...

  4. DBeaver、Navicat、MySQL高频报错及解决方法,此文持续更新

    目录 第一坑,没有用管理员身份 第二坑,MySQL 服务无法启动 第三坑,报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost ...

  5. [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.2 变换器传递函数分析

    8.2 变换器传递函数分析 接下来,让我们推导基本变换器传递函数中的极点,零点和渐近线增益的解析表达式. 8.2.1 示例:Buck-boost变换器的传递函数 Buck-boost变换器的小信号等效 ...

  6. 如何快速搭建自己的ERP系统,4步源码快速安装odoo教程

    上一篇内容:了解什么是Odoo,为二次开发做准备 1.下载odoo源码 Github地址:https://github.com/odoo/odoo Gitee地址:https://gitee.com/ ...

  7. 如何获取canvas当前的缩放值

    项目中一直有一个问题困扰着我,我们的画布可以缩放平移旋转,支持拖拽生成图形,生成手写笔迹,如果用户选择的线条粗细为5像素,那么即使画布缩放过绘制出的线条粗细也应该是视觉上的5px,所以再绘制时赋值给c ...

  8. Java【线程池、Lambda表达式】

    见pdf 等待唤醒机制 wait和notify 第二章 线程池 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁 ...

  9. Qt中检查槽函数connect是否正确

    环境:VS2017+Qt插件 一般情况下VS+QT环境下运行的QT程序输出信息需要在调试模式的输出栏可以看到,由于太多信息所以导致查看不方便(当然也可以在筛选选项中筛选信息). 有更方便查看输出信息的 ...

  10. JAVAEE_Servlet_18_关于Servlet线程安全问题

    关于Servlet线程安全问题 Servlet线程安全 Servlet 是单实例多线程的环境下运行的. 在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接 ...