Sympy 错误 - 几何错误
Sympy errors - geometry bug
我正在编写一个程序,它需要两个长边为 1 的 L 形图形。
L图是这样的:
这是我的代码:
from sympy import *
from sympy.geometry import *
import math
fi=acos(2/sqrt(5))
fi2=asin(2/sqrt(5))
class L:
def __init__(self, alfa, x, y):
self.alfa = alfa
self.A = Point(x,y)
self.B = Point(x+cos(alfa),y+sin(alfa))
self.C = Point(x+(sqrt(5)/2)*cos(alfa+fi),y+(sqrt(5)/2)*sin(alfa+fi))
self.D = Point(x+(sqrt(2)/2)*cos(alfa+45),y+(sqrt(2)/2)*sin(alfa+45))
self.E = Point(x+(sqrt(5)/2)*cos(alfa+fi2),y+(sqrt(5)/2)*sin(alfa+fi2))
self.F = Point(x+cos(90+alfa),y+sin(alfa+90))
self.P = Polygon(self.A, self.B, self.C, self.D, self.E, self.F)
def inter(a=L(0,0,0), b=L(0,0,0)):
t=false
for i in range(len((a.P).vertices)):
if((b.P.encloses_point((a.P).vertices[i]))==true):
t=true
print("wrong:", i,"th vertex of 1st polygon")
print("(",(a.P).vertices[i].x,",",(a.P).vertices[i].y,")")
for j in range(len(b.P.vertices)):
print("(", b.P.vertices[j].x,", ", b.P.vertices[j].y,")")
break
for i in range(len((b.P).vertices)):
if((a.P.encloses_point((b.P).vertices[i]))==true):
t=true
break
return t
print(inter(L(0,0,0),L(0,1,0)))
我觉得这段代码很好,但我有一个错误。
此代码 return 表示两个 L 有交集。为了让 reader 明白一点,L 的外观是这样的:
所以,C 不在第二个 L 中,这是我的代码的输出:
wrong 2th vertex of 1st polygon
( 1 , 1/2 )
( 1 , 0 )
( 2 , 0 )
( 2 , 1/2 )
( sqrt(2)*cos(45)/2 + 1 , sqrt(2)*sin(45)/2 )
( 3/2 , 1 )
( cos(90) + 1 , sin(90) )
True
另外根据文档(https://docs.sympy.org/latest/modules/geometry/polygons.html),多边形边界上的点被认为是错误的。所以 C hace 指向 return false,但是程序 returns true。当我尝试更简单的代码时,它工作正常:
>>> a=Polygon((1,0),(2,0),(2,1),(1,1))
>>> a.encloses_point(Point(1,1/2))
False
我不知道哪里出了问题。函数 encloses_point 发生了什么?有人可以帮忙吗?
提前致谢
交叉点由公共点组成。 SymPy 不计算所提到的公共区域 。虽然边界上的点不是 在 多边形中,但点被认为是有效的相交实体:
>>> from sympy import Triangle
>>> Triangle((0,0),(1,1),(0,1)).intersection(Triangle((0,0),(-1,-1),(0,-1)))
[Point2D(0, 0)]
在您的情况下,这是逻辑问题,但不是实际问题。您认为您正在处理 L 形多边形,但事实并非如此。 SymPy 三角函数以弧度解释它们的参数,但我怀疑您认为您正在使用度数(cos(90) != 0
但 cos(rad(90)) = 0
,其中 rad
是从 sympy.geometry.polygon
导入的。 (1, 1/2)
在您定义的多边形中...只是不在您认为正在处理的多边形中。 :-)
我正在编写一个程序,它需要两个长边为 1 的 L 形图形。
L图是这样的:
这是我的代码:
from sympy import *
from sympy.geometry import *
import math
fi=acos(2/sqrt(5))
fi2=asin(2/sqrt(5))
class L:
def __init__(self, alfa, x, y):
self.alfa = alfa
self.A = Point(x,y)
self.B = Point(x+cos(alfa),y+sin(alfa))
self.C = Point(x+(sqrt(5)/2)*cos(alfa+fi),y+(sqrt(5)/2)*sin(alfa+fi))
self.D = Point(x+(sqrt(2)/2)*cos(alfa+45),y+(sqrt(2)/2)*sin(alfa+45))
self.E = Point(x+(sqrt(5)/2)*cos(alfa+fi2),y+(sqrt(5)/2)*sin(alfa+fi2))
self.F = Point(x+cos(90+alfa),y+sin(alfa+90))
self.P = Polygon(self.A, self.B, self.C, self.D, self.E, self.F)
def inter(a=L(0,0,0), b=L(0,0,0)):
t=false
for i in range(len((a.P).vertices)):
if((b.P.encloses_point((a.P).vertices[i]))==true):
t=true
print("wrong:", i,"th vertex of 1st polygon")
print("(",(a.P).vertices[i].x,",",(a.P).vertices[i].y,")")
for j in range(len(b.P.vertices)):
print("(", b.P.vertices[j].x,", ", b.P.vertices[j].y,")")
break
for i in range(len((b.P).vertices)):
if((a.P.encloses_point((b.P).vertices[i]))==true):
t=true
break
return t
print(inter(L(0,0,0),L(0,1,0)))
我觉得这段代码很好,但我有一个错误。 此代码 return 表示两个 L 有交集。为了让 reader 明白一点,L 的外观是这样的:
所以,C 不在第二个 L 中,这是我的代码的输出:
wrong 2th vertex of 1st polygon
( 1 , 1/2 )
( 1 , 0 )
( 2 , 0 )
( 2 , 1/2 )
( sqrt(2)*cos(45)/2 + 1 , sqrt(2)*sin(45)/2 )
( 3/2 , 1 )
( cos(90) + 1 , sin(90) )
True
另外根据文档(https://docs.sympy.org/latest/modules/geometry/polygons.html),多边形边界上的点被认为是错误的。所以 C hace 指向 return false,但是程序 returns true。当我尝试更简单的代码时,它工作正常:
>>> a=Polygon((1,0),(2,0),(2,1),(1,1))
>>> a.encloses_point(Point(1,1/2))
False
我不知道哪里出了问题。函数 encloses_point 发生了什么?有人可以帮忙吗?
提前致谢
交叉点由公共点组成。 SymPy 不计算所提到的公共区域
>>> from sympy import Triangle
>>> Triangle((0,0),(1,1),(0,1)).intersection(Triangle((0,0),(-1,-1),(0,-1)))
[Point2D(0, 0)]
在您的情况下,这是逻辑问题,但不是实际问题。您认为您正在处理 L 形多边形,但事实并非如此。 SymPy 三角函数以弧度解释它们的参数,但我怀疑您认为您正在使用度数(cos(90) != 0
但 cos(rad(90)) = 0
,其中 rad
是从 sympy.geometry.polygon
导入的。 (1, 1/2)
在您定义的多边形中...只是不在您认为正在处理的多边形中。 :-)