我远不是数学和英语方面的专家,所以提前抱歉。
为了使代码更简洁,我创建了一个六边形类。 我现在在里面实现不同的方法。
我的构造函数现在看看这个:
def __init__(self, radius, center_x, center_y, angle=0):
self._dmin = np.sqrt(3)/2
self._radius = radius
self._radius_min = radius * self.dmin
self._center_x = center_x
self._center_y = center_y
self._angle = angle # Angle in degrees
self._radian = np.radians(self.angle)
self._period = 60
我坚持使用 radiusX 和 radiusY 方法。此方法应在输出中给出基于当前六边形中心的从中心到边界的距离。对于 y 为 0 的 radiusX 和 x 为 0 的 radiusY。
我尝试了不同的实现,但到目前为止我得到的更准确的实现是:
def radiusX(self) -> float:
return self.radius_min + Trigonometry.one2Zero2One(x=self.angle%self.period, period=self.period) * (self.radius - self.radius_min)
def radiusY(self) -> float:
return self.radius_min + Trigonometry.zero2One2Zero(x=self.angle%self.period, period=self.period) * (self.radius - self.radius_min)
方法
one2Zero2One() and
zero2One2Zero() 的实现如下:
@staticmethod
def one2Zero2One(x, period):
return 0.5 + 0.5 * np.cos(x * np.pi / (period / 2))
@staticmethod
def zero2One2Zero(x, period):
return 0.5 + 0.5 * np.sin(x * np.pi / (period / 2) - 1.58)
它们允许您获取 0 到 1 之间的响铃值。 Zero2One2Zero 看看这个:
我知道我的两种方法都不好,因为当我用plotly可视化结果时,我直接看到半径不遵循one2Zero2One和zero2One2Zero曲线。在下面的示例中,上方和右侧有一个绿色点,表示 x 和 y 半径的终点:
此图形是通过以下方式获得的:
h = Hexagon(radius=0.5, center_x=0.5, center_y=0.5, angle=j)
fig = go.Figure()
inside = {'x':[], 'y':[]}
outside = {'x':[], 'y':[]}
radius = {'x':[h.center_x + h.radiusX(), h.center_y], 'y':[h.center_y, h.center_y + h.radiusY()]}
print(h.radiusX())
for i in range(int(10e3)):
# print(i,'/',int(10e3))
x, y = random(), random()
if h.isPointInside(x, y):
inside['x'].append(x)
inside['y'].append(y)
else:
outside['x'].append(x)
outside['y'].append(y)
fig.add_trace(go.Scatter(x=inside['x'], y=inside['y'], mode='markers', name='Inside'))
fig.add_trace(go.Scatter(x=outside['x'], y=outside['y'], mode='markers', name='Outside'))
fig.add_trace(go.Scatter(x=radius['x'], y=radius['y'], mode='markers', name='radius', marker={'size':10}))
fig.show()
我想获得帮助来找到根据当前六边形角度获取半径X和半径Y的正确方程。
假设我们有一个 n 多边形内切于半径为 r 的圆。
然后:
(1) α = 360°/n
从基本三角学:
(2) h/r = cos(γ) = cos(α/2),因此 h = r cos(α/2)
(3) h/dx = cos(β),因此 dx = h/cos(β)
将(2)代入(3),可得
(4) dx = r cos(α/2) / cos(β)
然后将(1)代入(4),最后
(5) dx = r cos(180°/n) / cos(β)
您可以类似地锻炼dy。
为了研究此类几何问题,GeoGebra 效果很好。这就是我用来制作上面插图的。这就是您应该用来为您的问题制作正确标记的插图的方法。帮助我们帮助您!