首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求圆与矩形相交的区间

问如何求圆与矩形相交的区间
EN

Stack Overflow用户
提问于 2019-10-04 11:16:33
回答 1查看 243关注 0票数 0

我需要在圆弧上进行积分,这些圆弧是由一个圆和一个矩形的交点产生的,并落在这个矩形内。我可以使用shapely包找到交叉点。但是,我不知道如何获得积分间隔。例如,在下图中,我的代码以弧度(相对于圆的中心)返回[-2.1562, 2.1562],而它应该能够自动理解矩形内的积分间隔是[[2.1562, 3.1415],[-3.1415, -2.1562]] (假设pi = 3.1415)。

​

​

下面是另一个示例:

​

​

我的代码返回[-0.45036, -0.29576, 0.29576, 0.45036],预期的间隔将为[[0.29576, 0.45036], [-0.45036, -0.29576]]。

该代码也应该适用于圆所在的任何其他位置(具有任何半径),无论其中心是在矩形的外部还是内部。

以下是我的代码,使用iPython编写:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import math
import numpy as np
from shapely.geometry import LineString, MultiPoint
from shapely.geometry import Polygon
from shapely.geometry import Point

# Utilities
def cart2pol(xy, center):
    x,y = xy
    x_0,y_0 = center
    rho = np.sqrt((x-x_0)**2 + (y-y_0)**2)
    phi = np.arctan2(y-y_0, x-x_0)
    return(rho, phi)

def pol2cart(rho, phi, center):
    x_0,y_0 = center 
    x = rho * np.cos(phi)+x_0
    y = rho * np.sin(phi)+y_0
    return(x, y)

def distance(A,B):
  return math.sqrt((A[0]-B[0])**2+(A[1]-B[1])**2)

#######################  
rad = 6
center = (-1,5)
p = Point(center)
c = p.buffer(rad).boundary
A = (10,0)
B = (0,0)
C = (0,10)
D = (10,10)

coords = [Point(A), Point(B), Point(C), Point(D)]
poly = MultiPoint(coords).convex_hull

i=c.intersection(poly)

lines = [LineString([A, D]), LineString([D, C]),
         LineString([C, B]), LineString([B, A])]

points = []
for l in lines:
  i = c.intersection(l) 
  if not i.is_empty:
    if i.geom_type == 'MultiPoint':
      for j in range(len(i.geoms)):
        points.append(i.geoms[j].coords[0])
    else:
      points.append(i.coords[0])

# Repeat the tangential points
for k, point in enumerate(points.copy()):
  if abs(distance(center, point)**2 + distance(point, B)**2 - distance(B, center)**2) < 1e-4:
    points.insert(k+1,point)
  elif abs(distance(center, point)**2 + distance(point, D)**2 -distance(D, center)**2) < 1e-4:
    points.insert(k+1,point)

# Sort points in polar coordinates
phis = [cart2pol(point,center)[1] for point in points]
phis.sort()
print(phis)

# Plot the shapes
x,y = c.xy
plt.plot(*c.xy)
for l in lines:
  plt.plot(*l.xy, 'b')
plt.gca().set_aspect('equal', adjustable='box')

我尝试根据交叉点的角度对交叉点进行排序,使交叉点列表中的每两个相邻项都对应于一条圆弧。问题是,当沿着单位圆旋转时,从-pi到pi的角度会有一个跳跃。另外,我不知道如何在给定两个端点的情况下确定弧线是否在矩形内。

EN

回答 1

Stack Overflow用户

发布于 2019-10-04 16:04:00

处理角度范围并不简单。

1)选择一个明确的表示范围,如[-π,π]弧度。

2)编写一个函数,查找圆与(h/v)半平面的交点,并返回一个角度间隔。如果间隔跨越±π边界,则将其一分为二。

3)编写一个函数来查找两个间隔列表之间的交集(这是一个改进的合并问题)。

4)处理四条边,并与得到的区间相交。

5)可能合并跨越±π边界的区间。

​

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58229458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档