質問編集履歴
1
各関数の補足やソースコード作成時の参考サイトの記入を行いました。また、その際、浮動小数点をまるめる関数を不要とした為削除しました。
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
|
-
|
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
|
|