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) != 0cos(rad(90)) = 0,其中 rad 是从 sympy.geometry.polygon 导入的。 (1, 1/2) 在您定义的多边形中...只是不在您认为正在处理的多边形中。 :-)