Matplotlib从输入中绘制给定边的三角形

时间:2017-05-23 10:54:35

标签: python matplotlib

我尝试使用Matoplotlib在python中绘制一个三角形,其边尺寸来自输入。下面你将看到我的代码,如何获取我的变量并在Matplotlib中绘制一个三角形?

import numpy as np
import turtle
from turtle import *
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import matplotlib.patches as patches



def triangle_angle(t, v, w):
    """Diese Funktion ergibt den Eck zwischen v und w"""

    cosT=np.divide((v**2+w**2-t**2),2*v*w)
    alfaT=np.arccos(cosT)
    alfaT=np.degrees(alfaT)
    return alfaT

def triangle(a,b,c):

    l=[]
    if (a+b>c) and (a+c>b) and (b+c>a) : #
        l.append(True)   
        l.append(np.sum([a,b,c]))
        p = float(np.divide(l[1], 2))       #Berechnet die haelfte des Umfangs
        l.append(np.sqrt(np.prod([p, (p - a), (p - b), (p - c)])))    #Berechnet die Flaeche mittles Heron Formula
    else:
        l.append(False)                     #Gibt dem ersten Element den Wert False
        l.append("Diese Zahlen koennen kein Dreieck konstruieren, Das Umfang koennte nicht berechnet sein")
        l.append("Die Flaeche koennte nicht berechnet sein") # Die Flaeche und Umfang koennte nicht berechnet werden
    return(l)

print("Dieses Programm prueft ob es mit 3 gegebene Laengen ein Dreickes gibt, berechnet \
 die Flaeche und das Umfang des Dreiecks und es zeichnet")

x=float(raw_input("geben Sie die erste Zahl ein  "))
y= float(raw_input("geben Sie die erste Zahl ein  "))
z= float(raw_input("geben Sie die erste Zahl ein  "))
if (x<=0) or (y<=0) or (z<=0):
    print("Eine oder mehrere Zahlen sind nicht positiv, bitte geben Sie die !Positive! Zahlen noch einmal. ")
    x=float(raw_input("geben Sie die erste Zahl ein  "))
    y= float(raw_input("geben Sie die erste Zahl ein  "))
    z= float(raw_input("geben Sie die erste Zahl ein  "))
    if triangle(x,y,z)[0] == True:
        print("So ein Dreiecks gibt es. Das Umfang ist "+str(triangle(x,y,z)[1])+" und die Flaeche ist "+str(triangle(x,y,z)[2]))
    else:
        print("So ein Dreiecks gibt es nicht")
else:
    if triangle(x,y,z)[0] == True:
        print("So ein Dreiecks gibt es. Das Umfang ist "+str(triangle(x,y,z)[1])+" und die Flaeche ist "+str(triangle(x,y,z)[2]))
    else:
        print("So ein Dreiecks gibt es nicht")



fig1 = plt.figure()
ax1 = fig1.add_subplot(111, aspect='equal')
ax1.add_patch(patches.RegularPolygon((0.5, 0.5),3,0.2,))
plt.show()

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

可以使用RegularPolygon在matplotlib中绘制等边三角形。但是,如果三角形的边可能不同,则不能选择。

因此,需要将三角形绘制为一般Polygon。因此需要边缘点的坐标。

为简单起见,我们可以选择沿x轴定位最长边(c),这将三角形的前两个点确定为(0,0)(c,0)。剩下的就是计算三角峰的坐标。

import numpy as np
import matplotlib.pyplot as plt

def calc_angles(a,b,c):
    alpha = np.arccos(  (b**2 + c**2 - a**2) /(2.*b*c) )
    beta = np.arccos(  (-b**2 + c**2 + a**2) /(2.*a*c) )
    gamma = np.pi-alpha-beta
    return alpha, beta, gamma

def calc_point(alpha, beta, c):
    x = (c*np.tan(beta) )/( np.tan(alpha)+np.tan(beta) )
    y = x * np.tan(alpha)
    return (x,y)

def get_triangle(a,b,c):
    z = np.array([a,b,c])
    while z[-1] != z.max():
        z = z[[2,0,1]] # make sure last entry is largest
    alpha, beta, _ = calc_angles(*z)
    x,y = calc_point(alpha, beta, z[-1])
    return [(0,0), (z[-1],0), (x,y)]

a = 4
b = 3
c = 2

fig, ax = plt.subplots()
ax.set_aspect("equal")

dreieck = plt.Polygon(get_triangle(a,b,c))
ax.add_patch(dreieck)
ax.relim()
ax.autoscale_view()
plt.show()

enter image description here