我正在实现一个几何求解程序,它将尝试使用给定的数据求解图中的所有其他测量值(参见图像链接)
在这样的图中,形状的长度或尺寸是隐含地相关联的。例如,如果知道矩形A的长度,则知道矩形B的长度,因为图形描述表示矩形A和B是相同的。如果知道半圆C的直径,人们也知道矩形A和B的宽度。最后,半圆C的直径与面积相关,面积= pi *(D / 2)^ 2
因此,我想实现一种算法,使得当链接变量之一(例如面积,长度,直径,半径)改变时,剩余的链接变量也会适当地改变。
您认为实施此方法的最佳方式是什么?例如,我可以使用递归来更新所有链接变量,或getter和setter属性吗?
我使用python作为我的首选语言。 感谢。
答案 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]