My goal is to input the coordinates of the vertices of a triangle and have
significant properties printed for a human to read.
I'm aware of the limitation of floating point arithmetic, and I was able to
produce an accurate area with the decimal module.
return (sp*(sp-a)*(sp-b)*(sp-c)).sqrt().quantize(dec('1.0000000000'))
However, a version using sympy is also desirable. Do I need to install
mpmath / gmpy to compensate for the floating point errors?
Here is the test code:
import sympy.functions as sym
import sympy.geometry as geo
sqrt = sym.sqrt
def distance(A, B):
"""
A & B are objects with x and y attributes
:return: the distance between A and B
"""
dx = B.x - A.x
dy = B.y - A.y
return sqrt(dx**2 + dy**2)
def sides(A, B, C):
"""
A, B & C are objects with x and y attributes
:return: sorted side lengths (smallest to largest)
"""
a = distance(B, C)
b = distance(A, C)
c = distance(A, B)
return sorted((a, b, c,), key=float)
def area(a, b, c):
"""
a, b & c are the side lengths of the trigon
:return: area of the trigon
"""
p = a + b + c # perimeter
sp = p / 2 # semi-perimeter
return sqrt(sp*(sp-a)*(sp-b)*(sp-c))
if __name__ == '__main__':
p = geo.Point
A = p(0, 0)
B = p(3, 0)
C = p(3, 3)
sides = sides(A,B,C)
print(sides)
print(area(*sides))
Output:
[3, 3, 3*sqrt(2)]
sqrt(-3*sqrt(2)/2 + 3)*sqrt(27*sqrt(2)/4 + 27/2)
Obviously I want 9/2 as the result for the area... but it is giving me a
representation of 4.4999999999...
What can I do about this?
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/f0e6480a-f56d-43c7-a07d-883c97103834%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.