绘制不等式算法

时间:2013-03-23 15:31:46

标签: algorithm math graph

我正在使用HTML5画布编写一个简单的图形应用程序。输入是一个像这样的不等式系统(所有函数都是线性的):

4x + y >= 4
x  + y <= 4
x,y >= 0

我想要的输出是一组形成要填充的形状的点。例如,对于此示例,图形将为:

enter image description here
点集:[0,4],[1,0],[4,0]。找到这些点的算法是什么?我知道线的交点是线性系统的解决方案,但我无法弄清楚如何正确填充。请注意,这个问题不是关于图形系统的实现,而是如何找到填充的形状点。

3 个答案:

答案 0 :(得分:2)

在我看来,你的问题确实存在两个问题:方程是否定义了一个闭合的多边形,以及如何填充它?

例如,
*如果你的方程包括x + y> 10,x + y&lt; 5,你无法找到解决办法,没有什么可以填补, *如果你的方程只是x> 0,y&gt; 0,你会遇到问题,因为要绘制的表面是无界/无限的。

对于你的方程组是否有解决方案,我认为大致相当于simplex algorithm in Linear ProgrammingPhase I of the algorithm确定问题是否可行。

该解决方案是否形成闭合多边形不是线性编程通常感兴趣的东西。但是,你可以通过检查4个问题来解决这个问题:最小化x,最大化x,最小化y,最大化y,给定你的不等式,有一个解决方案。如果这些问题中的任何一个没有,那么你知道问题是无限的 - 我认为这意味着多边形没有被关闭。

一旦你知道多边形是关闭的,我只需计算所有线的交点,可能会将其减少到convex hull,然后填充生成的多边形。

答案 1 :(得分:1)

我可以提出以下算法。有必要注意这个算法不是基于找到线交叉点的想法,然后以某种方式确定区域,因为这种方式对于算法实现来说似乎很复杂。
由于计算中的空间无论如何都是离散的,因此引入一些正交网格似乎很自然 所以:

  1. 让我们介绍具有一些特征细胞大小的正交网格。此大小取决于您的问题陈述的一些细节。让我们假设网格具有N * M个节点(x_i,y_j),0&lt; = i&lt; N,0&lt; = j&lt; M
  2. 让我们找到满足所有K个不等式a_k * x1_i + b_k * y1_j-c_k&lt; = 0的所有点(x1_i,y1_j),其中0 <= k <1。 K.应填补这些要点。
  3. 如果网格分辨率足以实现可视化。如果不是,我们必须确定边界点附近的哪条线路通过。为此,我们检查每个边界点及其邻居。如果我们发现该点的邻居违反了Sth不等式,则意味着Sth线在该点与该邻居之间传递。

答案 2 :(得分:1)

你可以利用任何被定义为线性半空间联合的区域必须是单个凸区域,尽管可能是半无限区域,这可能会增加混乱。

  1. 首先添加一个不等式的矩形“窗口”,它是您正在绘制的域的超集。这样,您可以忽略结果为半无限空间的情况。

  2. 找到所有边界对之间的交点。这是两个嵌套循环和一个交叉检查器。 (如果需要,您可以先找到非窗口不等式的所有交集,设置窗口以包含所有这些,然后添加与窗口相关的交叉点。)

  3. 抛弃所有不符合任何不平等的点。

  4. 如果还有任何积分,请使用convex hull algorithm查找所附区域并进行绘制。

  5. 请注意,如果预先知道图形窗口,则可以通过仅考虑窗口内的边界段并使用增强的Bentley-Ottman等排列算法来使交叉点计算更有效。