一、为了OFFER系列 | 阿里云天池赛在线编程:移动的圆
发布日期:2021-07-01 02:08:15
浏览次数:2
分类:技术文章
本文共 3420 字,大约阅读时间需要 11 分钟。
@Author:Runsen
大四刷题拼offer系列,不拼不行啊
关于:阿里云天池赛在线编程的介绍。
阿里云天池赛在线编程:在线编程限时赛,参与刷题,提升能力,奖品多多,助你晋级拿offer!
本人并没有参加,而是看看试题,自己不会也当作学习下。
移动的圆
描述:轨迹将指定两个圆A和B的圆心坐标( x , y x,y x,y)和半径 r r r,现给你一个点 P P P,使圆 A A A圆心沿直线运动至点 P P P。请问圆 A A A在运动过程中是否会与圆B相交?(运动过程包括起点和终点)若会相交返回1,否则返回-1。
输入:[0,0,2.5,3,2,0.5,0,2]输出:1样例解释:圆A的圆心(0,0),半径为2.5,圆B的圆心(3,2),半径为0.5,点P(0,2),如图:
输入:[0,0,2,5,0,1,0,2]输出:-1样例解释:圆A的圆心(0,0),半径为2,圆B的圆心(5,0),半径为1,点P(0,2)
难度:中等。一开始就是使用圆相交的判断条件: r 1 − r 2 < = d i s < = r 1 + r 2 r1-r2 <= dis <= r1+r2 r1−r2<=dis<=r1+r2。两个圆相交的充要条件是两圆圆心距大于两半径差的绝对值,小于两半径和 ,相切就是加上等于。
考点:点到线段的最短距离,两个点的距离公式。
关键是如何找到运动过程中的最小距离。
最小距离肯定是在同一条直线上,但是也有可能存在不在同一条直线的可能。那么最小距离就是两个端点值。
但是又有可能是大圆A 里面装着小圆B (这点必须考虑)
本题的通过率是16.77%。我觉得也很难,浪费了一个早上。考试就给你半个小时一题,可见我是多少的菜比。下面是自己的通过代码,其实想多下,就很简单
@Author: Runsen@微信公众号: 润森笔记@博客: https://blog.csdn.net/weixin_44510615@Date: 2020/8/28'''class Solution: """ @param position: the position of circle A,B and point P. @return: if two circle intersect return 1, otherwise -1. """ def IfIntersect(self, position): x1, y1, r1, x2, y2, r2, xp, yp = position # 向量的表示 vector_x1 = x2 - x1 vector_y1 = y2 - y1 vector_x2 = x2 - xp vector_y2 = y2 - yp vector_x3 = xp - x1 vector_y3 = yp - y1 # y=ax+b try: a = (y1 - yp) / (x1 - xp) b = y1 - a * x1 except ZeroDivisionError: # 存在 0=ax+b a = 1 b = (-1) * x1 # 直线的距离公式 d = abs(a * x2 - y2 + b) / ((a ** 2 + 1) ** (1 / 2)) # 如果在圆内没有接触 大圆A 里面装着小圆B (必须考虑) if r1 ** 2 > r2 ** 2 + (x2 - x1) ** 2 + (y2 - y1) ** 2 and r1 ** 2 > r2 ** 2 + (x2 - xp) ** 2 + (y2 - yp) ** 2: return -1 # 下面就是常见的情况:向量小于0,说明余弦角大于90,也是就最小距离取不到 if (vector_x1 * vector_x3 + vector_y1 * vector_y3) <= 0 or -1 * ( vector_x2 * vector_x3 + vector_y2 * vector_y3) <= 0: # 那么最小距离就是两个端点值,那么就判断r1+r2 小于就有交集,返回1 if (((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5) <= r1 + r2 or (((x2 - xp) ** 2 + (y2 - yp) ** 2) ** 0.5) <= r1 + r2: return 1 else: return -1 else: # 下面就是角小于90,正常情况 if d <= r1 + r2: return 1 else: return -1
在查阅的时候,看了标准的做法。代码我都看不懂,
class Solution: """ @param position: the position of circle A,B and point P. @return: if two circle intersect return 1, otherwise -1. """ def IfIntersect(self, position): def getDistance(x, y, x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 # 没有移动 if dx == 0 and dy == 0: dx = x - x1 dy = y - y1 return float(dx ** 2 + dy ** 2) ** 0.5 # what is t ? # r ^ 2 = float(dx ** 2 + dy ** 2) # (x - x1) / r * dx / r # cosine # (y - y1) / r * dy / r # sine t = ((x - x1) * dx + (y - y1) * dy) / float(dx ** 2 + dy ** 2) # if t < 0: dx = x - x1 dy = y - y1 elif t > 1: dx = x - x2 dy = y - y2 else: dx = x - (x1 + t * dx) dy = y - (y1 + t * dy) return float(dx ** 2 + dy ** 2) ** 0.5 x1, y1, r1, x2, y2, r2, xp, yp = position dis = getDistance( x2, y2, x1, y1, xp, yp) return -1 if not r1 - r2 <= dis <= r1 + r2 else 1
转载地址:https://maoli.blog.csdn.net/article/details/108273868 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年04月21日 22时58分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
git常用指令
2019-05-01
shell中获取当前日期,下月1日,上月底,上月同期日期,比较两个日期大小
2019-05-01
java单例模式几种常见实现方式
2019-05-01
shell脚本中$0,$?,$!、$$、$*、$#、$@等的意义
2019-05-01
Linux正则表达式基础入门+扩展
2019-05-01
Java实现生产者消费者模式的三种方法
2019-05-01
Java线程池的四种拒绝策略
2019-05-01
java线程池常用的阻塞队列
2019-05-01
Lock 常用的几种方法,和作用
2019-05-01
[译]Android冰淇淋三明治ICS(4.0+)JNI局部引用的变化
2019-05-01
Google Map For Android V2 使用方法
2019-05-01
OpenGL ES四 – 光效
2019-05-01
OpenGL ES五 – 材质
2019-05-01
OpenGL ES六 – 纹理及纹理映射
2019-05-01
OpenGL ES七 – 变换和矩阵
2019-05-01
OpenGL ES四补遗 – setupView重写
2019-05-01
OpenGL ES八 - 交叉存取顶点数据
2019-05-01
OpenGL ES九 -动画基础和关键帧动画
2019-05-01
OpenGL ES九 - 四元数
2019-05-01