質問編集履歴

1

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

2020/09/27 13:02

投稿

S.K12
S.K12

スコア16

test CHANGED
@@ -1 +1 @@
1
- 任意データの曲率半径を算出したい。
1
+ 指定グラフの曲率半径を算出したい。
test CHANGED
@@ -1,11 +1,23 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 下記のデータの曲率半径を算出したいです。
3
+ 下記のグラフの曲率半径をすべて算出したいです。
4
4
 
5
5
  ![イメージ説明](7e99694c16978d154238406299cbc6d8.png)
6
6
 
7
7
 
8
8
 
9
+ 最終的にグラフの曲率半径最小位置を求めたいと考えている為、
10
+
11
+ グラフの端からは端まですべての曲率半径を出力したいです。
12
+
13
+
14
+
15
+ 該当ソースコード作成時に参考にしたサイトは下記の通りです。
16
+
17
+ [Three Points Circle (Electronic Station) - 3点を通る円の方程式を求める](http://py3.hateblo.jp/entry/2014/02/23/172305)
18
+
19
+
20
+
9
21
  ### 補足
10
22
 
11
23
  原因がx,yの配列がnumpyである事だと思うのですが、
@@ -146,8 +158,6 @@
146
158
 
147
159
  import numpy as np
148
160
 
149
- import matplotlib.pyplot as plt
150
-
151
161
 
152
162
 
153
163
  x =np.array([[930.49552541],
@@ -558,6 +568,8 @@
558
568
 
559
569
 
560
570
 
571
+ #(x1,y1)(x2,y2)(x3,y3)の3点を通る円の中心と半径を取得
572
+
561
573
  def get_circle_center_and_radius(x1, y1, x2, y2, x3, y3):
562
574
 
563
575
  r = []
@@ -568,49 +580,13 @@
568
580
 
569
581
  y = ((x1 - x3) * (x1 ** 2 - x2 ** 2 + y1 ** 2 - y2 ** 2) - (x1 - x2) * (x1 ** 2 - x3 ** 2 + y1 ** 2 - y3 ** 2)) / -d
570
582
 
571
- r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2)
583
+ r = math.sqrt((x - x1) ** 2 + (y - y1) ** 2) #ここで求めたrを配列Rに格納していきたい
572
-
573
- print(r)
574
584
 
575
585
  return (x, y), r
576
586
 
577
587
 
578
588
 
579
- def remove_suffix(s, suffix):
580
-
581
- return s[:-len(suffix)] if s.endswith(suffix) else s
582
-
583
-
584
-
585
- def make_equation(x, y, r):
589
+ #上記で算出した円の中心座標と半径より円の方程式の作成
586
-
587
-
588
-
589
- def format_float(f):
590
-
591
- result = str(round(f, 2))
592
-
593
- result = remove_suffix(result, '.00')
594
-
595
- result = remove_suffix(result, '.0')
596
-
597
- return result
598
-
599
-
600
-
601
- def make_part(name, value):
602
-
603
- num = format_float(abs(value))
604
-
605
- sign = '-' if value > 0 else '+'
606
-
607
- return name if num == '0' else '({0}{1}{2})'.format(name, sign, num)
608
-
609
-
610
-
611
- return "{}^2+{}^2={}^2".format(make_part('x', x), make_part('y', y), format_float(r))
612
-
613
-
614
590
 
615
591
  def checkio(data):
616
592
 
@@ -632,7 +608,7 @@
632
608
 
633
609
  while i <= 100 :
634
610
 
635
- X = x[row_num]
611
+ X = x[row_num] #1つ目の座標
636
612
 
637
613
  Y = y[row_num]
638
614
 
@@ -642,7 +618,7 @@
642
618
 
643
619
  row_num = i
644
620
 
645
- X2 = x[row_num]
621
+ X2 = x[row_num] #2つ目の座標
646
622
 
647
623
  Y2 = y[row_num]
648
624
 
@@ -652,13 +628,13 @@
652
628
 
653
629
  row_num = i
654
630
 
655
- X3 = x[row_num]
631
+ X3 = x[row_num] #3つ目の座標
656
632
 
657
633
  Y3 = y[row_num]
658
634
 
659
635
 
660
636
 
661
- checkio("(X,Y),(X2,Y2),(X3,Y3)")
637
+ checkio("(X,Y),(X2,Y2),(X3,Y3)") #上記3点から作られる円の方程式を算出
662
638
 
663
639
  R = r
664
640