🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3751閲覧

円の軌跡を点を用いて描画する

tthk

総合スコア11

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/10 06:34

編集2019/12/10 09:10

前提・実現したいこと

円の軌跡をplt.fill()を用いて描画したいです.そのために円の軌跡の点を求める必要があるのですがどのように求めたら良いでしょうか?

該当のソースコード

python

1import matplotlib.pyplot as plt 2import matplotlib.patches as patches 3import random 4 5fig = plt.figure() 6ax = plt.axes() 7 8# ここで与える点と円の半径rからplt.fill(x, y)におけるxとyを求めたいです. 9x = [random.random()+i for i in range(100)] 10y = [random.random()+i for i in range(100)] 11r = 5 12 13for i in range(len(x)): 14 c = patches.Circle(xy=(x[i], y[i]), radius=r, fc='b') 15 ax.add_patch(c) 16 17plt.axis('scaled') 18ax.set_aspect('equal') 19

追記

円の数を増やせば

python

1fig = plt.figure() 2ax = plt.axes() 3 4x = [i/10 for i in range(100)] 5y = [0 for i in range(100)] 6 7# fc = face color, ec = edge color 8for i in range(len(x)): 9 c = patches.Circle(xy=(x[i], y[i]), radius=1, fc='b') 10 ax.add_patch(c) 11 12plt.axis('scaled') 13ax.set_aspect('equal')

イメージ説明
このように描画できますが,円の数が少ないと
イメージ説明
このように円間に隙間が生じてしまうので,これをなくすためにplt.fillを用いたいと考えております.

また,円の大きさを変えたりしたいので,円が動く軌跡の周囲の点を得たいです.

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

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

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

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

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

guest

回答1

0

ベストアンサー

半径 r の円周上の点は極座標

x = r * sin(t)
y = r * cos(t)

で生成すればよいと思います。

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4n_points = 100 # 点の数 5theta = np.linspace(0, 2 * np.pi, n_points) 6radius = 5 # 半径 7 8x = radius * np.sin(theta) 9y = radius * np.cos(theta) 10 11fig, ax = plt.subplots() 12ax.set_aspect("equal") 13ax.plot(x, y, ".")

イメージ説明

追記

plot() で linewidth を太めに設定して、線を引けばいいのではないでしょうか。

python

1import matplotlib.pyplot as plt 2import random 3 4fig, ax = plt.subplots() 5ax.set_aspect("equal") 6 7# ここで与える点と円の半径rからplt.fill(x, y)におけるxとyを求めたいです. 8xs = [random.random() + i for i in range(10)] 9ys = [random.random() + i for i in range(10)] 10r = 0.5 11 12for p in zip(xs, ys): 13 ax.add_patch(plt.Circle(xy=p, radius=r, fc="none", ec="k", lw=1)) 14ax.plot(xs, ys, lw=r * 50, alpha=0.3) 15 16ax.autoscale()

イメージ説明

追記

ベクトル (x, y) に直行するベクトルは (y, -x), (y, x) になります。
これをノルムで割り、単位ベクトルにして、半径をかけると、円周上の点になります。

直角なベクトルを作り出す – TauStation

あまりスマートに書けなかったですが、コードにすると以下のようになります。

python

1import matplotlib.pyplot as plt 2import numpy as np 3 4fig, ax = plt.subplots() 5ax.set_aspect("equal") 6 7points = np.array([(random.random() + i, random.random() + i) for i in range(10)]) 8r = 0.5 9 10 11def get_points(points): 12 sides1, sides2 = [], [] # 両側の点を格納する配列 13 14 for i in range(len(points) - 1): 15 p1, p2 = points[i], points[i + 1] 16 v = p2 - p1 # p1 -> p2 のベクトル 17 18 # v に直交する単位ベクトル 19 n = np.array([v[1], -v[0]]) 20 n /= np.linalg.norm(n) 21 22 # 直交する単位ベクトル * 半径が円周の点 23 if i == 0: 24 sides1.append(p1 + n * r) 25 sides2.append(p1 - n * r) 26 sides1.append(p2 + n * r) 27 sides2.append(p2 - n * r) 28 29 return np.array(sides1 + sides2[::-1]) 30 31 32sides = get_points(points) 33print(sides) 34 35ax.fill(sides[:, 0], sides[:, 1], alpha=0.5, ec="k") 36for p in points: 37 ax.add_patch(plt.Circle(xy=p, radius=r, fc="none", ec="k", lw=1)) 38ax.autoscale()

イメージ説明

投稿2019/12/10 07:26

編集2019/12/10 10:23
tiitoi

総合スコア21956

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

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

tthk

2019/12/10 07:40

早速のご回答ありがとうございます. 私の説明不足で申し訳ございませんが,円を移動させたときの軌跡の周囲の座標を得,その周囲を一括でplt.fill()で描画したいと考えております.私の方法やご回答いただいた方法では円を移動させたときに円と円の間にムラが生じてしまい,またムラが生じなくなるように間隔を短くすると処理に時間がかかるため前述の方法(軌跡の周囲の座標を得る)があればご教授いただきたいです. よろしくお願いいたします.
stdio

2019/12/10 07:59

すみません。私の文章読解能力が悪いのかしら... 「円を移動させたときに円と円の間にムラが生じてしまい」とは、どういうことでしょうか 2重で描画されるということですか? それとも円を平行移動させたいということでしょうか?
tiitoi

2019/12/10 08:01

意図とあっているかどうかわからないですが、円の直径の同じぐらいの太さの線で軌跡を描画したいということでしょうか。
tthk

2019/12/10 09:14

@stdioさん 追記いたしました."ムラ"というのは表現がよくありませんでした."間隔"のほうが正しいです.混乱させてしまいすみません. 描画ソフトで円をドラッグして軌跡を書くようなことですので,円を点間で平行移動をさせたいということと等しいです.(その移動させる間の円の軌跡の周りの点を得たいです)
tthk

2019/12/10 09:17

@tiitoiさん 追記いただきありがとうございます.私の質問も追記いたしました. やりたいこととしてはそのプログラムで合っているのですが,今後軌跡の点を用いたり,円の大きさを変えたりしたいと思っておりますので,軌跡の点を用いて描画を行いたいと考えております.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問