You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求任意旋转角度下六边形X/Y方向半径的正确计算公式

六边形旋转后radiusX与radiusY的计算问题

我实现了一种六边形模糊效果,效果为带有模糊边缘的六边形图案。

为优化代码结构,我创建了Hexagon类,当前构造函数代码如下:

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  # 角度单位为度
    self._radian = np.radians(self.angle)

    self._period = 60

我卡在了radiusX和radiusY方法的实现上:这两个方法需要分别返回y=0时中心到六边形边界的X方向距离,以及x=0时中心到六边形边界的Y方向距离。(示意图展示了X/Y方向半径与六边形边界的对应关系)

我尝试过以下实现,但通过Plotly可视化显示结果不符合预期:

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)

其中Trigonometry类的相关静态方法实现如下:

@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)

我的Hexagon类中,角度为0时的六边形朝向为上下边水平、左右为顶点的正六边形(示意图展示了角度0时六边形的方向)。

可视化结果显示当前实现的半径不符合预期,多个不同角度的测试图显示标记的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)):
    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()

请问基于六边形当前旋转角度,计算radiusX和radiusY的正确公式是什么?


内容的提问来源于stack exchange,提问作者Vénon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:38:09