回答編集履歴

2

d

2019/12/10 10:23

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -95,3 +95,107 @@
95
95
 
96
96
 
97
97
  ![イメージ説明](6c2287a9d62119a8a9c7244d3ca6af1b.png)
98
+
99
+
100
+
101
+ ## 追記
102
+
103
+
104
+
105
+ ベクトル (x, y) に直行するベクトルは (y, -x), (y, x) になります。
106
+
107
+ これをノルムで割り、単位ベクトルにして、半径をかけると、円周上の点になります。
108
+
109
+
110
+
111
+ [直角なベクトルを作り出す – TauStation](http://taustation.com/math-rightangle-vector/)
112
+
113
+
114
+
115
+ あまりスマートに書けなかったですが、コードにすると以下のようになります。
116
+
117
+
118
+
119
+ ```python
120
+
121
+ import matplotlib.pyplot as plt
122
+
123
+ import numpy as np
124
+
125
+
126
+
127
+ fig, ax = plt.subplots()
128
+
129
+ ax.set_aspect("equal")
130
+
131
+
132
+
133
+ points = np.array([(random.random() + i, random.random() + i) for i in range(10)])
134
+
135
+ r = 0.5
136
+
137
+
138
+
139
+
140
+
141
+ def get_points(points):
142
+
143
+ sides1, sides2 = [], [] # 両側の点を格納する配列
144
+
145
+
146
+
147
+ for i in range(len(points) - 1):
148
+
149
+ p1, p2 = points[i], points[i + 1]
150
+
151
+ v = p2 - p1 # p1 -> p2 のベクトル
152
+
153
+
154
+
155
+ # v に直交する単位ベクトル
156
+
157
+ n = np.array([v[1], -v[0]])
158
+
159
+ n /= np.linalg.norm(n)
160
+
161
+
162
+
163
+ # 直交する単位ベクトル * 半径が円周の点
164
+
165
+ if i == 0:
166
+
167
+ sides1.append(p1 + n * r)
168
+
169
+ sides2.append(p1 - n * r)
170
+
171
+ sides1.append(p2 + n * r)
172
+
173
+ sides2.append(p2 - n * r)
174
+
175
+
176
+
177
+ return np.array(sides1 + sides2[::-1])
178
+
179
+
180
+
181
+
182
+
183
+ sides = get_points(points)
184
+
185
+ print(sides)
186
+
187
+
188
+
189
+ ax.fill(sides[:, 0], sides[:, 1], alpha=0.5, ec="k")
190
+
191
+ for p in points:
192
+
193
+ ax.add_patch(plt.Circle(xy=p, radius=r, fc="none", ec="k", lw=1))
194
+
195
+ ax.autoscale()
196
+
197
+ ```
198
+
199
+
200
+
201
+ ![イメージ説明](11724de38d0b6041a78f2d43e054a234.png)

1

d

2019/12/10 10:23

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -45,3 +45,53 @@
45
45
 
46
46
 
47
47
  ![イメージ説明](2b49cbc01c2b5e3f2dad821da3871b4d.png)
48
+
49
+
50
+
51
+ ## 追記
52
+
53
+
54
+
55
+ plot() で linewidth を太めに設定して、線を引けばいいのではないでしょうか。
56
+
57
+
58
+
59
+ ```python
60
+
61
+ import matplotlib.pyplot as plt
62
+
63
+ import random
64
+
65
+
66
+
67
+ fig, ax = plt.subplots()
68
+
69
+ ax.set_aspect("equal")
70
+
71
+
72
+
73
+ # ここで与える点と円の半径rからplt.fill(x, y)におけるxとyを求めたいです.
74
+
75
+ xs = [random.random() + i for i in range(10)]
76
+
77
+ ys = [random.random() + i for i in range(10)]
78
+
79
+ r = 0.5
80
+
81
+
82
+
83
+ for p in zip(xs, ys):
84
+
85
+ ax.add_patch(plt.Circle(xy=p, radius=r, fc="none", ec="k", lw=1))
86
+
87
+ ax.plot(xs, ys, lw=r * 50, alpha=0.3)
88
+
89
+
90
+
91
+ ax.autoscale()
92
+
93
+ ```
94
+
95
+
96
+
97
+ ![イメージ説明](6c2287a9d62119a8a9c7244d3ca6af1b.png)