【问题标题】:python express a set as a sum/difference of other setspython将一个集合表示为其他集合的和/差
【发布时间】:2018-06-07 11:41:32
【问题描述】:

我正在使用 python 来解决这样的几何问题: [a geometry problem where one is required to express the shaded area as a sum /difference of the shapes in the figure]

在这个问题中,需要将阴影区域表示为形状的和/差,并据此计算面积。

例如,

阴影区域 = 子区域 A + C + E

大半圆 = A + B + C

小半圆 = C + D + E

三角形 = B + C + D

因此,阴影面积 = A + B + C + (C + D + E) - (B + C + D)

因此,为了解决这些问题,我需要一种算法,它可以将由子区域 (A,C,E....) 组成的查询集表示为多个子区域的和或差(不需要联合或交集) shape字典中的集合(如B、C、D)

我打算通过蛮力的方式来做(尝试检测到的所有形状的所有组合),但是,当图形变得复杂时,就像这里一样, Figure with many small shapes,复杂度可能会失控。

有没有解决这个问题的有效方法?

非常感谢

【问题讨论】:

  • (与问题无关)三角形的 4 和 8 边之间有 90º 角?还如何存储形状(由曲线分隔的形状)?
  • 是的。它是一个直角三角形。我首先使用区域分割算法找到子区域(即找到以黑线为界的白色空间/阴影空间)。然后我使用一些形状检测算法(如霍夫圆)找到形状。我找到每个形状的足迹(即形状占据的像素)并将它们与 subregions 的足迹进行比较。如果一个子区域中的所有像素都包含在一个形状中,那么它就包含在一个形状中。从那时起,我只需将形状的子区域定义存储为集合。

标签: python sum set combinations


【解决方案1】:

你只需要解这个方程:

A + C + E = x(A + B + C) + y(C + D + E) + z(B + C + D)

像这样:

A + C + E = A * ( x ) + B * ( x + z) + C * ( y + z ) + D * ( z + y ) + E * ( y )

A * ( x - 1 ) + B * ( x + z ) + C * ( x + y + z - 1 ) + D * ( z + y ) + E * ( y - 1 ) = 0

由于 A,B,C,D 和 E 总是不为零,因此我们有:

x - 1 = 0
x + z = 0
x + y + z - 1 = 0
z + y = 0
y - 1 = 0

其中 y = 1、z = -1 和 x = 1,或者

A + C + E = (A + B + C) + (C + D + E) - (B + C + D)。

所以现在我们只需要在 Python 中做同样的事情。

import numpy as np

shadow = [1,0,1,0,1]
big_circle = [1,1,1,0,0]
small_circle = [0,0,1,1,1]
triangle = [0,1,1,1,0]
universe = [big_circle, small_circle, triangle]
print("shadow : " + str(shadow) )
print("universe : " + str(universe) )
variables = [0] * len(universe)
equations = []
for key in zip(*universe):
    equations.append(list(key))
print("equations : " + str(equations) )
a = np.array(equations)
b = np.array(shadow)
x = np.linalg.lstsq(a,b)
print("Result: \n" )
print( str(x[0]) )

这就是你会得到的:

shadow : [1, 0, 1, 0, 1]
universe : [[1, 1, 1, 0, 0], [0, 0, 1, 1, 1], [0, 1, 1, 1, 0]]
equations : [[1, 0, 0], [1, 0, 1], [1, 1, 1], [0, 1, 1], [0, 1, 0]]
Result: 

[ 1.  1. -1.]

如果您对其他设置执行此操作并且得到非整数结果,则无法将阴影区域生成为您提供的程序形状的组合。

【讨论】:

  • Hi Ruan,感谢您的回答。我试过你的方法。但是,我可以问一下,我认为 lstsq 的结果是(解决方案、残差、排名和奇异值)的元组吗?我可以通过循环获得可能的解决方案列表吗?
  • 对不起,我弄错了。我修正了我的答案。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2013-12-16
  • 2015-04-06
  • 2015-07-17
  • 1970-01-01
  • 2011-12-24
  • 2016-02-25
  • 1970-01-01
相关资源
最近更新 更多