RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 711623
Accepted
rudolfninja
rudolfninja
Asked:2020-08-29 00:44:27 +0000 UTC2020-08-29 00:44:27 +0000 UTC 2020-08-29 00:44:27 +0000 UTC

在路径周围画一个矩形

  • 772

任务是找到描述由图元(弧和线)组成的轮廓的矩形的面积(长度和宽度)。我有形成这些图元的点的坐标(图中的红点)

图片1

还有圆心坐标,但现在可能不需要了。我使用以下算法解决了这个问题:

  1. 从所有点进行分段,即将每个点与每个点连接起来;
  2. 在片段中搜索彼此垂直的片段;
  3. 在成对的垂直线段中,他找到了乘积最大的线段。这些是所需矩形的宽度和长度(以及因此的区域)。

该算法适用于大多数形状,包括第一张图中所示的形状。但是在这里我遇到了第二张图片中的一个数字:

绘图2

很明显,我的算法在这里不起作用。他选择了正确的宽度(下底),但没有选择长度,因为 没有底部中心的坐标,因此可以构造一条连接底部中心和最高点的线段。

有一个选项可以找到下底座的中心,但此选项仅适用于第二张图纸。如果图 3 中的情况突然出现,那么该算法将再次失效。因为连接顶部与底部中心的线不会垂直于底部。

绘图3

请告诉我用于查找描述轮廓的矩形的长度和宽度的通用算法的变体。

алгоритм
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2020-08-29T04:43:52Z2020-08-29T04:43:52Z

    这是您的问题的部分解决方案的大纲,用于多边形,没有圆段。

    我将尝试与“旋转卡尺”方法进行类比(我不知道一个好的俄语名称)。

    考虑封闭矩形,其底边与水平面成某个角度 φ。令S(φ)为这个矩形的面积。我们的目标是在 [0, π/2) 上找到该函数的极值。

    让 φ = 0 开始。考虑封闭矩形:

    扫描,是的

    在我们的例子中,封闭矩形的边分别通过顶点A 1 、A 4 和A 1 、A 5 。首先,让我们找到仍然会出现这种情况的角度 φ 的值范围。让我们首先找出底部底座可以旋转多远,以使底部仍然停留在A ₁ 的顶部。该角度将是光束角A ₁ A 2、A ₁ A ₃、A ₁ A ₄、A ₁ A中的最小值₅。同样,我们找到其他四个边的旋转范围。这些范围的交集将给出 φ 值的范围,在该范围内,封闭矩形位于相同的顶点上。

    对于这个范围,我们找到该区域的极值。设A 1 A 4 线段与水平线的夹角为 φ1,A 1 A 5 线段的夹角为φ2。表示d ₁ = | A ₁ A ₄|, d 2 = | A ₁ A ₅| 矩形的垂直边是d ₁ sin(φ − φ₁),水平边是d ₂ sin(φ + π/2 − φ₂) = d ₂ cos(φ − φ₂)。

    面积为d ₁ d 2 sin(φ − φ₁) cos(φ − φ₂) = d ₁ d ₂ (sin (2φ − φ₁ − φ₂) + sin (φ₂ − φ₁))/2。为了找到这个值的极值,我们可以丢弃常数d ₁ d ₂/2 和 sin (φ₂ − φ₁),并记住在参数为 3π/2 + 的点处达到了正弦的最小值k 2π,或在段的末端。

    将线段末端的面积值以及 3π/4 + (φ₁ + φ₂)/2 + k · π(如果它们落在线段上)形式的点相互比较,我们得到该细分市场的最低要求。

    好的。更简单。进一步转动底,我们考虑下底的参考点为A ₅ 的情况,我们重复考虑这部分 φ 的值。我们继续直到 φ 达到值 π/2。

    一切。


    您还需要将此算法推广到弯曲边的情况。在这里,参考点将沿着 φ 变化的圆弧滚动,这原则上允许我们进行相同的考虑。

    敢!

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5