teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

各関数の補足やソースコード作成時の参考サイトの記入を行いました。また、その際、浮動小数点をまるめる関数を不要とした為削除しました。

2020/09/27 13:02

投稿

S.K12
S.K12

スコア16

title CHANGED
@@ -1,1 +1,1 @@
1
- 任意データの曲率半径を算出したい。
1
+ 指定グラフの曲率半径を算出したい。
body CHANGED
@@ -1,7 +1,13 @@
1
1
  ### 前提・実現したいこと
2
- 下記のデータの曲率半径を算出したいです。
2
+ 下記のグラフの曲率半径をすべて算出したいです。
3
3
  ![イメージ説明](7e99694c16978d154238406299cbc6d8.png)
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
- def make_equation(x, y, r):
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)