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

项目地址: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. 开灯问题3_2(JAVA语言)

    package 第三章; public class 开灯问题3_2 { public static void main(String[] args) { // TODO Auto-generated ...

  2. 在docker容器中使用cplex-python37

    技术背景 线性规划是常见的问题求解形式,可以直接跟实际问题进行对接,包括目标函数的建模和各种约束条件的限制等,最后对参数进行各种变更,以找到满足约束条件情况下可以达到的最优解.Cplex是一个由IBM ...

  3. Android Studio 如何在TextView中设置图标并按需调整图标大小

    •任务 相信大家对这张图片都不陌生,没错,就是 QQ动态 向我们展示的界面. 如何实现呢? •添加文字并放入图标 新建一个 Activity,取名为 QQ,Android Studio 自动为我们生成 ...

  4. Android Studio 之 BaseAdapter 学习笔记

    •前行必备--ListView的显示与缓存机制 我们知道 ListView.GridView 等控件可以展示大量的数据信息. 假如下图中的 ListView 可以展示 100 条信息,但是屏幕的尺寸是 ...

  5. 在M1芯片的Mac系统上做.net core开发靠谱吗?

    作为一个7年老.NET程序员,最近几年苹果慢慢接替微软,成为我心中最酷的科技公司. 为什么我会选择Mac os作为我的开发环境? 很多做.net的同学都使用Windows系统作为自己的开发环境,我其实 ...

  6. SpringCloud(六)分布式事务

    在分布式系统中,分布式事务基本上是绕不开的, 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上 .其实就可以简单理解成在分布式系统中实现事务 ...

  7. OO_Unit1_Summary

    经历了十分充实(痛不欲生)的三周不一样的码代码的生活,让我对通宵oo有了新的认识.往届学长学姐诚不欺我 第一次作业 需求分析 第一次需求非常简单(相比较后两次作业而言),仅为简单多项式求导,而且仅包含 ...

  8. python中的数据结构-链表

    一.什么是链表 链表是由一系列节点构成,每个节点由一个值域和指针域构成,值域中存储着用户数据,指针域中存储这指向下一个节点的指针.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环 ...

  9. Python 3.10 中新的功能和变化

    随着最后一个alpha版发布,Python 3.10 的功能更改全面敲定! 现在,正是体验Python 3.10 新功能的理想时间!正如标题所言,本文将给大家分享Python 3.10中所有重要的功能 ...

  10. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...