如何最好地实现链接变量?

时间:2018-06-03 08:08:27

标签: python geometry

我正在实现一个几何求解程序,它将尝试使用给定的数据求解图中的所有其他测量值(参见图像链接)

在这样的图中,形状的长度或尺寸是隐含地相关联的。例如,如果知道矩形A的长度,则知道矩形B的长度,因为图形描述表示矩形A和B是相同的。如果知道半圆C的直径,人们也知道矩形A和B的宽度。最后,半圆C的直径与面积相关,面积= pi *(D / 2)^ 2

因此,我想实现一种算法,使得当链接变量之一(例如面积,长度,直径,半径)改变时,剩余的链接变量也会适当地改变。

您认为实施此方法的最佳方式是什么?例如,我可以使用递归来更新所有链接变量,或getter和setter属性吗?

我使用python作为我的首选语言。 感谢。

A figure where the measurements are linked

1 个答案:

答案 0 :(得分:0)

您可以将其表达为约束满足问题

CA = 20
CA = Cr^2 * Pi/2
Ba = Aa
Bb = Ab
Aa = 3
Ab = 2 * Cr

并使用Z3(具有python接口(例如,参见此intro))解决该问题:

from z3 import *

CA, Cr, Ba, Bb, Aa, Ab = [Real(v) for v in ["CA", "Cr", "Ba", "Bb", "Aa", "Ab"]]
E1 = CA == 20
E2 = CA == Cr*Cr * 3.14159/2
E3 = Ba == Aa
E4 = Bb == Ab
E5 = Aa == 3
E6 = Ab == 2 * Cr
C1 = Cr > 0

s = Solver()
s.add(E1, E2, E3, E4, E5, E6, C1)
if str(s.check()) == 'sat':
  print(s.model())
else:
  print("not solvable")

输出:

[Cr = 3.5682497392?,
 Aa = 3,
 Bb = 7.1364994785?,
 Ab = 7.1364994785?,
 Ba = 3,
 CA = 20]