美文网首页
已知两点和半径求圆心python

已知两点和半径求圆心python

作者: CodingFemy | 来源:发表于2020-05-17 12:02 被阅读0次

用公式直接求解

def get_circle(self, p0, p1, r):
    if p1[0] == p0[0]:
        y0 = y1 = (p0[1]+p1[1]) / 2
        deltay = (y0-p0[1]) ** 2
        deltax = sqrt(r ** 2 - deltay)
        x0 = p1[0] - deltax
        x1 = p1[0] + deltax
    else:
        C1 = (p1[0]**2 + p1[1]**2 - p0[0]**2 - p0[1]**2) / 2 / (p1[0] - p0[0])
        C2 = (p1[1] - p0[1]) / (p1[0] - p0[0])
        A = 1 + C2**2
        B = 2 * (p0[0] - C1) * C2 - 2*p0[1]
        C = (p0[0]-C1)**2 + p0[1]**2 - r**2
        y0 = (-B + sqrt(B*B - 4 * A * C)) / 2 / A
        y1 = (-B - sqrt(B*B - 4 * A * C)) / 2 / A
        x0 = C1 - C2 * y0
        x1 = C1 - C2 * y1
    return [x0, y0], [x1, y1]

leetcode 5415. 圆形靶内的最大飞镖数量

from math import sqrt
class Solution:
    def get_dis(self, p0, p1):
        return (p0[0]-p1[0])**2 + (p0[1]-p1[1])**2

    def get_circle(self, p0, p1, r):
        if p1[0] == p0[0]:
            y0 = y1 = (p0[1]+p1[1]) / 2
            deltay = (y0-p0[1]) ** 2
            deltax = sqrt(r ** 2 - deltay)
            x0 = p1[0] - deltax
            x1 = p1[0] + deltax
        else:
            C1 = (p1[0]**2 + p1[1]**2 - p0[0]**2 - p0[1]**2) / 2 / (p1[0] - p0[0])
            C2 = (p1[1] - p0[1]) / (p1[0] - p0[0])
            A = 1 + C2**2
            B = 2 * (p0[0] - C1) * C2 - 2*p0[1]
            C = (p0[0]-C1)**2 + p0[1]**2 - r**2
            y0 = (-B + sqrt(B*B - 4 * A * C)) / 2 / A
            y1 = (-B - sqrt(B*B - 4 * A * C)) / 2 / A
            x0 = C1 - C2 * y0
            x1 = C1 - C2 * y1
        return [x0, y0], [x1, y1]

    def get_number(self, points, circle, r_squre):
        res = 0
        for p in points:
            dis = self.get_dis(p, circle)
            # print(dis, r_squre)
            if dis <= r_squre:
                res += 1
        return res


    def numPoints(self, points: [[int]], r: int) -> int:
        res = 0
        r_squre = r**2
        for i in range(len(points)):
            for j in range(i+1, len(points)):
                dis = self.get_dis(points[i], points[j])
                if dis > r_squre*4:
                    res = max(res, 1)
                else:
                    # print(points[i], points[j])
                    circle1, circle2 = self.get_circle(points[i], points[j], r)
                    # print("圆心", circle1, circle2)
                    res = max(res,
                            self.get_number(points, circle1, r_squre), 
                            self.get_number(points, circle2, r_squre)
                            )
        return res


# if __name__ == '__main__':
#     points = [[-3,0],[3,0],[2,6],[5,4],[0,9],[7,8]]
#     r = 5
#     points = [[1,2],[3,5],[1,-1],[2,3],[4,1],[1,3]]
#     r = 2
#     points = [[-2,0],[2,0],[0,2],[0,-2]]
#     r = 1
#     points = [[-2,0],[2,0],[0,2],[0,-2]]
#     r = 2
#     print(Solution().get_number(points, [0,4], r**2))
#     print(Solution().get_circle([2,4],[4,2],2))
#     print(Solution().get_circle([2,4],[4,4],3))
#     print(Solution().get_circle([2,4],[2,0],2))
#     # print(Solution().get_dis(points[0], points[5]))
#     print(Solution().numPoints(points, r))

相关文章

  • 已知两点和半径求圆心python

    用公式直接求解 leetcode 5415. 圆形靶内的最大飞镖数量

  • Java 计算两点两线的交点、计算两圆的交点

    一、需求 1. 已知B点、C点、c线长和b线长,求A点坐标;1. 通过B、C两点作为圆心,绘制半径为c、b的圆;2...

  • Python已知圆上三点求圆心和半径

    一、原理:   圆上的任意两点的连线称作弦,弦的中垂线必过圆心,取三点组成的两条弦的中垂线的交点,即为圆心,再通过...

  • 圆心角

    思路引导:求弧长,半径已知,关键是求弧所对的圆心角的度数。利用相切和四边形的内角和,可求出。

  • ceres solver 08 例子: 圆拟合

    输入一系列点(包括部分离群点),求拟合圆的圆心和半径。 1. 圆的模型 假设圆的方程如下:圆心为, 半径为。为参与...

  • CAD圆的快捷键C

    1:圆的快捷键是C加空格,输入后会出现圆的圆心或三点3P,两点2P或相切相切半径。在绘图工具栏里有圆心半径,和圆心...

  • 已知圆心,半径,角度,求圆上的点坐标

    圆心坐标:(x0,y0) 半径:r 角度:a 则圆上任一点为:(x1,y1) x1 = x0 + r *...

  • 【JS】求旋转旋转坐标

    已知圆心坐标、旋转角度、起始点坐标,求结束点坐标 上面的反向,已知结束点坐标,求起始点

  • 2017-07-25

    《圆》 作者:王保帅 半径圆心半径 直径穿过圆心 圆规拿手画圆 圆心定点恒稳 圈圆半径确定 理论实线结合 关健...

  • 一道简单的算法题

    已知A,B坐标,且A为圆心,求圆与AB连线的交点坐标

网友评论

      本文标题:已知两点和半径求圆心python

      本文链接:https://www.haomeiwen.com/subject/lxnjohtx.html