一个圆圈上的最近点到一个线段python

时间:2014-12-23 01:32:57

标签: python geometry

我需要找到一个盒子和一个圆圈之间的最近距离,但是,我意识到这可以分解成一个线段和一个圆圈之间的最近距离。

鉴于

  • 我有两个点point1_xpoint1_ypoint2_xpoint2_y
  • 线段
  • 我有一个,其中心为circle_xcircle_y半径 radius

问题

是否有一个支持这种开箱即用的python库,如果没有,有人可以提供这样的功能吗?

(我相信我必须在圆上找到与线相同斜率的切点?)

2 个答案:

答案 0 :(得分:2)

有一种方法可以找到从圆到矩的最近距离(这里是以轴为中心) 矩形边将平面分成9块。我们可以找到哪个部分(中央,左上,左等)包含圆心,并计算所需的距离。矩形ABCD和圆心E:

enter image description here

德尔福代码:

//returns closest distance from circle to rectangle
//0 if intersection or inclusion occurs
function CircleRectDistance(CX, CY, CR: Integer; RR: TRect): Double;
var
  wh, hh, dx, dy, t, SquaredDist: Double;
begin
  SquaredDist := 0;

  //halfwidth and halfheight
  wh := 0.5 * (RR.Right - RR.Left);
  hh := 0.5 * (RR.Bottom - RR.Top);

  //distances to rectangle center
  dx := CX - 0.5 * (RR.Left + RR.Right);
  dy := CY - 0.5 * (RR.Top + RR.Bottom);

  //rectangle sides divide plane to 9 parts,
  t := dx + wh;
  if t < 0 then
    SquaredDist := t * t
  else begin
    t := dx - wh;
    if t > 0 then
      SquaredDist := t * t
  end;
  t := dy + hh;
  if t < 0 then
    SquaredDist := SquaredDist + t * t
  else begin
    t := dy - hh;
    if t > 0 then
      SquaredDist := SquaredDist + t * t
  end;

  if SquaredDist < CR * CR  then
    Result := 0
  else
    Result := Sqrt(SquaredDist)- CR;
end;

答案 1 :(得分:1)

euclid模块。安装时:

pip install euclid

然后像这样使用它:

>>> from euclid import *

>>> circ = Circle(Point2(3., 2.), 2.)
>>> line = Line2(Point2(0., 0.), Point2(-1., 1.))
>>> line.distance(circ)
1.5355339059327378