给定2个圆圈和角度之间的距离,如何找到中心(在python中)?

时间:2012-05-14 01:35:48

标签: python trigonometry

我在一个圆上有2个点,它们和我之间的角度想要找到这样定义的圆的中心(好,两个中心最好)。 enter image description here

def find_center(p1,p2,angle):
  # magic happens... What to do here?
  return (center_x, center_y)

4 个答案:

答案 0 :(得分:4)

这是我的测试代码

的解决方案
from pylab import *
from numpy import *

def find_center(p1, p2, angle):
    # End points of the chord
    x1, y1 = p1 
    x2, y2 = p2 

    # Slope of the line through the chord
    slope = (y1-y2)/(x1-x2)

    # Slope of a line perpendicular to the chord
    new_slope = -1/slope

    # Point on the line perpendicular to the chord
    # Note that this line also passes through the center of the circle
    xm, ym = (x1+x2)/2, (y1+y2)/2

    # Distance between p1 and p2
    d_chord = sqrt((x1-x2)**2 + (y1-y2)**2)

    # Distance between xm, ym and center of the circle (xc, yc)
    d_perp = d_chord/(2*tan(angle))

    # Equation of line perpendicular to the chord: y-ym = new_slope(x-xm)
    # Distance between xm,ym and xc, yc: (yc-ym)^2 + (xc-xm)^2 = d_perp^2
    # Substituting from 1st to 2nd equation for y,
    #   we get: (new_slope^2+1)(xc-xm)^2 = d^2

    # Solve for xc:
    xc = (d_perp)/sqrt(new_slope**2+1) + xm

    # Solve for yc:
    yc = (new_slope)*(xc-xm) + ym

    return xc, yc

if __name__=='__main__':
    p1 = [1., 2.]
    p2 = [-3, 4.]
    angle = pi/6
    xc, yc = find_center(p1, p2,angle)

    # Calculate the radius and draw a circle
    r = sqrt((xc-p1[0])**2 + (yc-p1[1])**2)
    cir = Circle((xc,yc), radius=r,  fc='y')
    gca().add_patch(cir)

    # mark p1 and p2 and the center of the circle
    plot(p1[0], p1[1], 'ro')
    plot(p2[0], p2[1], 'ro')
    plot(xc, yc, 'go')

    show()

答案 1 :(得分:1)

我对这些东西真的很生气,所以这可能有点过时了,但它应该让你开始。另外,我不知道python,所以这只是伪代码:

//check to ensure...
  //The two points aren't the same
  //The angle isn't zero
  //Other edge cases

//Get the distance between the points
x_dist = x2 - x1;
y_dist = y2 - y1;

//Find the length of the 'opposite' side of the right triangle
dist_opp = (sqrt((x_dist)^2 + (y_dist)^2)));
x_midpoint = (x1 - (x_dist / 2);
y_midpoint = (y1 - (y_dist / 2);
theta = the_angle / 2; //the right triangle's angle is half the starting angle
dist_adj = cotangent(theta) * dist_opp;//find the right triangle's length

epsilon = sqrt((-y_dist)^2 + x_dist^2);
segments = epsilon / dist_adj;

x_center = x_midpoint + (x_dist * segments);
y_center = y_midpoint + (y_dist * segments);

答案 2 :(得分:1)

你必须解决三角形p1 p2 c。你有一个角度。另外两个角度是(180角度)/ 2计算边p1 p2(距离)然后计算边p1 c这给出圆的半径r。解是两个点,即圆与中心p1和中心p2和半径r的交点。

答案 3 :(得分:1)

# Solve for xc:
xc = (d_perp)/sqrt(new_slope**2+1) +xm # looks like +xm got omitted!)

# Solve for yc:
yc = (new_slope)*(xc-xm)+ym

您还需要检查x1 = x2

# Slope of the line through the chord
if x1==x2
    slope = 999999
else
    slope = (y1-y2)/(x1-x2)