2017-05-23 2 views
0

私は入力から与えられた辺のサイズでMatoplotlibを使って三角形をPythonで描画しようとしています。下に私のコードが表示されます。どのように変数をとり、Matplotlibで三角形を描くことができますか?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

あなたは三角形を描画する方法を求めていますか? – kazemakase

+0

@kazemakaseはい、入力に基づいて三角形を描く方法を尋ねています。したがって、var x = 5 y = 7 z = 7の場合は、入力に基づいて三角形を描画する方法を尋ねています。プログラムは私にこれらの辺を持つ三角形を描きます。 – Radu033

+1

@kazemakase matplotlibは座標で動作します。座標を与えれば、イメージが描画されます。 3つのxと3のyを持つ三角形の場合、(0,0)、(1,0)、(1,1)が一例です。プロット関数を使用して、x = [0,1,1]、y = [0,0,1] ax.plot(x、y)としてプロットすることができます。もちろん、これらの値が入力から来るようにするには、ユーザーが自分のデータを入力してリストに追加するためのforループを作成します。 –

答えて

1

RegularPolygonを使用して、正三角形をmatplotlibにプロットすることができます。ただし、三角形の辺が異なる場合は、これはオプションではありません。

したがって、三角形は一般的なPolygonとしてプロットする必要があります。したがって、エッジ点の座標が必要です。

簡略化のため、x軸に沿って最も長い辺(c)を配置すると、三角形の最初の2つの点が(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

+0

すばらしい説明と素敵なコードをありがとう、すべて意味があります:) – Radu033

関連する問題