質問編集履歴
1
各関数の補足やソースコード作成時の参考サイトの記入を行いました。また、その際、浮動小数点をまるめる関数を不要とした為削除しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
指定のグラフの曲率半径を算出したい。
|
body
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
下記の
|
2
|
+
下記のグラフの曲率半径をすべて算出したいです。
|
3
3
|

|
4
4
|
|
5
|
+
最終的にグラフの曲率半径最小位置を求めたいと考えている為、
|
6
|
+
グラフの端からは端まですべての曲率半径を出力したいです。
|
7
|
+
|
8
|
+
該当ソースコード作成時に参考にしたサイトは下記の通りです。
|
9
|
+
[Three Points Circle (Electronic Station) - 3点を通る円の方程式を求める](http://py3.hateblo.jp/entry/2014/02/23/172305)
|
10
|
+
|
5
11
|
### 補足
|
6
12
|
原因がx,yの配列がnumpyである事だと思うのですが、
|
7
13
|
numpyではない通常(?)の配列への変換方法がわからず対処出来ていません。
|
@@ -72,7 +78,6 @@
|
|
72
78
|
```Python
|
73
79
|
import math
|
74
80
|
import numpy as np
|
75
|
-
import matplotlib.pyplot as plt
|
76
81
|
|
77
82
|
x =np.array([[930.49552541],
|
78
83
|
[930.50241252],
|
@@ -278,33 +283,16 @@
|
|
278
283
|
[0.00428208]])
|
279
284
|
|
280
285
|
|
286
|
+
#(x1,y1)(x2,y2)(x3,y3)の3点を通る円の中心と半径を取得
|
281
287
|
def get_circle_center_and_radius(x1, y1, x2, y2, x3, y3):
|
282
288
|
r = []
|
283
289
|
d = 2 * ((y1 - y3) * (x1 - x2) - (y1 - y2) * (x1 - x3))
|
284
290
|
x = ((y1 - y3) * (y1 ** 2 - y2 ** 2 + x1 ** 2 - x2 ** 2) - (y1 - y2) * (y1 ** 2 - y3 ** 2 + x1 ** 2 - x3 ** 2)) / d
|
285
291
|
y = ((x1 - x3) * (x1 ** 2 - x2 ** 2 + y1 ** 2 - y2 ** 2) - (x1 - x2) * (x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2)) / -d
|
286
|
-
r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2)
|
292
|
+
r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2) #ここで求めたrを配列Rに格納していきたい
|
287
|
-
print(r)
|
288
293
|
return (x, y), r
|
289
294
|
|
290
|
-
def remove_suffix(s, suffix):
|
291
|
-
return s[:-len(suffix)] if s.endswith(suffix) else s
|
292
|
-
|
293
|
-
|
295
|
+
#上記で算出した円の中心座標と半径より円の方程式の作成
|
294
|
-
|
295
|
-
def format_float(f):
|
296
|
-
result = str(round(f, 2))
|
297
|
-
result = remove_suffix(result, '.00')
|
298
|
-
result = remove_suffix(result, '.0')
|
299
|
-
return result
|
300
|
-
|
301
|
-
def make_part(name, value):
|
302
|
-
num = format_float(abs(value))
|
303
|
-
sign = '-' if value > 0 else '+'
|
304
|
-
return name if num == '0' else '({0}{1}{2})'.format(name, sign, num)
|
305
|
-
|
306
|
-
return "{}^2+{}^2={}^2".format(make_part('x', x), make_part('y', y), format_float(r))
|
307
|
-
|
308
296
|
def checkio(data):
|
309
297
|
(x1, y1), (x2, y2), (x3, y3) = eval(data)
|
310
298
|
(x0, y0), r = get_circle_center_and_radius(x1, y1, x2, y2, x3, y3)
|
@@ -315,20 +303,20 @@
|
|
315
303
|
row_num = i
|
316
304
|
R = []
|
317
305
|
while i <= 100 :
|
318
|
-
X = x[row_num]
|
306
|
+
X = x[row_num] #1つ目の座標
|
319
307
|
Y = y[row_num]
|
320
308
|
|
321
309
|
i = i + 1
|
322
310
|
row_num = i
|
323
|
-
X2 = x[row_num]
|
311
|
+
X2 = x[row_num] #2つ目の座標
|
324
312
|
Y2 = y[row_num]
|
325
313
|
|
326
314
|
i = i + 1
|
327
315
|
row_num = i
|
328
|
-
X3 = x[row_num]
|
316
|
+
X3 = x[row_num] #3つ目の座標
|
329
317
|
Y3 = y[row_num]
|
330
318
|
|
331
|
-
checkio("(X,Y),(X2,Y2),(X3,Y3)")
|
319
|
+
checkio("(X,Y),(X2,Y2),(X3,Y3)") #上記3点から作られる円の方程式を算出
|
332
320
|
R = r
|
333
321
|
|
334
322
|
print(R)
|