获取六边形的 x 和 y 半径,无论角度如何

问题描述 投票:0回答:1

我远不是数学和英语方面的专家,所以提前抱歉。

我创建了一个六边形模糊,给出了这种结果: hexagon blur

为了使代码更简洁,我创建了一个六边形类。 我现在在里面实现不同的方法。

我的构造函数现在看看这个:

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。 enter image description here

我尝试了不同的实现,但到目前为止我得到的更准确的实现是:

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 看看这个: zero2One2Zero

在我的课堂上,角度为 0 的六边形是在这个方向: direction

我知道我的两种方法都不好,因为当我用plotly可视化结果时,我直接看到半径不遵循one2Zero2One和zero2One2Zero曲线。在下面的示例中,上方和右侧有一个绿色点,表示 x 和 y 半径的终点: angle1

angle2

angle3

angle4

angle5

angle6

angle7

此图形是通过以下方式获得的:

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的正确方程。

python shapes trigonometry
1个回答
0
投票

enter image description here

假设我们有一个 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 效果很好。这就是我用来制作上面插图的。这就是您应该用来为您的问题制作正确标记的插图的方法。帮助我们帮助您!

© www.soinside.com 2019 - 2024. All rights reserved.