質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1100閲覧

角度と線の長さを入力してツリー状の作図をしたい

yonhark0

総合スコア11

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/03 07:35

線分の長さと角度を指定して下記のようなツリー状の作図をしたいです。
右の図の緑の部分を描く方法が分からなくて困っています。

平面から青の線を描くことはできたのですが、角度がついているところから、緑の線のように
更に角度をつけることはできるのでしょうか。
(緑の線は手書きで書いたので歪んでるかもしれません、)
イメージ説明
このプログラムで赤と青の線を描きました。

python

1plt.plot([0,100],[0,0],c='red') 2 3#a=赤線の長さ, b=青線の長さ, B=青線の数, angle=角度 4def ANG(a, b, B, angle): 5 P = math.cos(angle/2/180*math.pi) 6 Q = math.sin(angle/2/180*math.pi) 7 plt.plot([a,(a+b*P)],[0,b*Q],c='blue') 8 plt.plot([a,(a+b*P)],[0,-b*Q],c='blue') 9 for i in range(3,B+1): 10 if i % 2 == 0: 11 plt.plot([a*((i-2)/(B-1)),(a*((i-2)/(B-1))+b*P)],[0,b*Q],c='blue') 12 else: 13 plt.plot([a*((i-2)/(B-1)),(a*((i-2)/(B-1))+b*P)],[0,-b*Q],c='blue') 14 15 16ANG(100, 30, 5, 60) 17

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/08/03 07:44 編集

質問の図を生成するような「線分の長さと角度」はどのような形式 (リスト?)で与えられるのでしょうか?
yonhark0

2020/08/03 07:49

tiitoiさん 関数を作成してプログラムの一番下のANG(100,30,5,60)のように4つの数字で与えようと思っていました。
aokikenichi

2020/08/04 09:09

「更に角度をつけることはできるのでしょうか。」 出来ます。 という回答でいいのでしょうか。違いますよね、ならば緑線を描く仕様をきちんと示してください。 恐らく青線の端点から青線の延長線上に対して角度angleG度で開いたものを2本で長さはg、で指定とか
guest

回答1

0

ベストアンサー

Python

1import math 2 3plt.plot([0,100],[0,0],c='red') 4 5#a=赤線の長さ, b=青線の長さ, c=緑線の長さ, B=青線の数, angle=角度 6def ANG(a, b, c, B, angle): 7 P = math.cos(angle/2/180*math.pi) 8 Q = math.sin(angle/2/180*math.pi) 9 plt.plot([a,(a+b*P)],[0,b*Q],c='blue') 10 plt.plot([(a+b*P), (a+b*P)-c*Q], [b*Q, b*Q+c*Q], c='green') 11 plt.plot([(a+b*P), (a+b*P)+c*P], [b*Q, b*Q], c='green') 12 plt.plot([a,(a+b*P)],[0,-b*Q],c='blue') 13 plt.plot([(a+b*P), (a+b*P)-c*Q], [-b*Q, -b*Q-c*Q], c='green') 14 plt.plot([(a+b*P), (a+b*P)+c*P], [-b*Q, -b*Q], c='green') 15 16 for i in range(3,B+1): 17 if i % 2 == 0: 18 plt.plot([a*((i-2)/(B-1)),(a*((i-2)/(B-1))+b*P)],[0,b*Q],c='blue') 19 plt.plot([(a*((i-2)/(B-1))+b*P), (a*((i-2)/(B-1))+b*P)-c*Q], [b*Q, b*Q+c*Q], c='green') 20 plt.plot([(a*((i-2)/(B-1))+b*P), (a*((i-2)/(B-1))+b*P)+c*P], [b*Q, b*Q], c='green') 21 else: 22 plt.plot([a*((i-2)/(B-1)),(a*((i-2)/(B-1))+b*P)],[0,-b*Q],c='blue') 23 plt.plot([(a*((i-2)/(B-1))+b*P), (a*((i-2)/(B-1))+b*P)-c*Q], [-b*Q, -b*Q-c*Q], c='green') 24 plt.plot([(a*((i-2)/(B-1))+b*P), (a*((i-2)/(B-1))+b*P)+c*P], [-b*Q, -b*Q], c='green') 25 26 27ANG(100, 30, 15, 5, 60)

もっと効率よく書けるかと思いますが、まぁこんなものかと。
次の枝はもう分かりますよね。ご自身でトライなさってください。

イメージ説明

投稿2020/08/13 10:17

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問