Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 算法:创建具有最大高度的屋顶_Algorithm_Scanline - Fatal编程技术网

Algorithm 算法:创建具有最大高度的屋顶

Algorithm 算法:创建具有最大高度的屋顶,algorithm,scanline,Algorithm,Scanline,我在一本书中发现了这个问题,正拼命地想解决它。问题本身是:创建具有最大高度的屋顶(非平屋顶)。这些墙要么成90度角,要么平行 我的方法: 我有所有的边缘点。所以我可以使用扫描线方法。我将在x轴和y轴上对所有点进行排序。然后,我将浏览我的全部点列表,并绘制一条与墙成45°的线。我将检查是否有任何线与我已绘制的当前线相交。如果没有匹配,我将转到下一点,再画一条与墙成45°的线。现在,最后两条线相交的可能性很高,因此我将在交点处创建一个新点 我的问题是会有很多特殊情况。有没有一个我没有想到的更简单的方

我在一本书中发现了这个问题,正拼命地想解决它。问题本身是:创建具有最大高度的屋顶(非平屋顶)。这些墙要么成90度角,要么平行

我的方法:
我有所有的边缘点。所以我可以使用扫描线方法。我将在x轴和y轴上对所有点进行排序。然后,我将浏览我的全部点列表,并绘制一条与墙成45°的线。我将检查是否有任何线与我已绘制的当前线相交。如果没有匹配,我将转到下一点,再画一条与墙成45°的线。现在,最后两条线相交的可能性很高,因此我将在交点处创建一个新点
我的问题是会有很多特殊情况。有没有一个我没有想到的更简单的方法?还有其他更适合这种问题的算法吗?你对这种问题有什么看法

示例:
这就是想象屋顶的样子。

我不确定你的意思是否是这样,但我的回答是要达到屋顶的最大peek高度,而不是最大平均高度

此问题中的最大peek高度由适合您的结构的最大平方确定

所以要找到它,你只需要寻找可以容纳的最大平方,然后执行一个简单的金字塔高度计算。例如,如果您发现一个边沿为
a
的正方形,并且您正在构建屋顶,与您提到的底部成45度角,则:
Peek=sqrt(3)*a

找到最大平方不应该是一项复杂的任务:对于结构中的每个角,沿直线向各个方向(上、下、左、右)移动,直到离开结构(假设我们获得了这些值
上、下、左、右
),可以从角点构造的最大平方是
min{up,left},min{up,right},min{down,left},min{down,right}
之间的最大值。最大平方是从任意角点得到的最大值


现在构造一个金字塔,其中从角点开始的值最大。在结构的其余部分,你可以做你想做的任何事情,因为它不会超过这个金字塔的高度。

许多人批评我如何提出我的问题,即缺少某些东西,实际上缺少输入。因此,作为输入,我有一组点示例:
(0,0)(6,0)(6,-2)(8,-2)(8,8)(-2,8)(-2,3)(0,3)
按正确的顺序

接下来我要做的就是像图1一样放置这些点。在我的例子中,我把它们放在了右下角。现在需要查看哪些点在形状中,哪些点不在形状中。通过将点与建筑的水平线和垂直线相交,可以很容易地发现这一点。如果你发现一个不均匀的数字,你就知道该点在表格中。否则我们将删除它

在所有这些之后,我们试图找到从我们找到的每个点(红线)可以创建的最大矩形。我们现在唯一缺少的是在右下角的矩形上创建一个新点,并在左上角创建另一个矩形(黄线)。正如在我的例子中所看到的,我们在这个例子中通过使用矩形的较小边找到了最大的正方形。这除以2将得到形状的最大高度


如果您需要进一步的澄清,请毫不犹豫地询问我。

您的问题中显然缺少一些约束条件,如前所述:恒定周长?屋顶瓦面积?我不认为在你的房子里放一个弯板会改变任何事情——你在一边保存的东西恰恰是你在另一边添加的东西,所以你可以保持房子“直线”。(你可以通过取下“下分支”,将其分离,然后翻转来看到这一点——它现在将与另一块完全匹配,并形成一个线性屋顶)。我不完全确定“线性屋顶”的含义,但我想创建的只是“倾斜屋顶”。我不认为我有多少领域是重要的。我想创造尽可能高的屋顶。你的设计必须满足哪些约束条件。我想象“在给定的尺寸(覆盖的房屋面积)和给定的屋顶面积(>房屋面积)下,最大化高度”。否则,你的解决方案空间是没有边界的。那么-你能澄清一下吗?如果你想要一个更高的屋顶,不要把屋顶板放在45度的位置…让它们成89度或其他什么-只要你保持在90度以下,它们仍然会在上面的某个地方相交,而且越接近90度,屋顶越高(也越锋利)峰值。@DaveGalvin同意……这只是Floris指出的缺少的约束之一。问题显然比陈述的内容更重要……我知道我的问题缺少很多东西,但我已经找到了答案,与你的答案非常相似。我也找到了我的输入。我将澄清问题的内容确切的答案是。