From 5d7df41509d411f0ab7e461d4af0bdbb3e1df200 Mon Sep 17 00:00:00 2001
From: "Server (Shared Users)" <shmd01.iptime.org>
Date: Tue, 26 Nov 2019 06:46:12 +0000
Subject: [PATCH] add triangulation.py

---
 Server_CoAP/CoAPthon3/coapserver.py       |  19 +-
 Server_CoAP/CoAPthon3/exampleresources.py |  17 +-
 Server_CoAP/CoAPthon3/triangulation.py    | 452 +++++++++++-----------
 3 files changed, 254 insertions(+), 234 deletions(-)

diff --git a/Server_CoAP/CoAPthon3/coapserver.py b/Server_CoAP/CoAPthon3/coapserver.py
index 66995cf..3f80d0f 100644
--- a/Server_CoAP/CoAPthon3/coapserver.py
+++ b/Server_CoAP/CoAPthon3/coapserver.py
@@ -6,6 +6,7 @@ import _thread
 import time
 import datetime
 import json
+import triangulation
 from coapthon.server.coap import CoAP
 from exampleresources import BleInfoResource, RpNodeInfoResource, RpGraphInfoResource
 from pymongo import MongoClient
@@ -74,24 +75,26 @@ class CoAPServer(CoAP):
         if len(userLocationData) < 3:
             return
 
-        node = []
+        nodeList = []
         for i in range(3):
-            node.append({
-                'x': piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[i]['x'],
-                'y': piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[i]['y'],
+            nodeList.append({
+                'x': self.piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[0]['x'],
+                'y': self.piNodeCollection.find({'rpuuid': userLocationData[i]['rpuuid']})[0]['y'],
                 'distance': userLocationData[i]['distance']
             })
 
-        triangulationInst = triangulation.Triangulation(node[:3])
-        x, y = triangulation.doTriangulation()
+        triangulationInst = triangulation.Triangulation(nodeList[:3])
+        x, y = triangulationInst.doTriangulation()
 
-        if(x == null)
+        if x == None:
             return
 
         dd = datetime.datetime.now()
         dd = dd.replace(hour=dd.hour + 9)
         userNodeData = {
-            'rpuuid': userLocationData[0]['rpuuid'],
+            'rpuuid1': userLocationData[0]['rpuuid'],
+            'rpuuid2': userLocationData[1]['rpuuid'],
+            'rpuuid3': userLocationData[2]['rpuuid'],
             'useruuid': useruuid,
             'x': x,
             'y': y,
diff --git a/Server_CoAP/CoAPthon3/exampleresources.py b/Server_CoAP/CoAPthon3/exampleresources.py
index 7945e9c..4c44314 100644
--- a/Server_CoAP/CoAPthon3/exampleresources.py
+++ b/Server_CoAP/CoAPthon3/exampleresources.py
@@ -94,8 +94,7 @@ class RpNodeInfoResource(Resource):
                     'b': graphColletion.find({'v1': vertexA[0][rpuuid], 'v2': info})[0]['distance'],
                     'c': vertexB[0]['x']
                 }
-                cosA = (math.pow(dis['b'], 2) + math.pow(dis['c'], 2) - math.pow(dis['a'], 2))
-                / (2 * dis['b'] * dis['c'])
+                cosA = (math.pow(dis['b'], 2) + math.pow(dis['c'], 2) - math.pow(dis['a'], 2)) / (2 * dis['b'] * dis['c'])
                 sinA = math.sqrt((1 - math.pow(cosA,2)))
                 x = b * cosA
                 y = b * sinA
@@ -115,23 +114,21 @@ class RpNodeInfoResource(Resource):
                 if len(nodeLocationData) < 3:
                     return
 
-                node = []
+                nodeList = []
                 for i in range(3):
-                    node.append({
-                        'x': piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[i]['x'],
-                        'y': piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[i]['y'],
+                    nodeList.append({
+                        'x': self.piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[0]['x'],
+                        'y': self.piNodeCollection.find({'rpuuid': nodeLocationData[i]['rpuuid']})[0]['y'],
                         'distance': nodeLocationData[i]['distance']
                     })
 
-                triangulationInst = triangulation.Triangulation(node[:3])
+                triangulationInst = triangulation.Triangulation(nodeList[:3])
                 x, y = triangulation.doTriangulation()
 
-                if(x == null)
+                if x == None:
                     return
 
                 self.collection.update({'rpuuid' : info}, {'$set':{'x': x, 'y': y}}, False)
-                else :
-                    print("This is not registered Node")
                 
         
 
diff --git a/Server_CoAP/CoAPthon3/triangulation.py b/Server_CoAP/CoAPthon3/triangulation.py
index 1cc80b2..9365c81 100644
--- a/Server_CoAP/CoAPthon3/triangulation.py
+++ b/Server_CoAP/CoAPthon3/triangulation.py
@@ -1,230 +1,250 @@
-import pymongo
 import math
-from pymongo import MongoClient
 
-def cal_distance(a1,b1,a2,b2):
-    return math.sqrt((a2-a1)*(a2-a1)+(b2-b1)*(b2-b1)) 
+class Triangulation():
+    def __init__(self, nodeList):
+        self.n = nodeList
+        for a in self.n:
+            print(a)
 
-def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가 서로에게 모두 겹치는 경우가 있는 경우이다
-    line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C]
-    meet1 = [[0,0],[0,0],[0,0]]
-    meet2 = [[0,0],[0,0],[0,0]]
-    meet_result = [[0,0],[0,0],[0,0]]
-    #첫번째 직선(1,2)
-    line_position[0][0]=-2*a1+2*a2
-    line_position[0][1]=-2*b1+2*b2
-    line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1)
-    #두번째 직선(1,3)
-    line_position[1][0]=-2*a1+2*a3
-    line_position[1][1]=-2*b1+2*b3
-    line_position[1][2]=(r1*r1-r3*r3)+(a3*a3-a1*a1)+(b3*b3-b1*b1)
-    #세번째 직선(2,3)
-    line_position[2][0]=-2*a2+2*a3
-    line_position[2][1]=-2*b2+2*b3
-    line_position[2][2]=(r2*r2-r3*r3)+(a3*a3-a2*a2)+(b3*b3-b2*b2)
+    def cal_distance(self, a1,b1,a2,b2):
+        return math.sqrt((a2-a1)*(a2-a1)+(b2-b1)*(b2-b1)) 
 
-    #첫번째 직선의 교점
-    if(line_position[0][0]==0 and line_position[0][1]!=0):
-        meet1[0][1]=line_position[0][2]/line_position[0][1]
-        meet2[0][1]=meet1[0][1]
-        meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1
-        meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))
-        if(cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
-        else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    elif(line_position[0][0]!=0 and line_position[0][1]==0):
-        meet1[0][0]=line_position[0][2]/line_position[0][0]
-        meet2[0][0]=meet1[0][0]
-        meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1
-        meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))
-        if(cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
-        else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    else:
-        a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1])
-        b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1])
-        c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1
-        meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
-        meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
-        meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
-        meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
-        if(cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
-        else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    print("x1:",meet_result[0][0],"y1:",meet_result[0][1])
+    def first_situation(self, a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가 서로에게 모두 겹치는 경우가 있는 경우이다
+        line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C]
+        meet1 = [[0,0],[0,0],[0,0]]
+        meet2 = [[0,0],[0,0],[0,0]]
+        meet_result = [[0,0],[0,0],[0,0]]
+        #첫번째 직선(1,2)
+        line_position[0][0]=-2*a1+2*a2
+        line_position[0][1]=-2*b1+2*b2
+        line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1)
+        #두번째 직선(1,3)
+        line_position[1][0]=-2*a1+2*a3
+        line_position[1][1]=-2*b1+2*b3
+        line_position[1][2]=(r1*r1-r3*r3)+(a3*a3-a1*a1)+(b3*b3-b1*b1)
+        #세번째 직선(2,3)
+        line_position[2][0]=-2*a2+2*a3
+        line_position[2][1]=-2*b2+2*b3
+        line_position[2][2]=(r2*r2-r3*r3)+(a3*a3-a2*a2)+(b3*b3-b2*b2)
 
-    #두번째 직선의 교점
-    if(line_position[1][0]==0 and line_position[1][1]!=0):
-        meet1[1][1]=line_position[1][2]/line_position[1][1]
-        meet2[1][1]=meet1[0][1]
-        meet1[1][0]=math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[1][1]-b1))+a1
-        meet2[1][0]=a1-math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[0][1]-b1))
-        if(cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
-            meet_result[1][0]=meet2[1][0]
-            meet_result[1][1]=meet2[1][1]
-        else:
-            meet_result[1][0]=meet1[1][0]
-            meet_result[1][1]=meet1[1][1]
-    elif(line_position[1][0]!=0 and line_position[1][1]==0):
-        meet1[1][0]=line_position[1][2]/line_position[1][0]
-        meet2[1][0]=meet1[1][0]
-        meet1[1][1]=math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1))+b1
-        meet2[1][1]=b1-math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1))
-        if(cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
-            meet_result[1][0]=meet2[1][0]
-            meet_result[1][1]=meet2[1][1]
-        else:
-            meet_result[1][0]=meet1[1][0]
-            meet_result[1][1]=meet1[1][1]
-    else:
-        a=1+((line_position[1][0]/line_position[1][1])*(line_position[1][0]/line_position[1][1]))
-        b=(-2*a1)+((-2*line_position[1][0]*line_position[1][2]) / (line_position[1][1]*line_position[1][1]))+((2*line_position[1][0]*b1)/line_position[1][1])
-        c=((line_position[1][2]/line_position[1][1])*(line_position[1][2]/line_position[1][1])) + ((-2*line_position[1][2]*b1)/line_position[1][1]) + b1*b1 - r1*r1 + a1*a1
-        meet1[1][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
-        meet2[1][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
-        meet1[1][1]=(-1*line_position[1][0]*meet1[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1])
-        meet2[1][1]=(-1*line_position[1][0]*meet2[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1])
-        if(cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
-            meet_result[1][0]=meet2[1][0]
-            meet_result[1][1]=meet2[1][1]
-        else:
-            meet_result[1][0]=meet1[1][0]
-            meet_result[1][1]=meet1[1][1]
-    print("x2:",meet_result[1][0],"y2:",meet_result[1][1])
-    #세번째 직선의 교점
-    if(line_position[2][0]==0 and line_position[2][1]!=0):
-        meet1[2][1]=line_position[2][2]/line_position[2][1]
-        meet2[2][1]=meet1[2][1]
-        meet1[2][0]=math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2))+a2
-        meet2[2][0]=a2-math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2))
-        if(cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
-            meet_result[2][0]=meet2[2][0]
-            meet_result[2][1]=meet2[2][1]
+        #첫번째 직선의 교점
+        if(line_position[0][0]==0 and line_position[0][1]!=0):
+            meet1[0][1]=line_position[0][2]/line_position[0][1]
+            meet2[0][1]=meet1[0][1]
+            meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1
+            meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))
+            if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
+        elif(line_position[0][0]!=0 and line_position[0][1]==0):
+            meet1[0][0]=line_position[0][2]/line_position[0][0]
+            meet2[0][0]=meet1[0][0]
+            meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1
+            meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))
+            if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
         else:
-            meet_result[2][0]=meet1[2][0]
-            meet_result[2][1]=meet1[2][1]
-    elif(line_position[2][0]!=0 and line_position[2][1]==0):
-        meet1[2][0]=line_position[2][2]/line_position[2][0]
-        meet2[2][0]=meet1[2][0]
-        meet1[2][1]=math.sqrt(r2*r2-(meet1[2][0]-a2)*(meet1[2][0]-a2))+b2
-        meet2[2][1]=b2-math.sqrt(r2*r2-(meet1[2][0]-a1)*(meet1[2][0]-a2))
-        if(cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
-            meet_result[2][0]=meet2[2][0]
-            meet_result[2][1]=meet2[2][1]
+            a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1])
+            b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1])
+            c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1
+            meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
+            meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
+            meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
+            meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
+            if(self.cal_distance(meet1[0][0],meet1[0][1],a3,b3)>=self.cal_distance(meet2[0][0],meet2[0][1],a3,b3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
+        print("x1:",meet_result[0][0],"y1:",meet_result[0][1])
+
+        #두번째 직선의 교점
+        if(line_position[1][0]==0 and line_position[1][1]!=0):
+            meet1[1][1]=line_position[1][2]/line_position[1][1]
+            meet2[1][1]=meet1[0][1]
+            meet1[1][0]=math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[1][1]-b1))+a1
+            meet2[1][0]=a1-math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[0][1]-b1))
+            if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
+                meet_result[1][0]=meet2[1][0]
+                meet_result[1][1]=meet2[1][1]
+            else:
+                meet_result[1][0]=meet1[1][0]
+                meet_result[1][1]=meet1[1][1]
+        elif(line_position[1][0]!=0 and line_position[1][1]==0):
+            meet1[1][0]=line_position[1][2]/line_position[1][0]
+            meet2[1][0]=meet1[1][0]
+            meet1[1][1]=math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1))+b1
+            meet2[1][1]=b1-math.sqrt(r1*r1-(meet1[1][0]-a1)*(meet1[1][0]-a1))
+            if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
+                meet_result[1][0]=meet2[1][0]
+                meet_result[1][1]=meet2[1][1]
+            else:
+                meet_result[1][0]=meet1[1][0]
+                meet_result[1][1]=meet1[1][1]
         else:
-            meet_result[2][0]=meet1[2][0]
-            meet_result[2][1]=meet1[2][1]
-    else:
-        a=1+(line_position[2][0]/line_position[2][1])*(line_position[2][0]/line_position[2][1])
-        b=(-2*a2)+((-2*line_position[2][0]*line_position[2][2]) / (line_position[2][1]*line_position[2][1]))+(2*line_position[2][0]*b1/line_position[2][1])
-        c=(line_position[2][2]/line_position[2][1])*(line_position[2][2]/line_position[2][1]) + (-2*line_position[2][2]*b1/line_position[2][1]) + b2*b2 - r2*r2 +a2*a2
-        meet1[2][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
-        meet2[2][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
-        meet1[2][1]=(-1*line_position[2][0]*meet1[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1])
-        meet2[2][1]=(-1*line_position[2][0]*meet2[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1])
-        if(cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
-            meet_result[2][0]=meet2[2][0]
-            meet_result[2][1]=meet2[2][1]
+            a=1+((line_position[1][0]/line_position[1][1])*(line_position[1][0]/line_position[1][1]))
+            b=(-2*a1)+((-2*line_position[1][0]*line_position[1][2]) / (line_position[1][1]*line_position[1][1]))+((2*line_position[1][0]*b1)/line_position[1][1])
+            c=((line_position[1][2]/line_position[1][1])*(line_position[1][2]/line_position[1][1])) + ((-2*line_position[1][2]*b1)/line_position[1][1]) + b1*b1 - r1*r1 + a1*a1
+            meet1[1][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
+            meet2[1][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
+            meet1[1][1]=(-1*line_position[1][0]*meet1[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1])
+            meet2[1][1]=(-1*line_position[1][0]*meet2[1][0]/line_position[1][1])+(line_position[1][2]/line_position[1][1])
+            if(self.cal_distance(meet1[1][0],meet1[1][1],a2,b2)>=self.cal_distance(meet2[1][0],meet2[1][1],a2,b2)):
+                meet_result[1][0]=meet2[1][0]
+                meet_result[1][1]=meet2[1][1]
+            else:
+                meet_result[1][0]=meet1[1][0]
+                meet_result[1][1]=meet1[1][1]
+        print("x2:",meet_result[1][0],"y2:",meet_result[1][1])
+
+        #세번째 직선의 교점
+        if(line_position[2][0]==0 and line_position[2][1]!=0):
+            meet1[2][1]=line_position[2][2]/line_position[2][1]
+            meet2[2][1]=meet1[2][1]
+            meet1[2][0]=math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2))+a2
+            meet2[2][0]=a2-math.sqrt(r2*r2-(meet1[2][1]-b2)*(meet1[2][1]-b2))
+            if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
+                meet_result[2][0]=meet2[2][0]
+                meet_result[2][1]=meet2[2][1]
+            else:
+                meet_result[2][0]=meet1[2][0]
+                meet_result[2][1]=meet1[2][1]
+        elif(line_position[2][0]!=0 and line_position[2][1]==0):
+            meet1[2][0]=line_position[2][2]/line_position[2][0]
+            meet2[2][0]=meet1[2][0]
+            meet1[2][1]=math.sqrt(r2*r2-(meet1[2][0]-a2)*(meet1[2][0]-a2))+b2
+            meet2[2][1]=b2-math.sqrt(r2*r2-(meet1[2][0]-a1)*(meet1[2][0]-a2))
+            if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
+                meet_result[2][0]=meet2[2][0]
+                meet_result[2][1]=meet2[2][1]
+            else:
+                meet_result[2][0]=meet1[2][0]
+                meet_result[2][1]=meet1[2][1]
         else:
-            meet_result[2][0]=meet1[2][0]
-            meet_result[2][1]=meet1[2][1]
-    print("x3:",meet_result[2][0],"y3:",meet_result[2][1])
+            a=1+(line_position[2][0]/line_position[2][1])*(line_position[2][0]/line_position[2][1])
+            b=(-2*a2)+((-2*line_position[2][0]*line_position[2][2]) / (line_position[2][1]*line_position[2][1]))+(2*line_position[2][0]*b1/line_position[2][1])
+            c=(line_position[2][2]/line_position[2][1])*(line_position[2][2]/line_position[2][1]) + (-2*line_position[2][2]*b1/line_position[2][1]) + b2*b2 - r2*r2 +a2*a2
+            meet1[2][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
+            meet2[2][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
+            meet1[2][1]=(-1*line_position[2][0]*meet1[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1])
+            meet2[2][1]=(-1*line_position[2][0]*meet2[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1])
+            if(self.cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=self.cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
+                meet_result[2][0]=meet2[2][0]
+                meet_result[2][1]=meet2[2][1]
+            else:
+                meet_result[2][0]=meet1[2][0]
+                meet_result[2][1]=meet1[2][1]
+        print("x3:",meet_result[2][0],"y3:",meet_result[2][1])
 
-    print("x:",(meet_result[0][0]+meet_result[1][0]+meet_result[2][0])/3,"/y:",(meet_result[0][1]+meet_result[1][1]+meet_result[2][1])/3)
-    return 0
+        print("x:",(meet_result[0][0]+meet_result[1][0]+meet_result[2][0])/3,"/y:",(meet_result[0][1]+meet_result[1][1]+meet_result[2][1])/3)
+        return (meet_result[0][0]+meet_result[1][0]+meet_result[2][0])/3, (meet_result[0][1]+meet_result[1][1]+meet_result[2][1])/3
 
 
-def second_situation(a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의 원만 겹치는 부분이 있는 경우이다.
-    line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C]
-    meet1 = [[0,0],[0,0],[0,0]]
-    meet2 = [[0,0],[0,0],[0,0]]
-    meet_result = [[0,0],[0,0],[0,0]]
-    #첫번째 직선(1,2)
-    line_position[0][0]=-2*a1+2*a2
-    line_position[0][1]=-2*b1+2*b2
-    line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1)
-    print(line_position[0])
-    #첫번째 직선의 교점
-    if(line_position[0][0]==0 and line_position[0][1]!=0):
-        meet1[0][1]=line_position[0][2]/line_position[0][1]
-        meet2[0][1]=meet1[0][1]
-        meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1
-        meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))
-        if(cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
-        else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    elif(line_position[0][0]!=0 and line_position[0][1]==0):
-        meet1[0][0]=line_position[0][2]/line_position[0][0]
-        meet2[0][0]=meet1[0][0]
-        meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1
-        meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))
-        if(cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
+    def second_situation(self, a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의 원만 겹치는 부분이 있는 경우이다.
+        line_position = [[0,0,0],[0,0,0],[0,0,0]]#Ax+By=c의 형태[A,B,C]
+        meet1 = [[0,0],[0,0],[0,0]]
+        meet2 = [[0,0],[0,0],[0,0]]
+        meet_result = [[0,0],[0,0],[0,0]]
+        #첫번째 직선(1,2)
+        line_position[0][0]=-2*a1+2*a2
+        line_position[0][1]=-2*b1+2*b2
+        line_position[0][2]=(r1*r1-r2*r2)+(a2*a2-a1*a1)+(b2*b2-b1*b1)
+        print(line_position[0])
+        #첫번째 직선의 교점
+        if(line_position[0][0]==0 and line_position[0][1]!=0):
+            meet1[0][1]=line_position[0][2]/line_position[0][1]
+            meet2[0][1]=meet1[0][1]
+            meet1[0][0]=math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))+a1
+            meet2[0][0]=a1-math.sqrt(r1*r1-(meet1[0][1]-b1)*(meet1[0][1]-b1))
+            if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
+        elif(line_position[0][0]!=0 and line_position[0][1]==0):
+            meet1[0][0]=line_position[0][2]/line_position[0][0]
+            meet2[0][0]=meet1[0][0]
+            meet1[0][1]=math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))+b1
+            meet2[0][1]=b1-math.sqrt(r1*r1-(meet1[0][0]-a1)*(meet1[0][0]-a1))
+            if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
         else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    else:
-        a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1])
-        b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1])
-        c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1
-        print(a,b,c)
-        meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
-        meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
-        meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
-        meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
-        print(meet1[0][0],meet1[0][1])
-        print(meet2[0][0],meet2[0][1])
-        print(cal_distance(meet1[0][0],meet1[0][1],oa3,ob3))
-        print(cal_distance(meet2[0][0],meet2[0][1],oa3,ob3))
-        if(cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
-            meet_result[0][0]=meet2[0][0]
-            meet_result[0][1]=meet2[0][1]
-        else:
-            meet_result[0][0]=meet1[0][0]
-            meet_result[0][1]=meet1[0][1]
-    print("x:",meet_result[0][0],"y:",meet_result[0][1])
-
-#def third_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#3번째 경우로 겹치는 원이 없는 경우이다.(값이 정확히지는 않음)
-#    a=2*(a1-a2)
-#    b=2*(b1-b2)
-#    c=(r2*r2-r1*r1)+(a1*a1-a2*a2)+(b1*b1-b2*b2)
-#    d=2*(a2-a3)
-#    e=2*(b2-b3)
-#    f=(r3*r3-r2*r2)+(a2*a2-a3*a3)+(b2*b2-b3*b3)
-#    y1=(f-((d*c) / a)) / (e-((b*d)/a))
-#    x1=(c-b*y1)/a
-#    print("x:",x1,"y:",y1)
+            a=1+(line_position[0][0]/line_position[0][1])*(line_position[0][0]/line_position[0][1])
+            b=(-2*a1)+((-2*line_position[0][0]*line_position[0][2]) / (line_position[0][1]*line_position[0][1]))+(2*line_position[0][0]*b1/line_position[0][1])
+            c=(line_position[0][2]/line_position[0][1])*(line_position[0][2]/line_position[0][1]) + (-2*line_position[0][2]*b1/line_position[0][1]) + b1*b1 - r1*r1 + a1*a1
+            print(a,b,c)
+            meet1[0][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a)
+            meet2[0][0]=(-b-math.sqrt(b*b-4*a*c))/(2*a)
+            meet1[0][1]=(-1*line_position[0][0]*meet1[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
+            meet2[0][1]=(-1*line_position[0][0]*meet2[0][0]/line_position[0][1])+(line_position[0][2]/line_position[0][1])
+            print(meet1[0][0],meet1[0][1])
+            print(meet2[0][0],meet2[0][1])
+            print(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3))
+            print(self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3))
+            if(self.cal_distance(meet1[0][0],meet1[0][1],oa3,ob3)>=self.cal_distance(meet2[0][0],meet2[0][1],oa3,ob3)):
+                meet_result[0][0]=meet2[0][0]
+                meet_result[0][1]=meet2[0][1]
+            else:
+                meet_result[0][0]=meet1[0][0]
+                meet_result[0][1]=meet1[0][1]
+            
+        return meet_result[0][0], meet_result[0][1]
+        #print("x:",meet_result[0][0],"y:",meet_result[0][1])
 
-def function(a1,b1,r1,a2,b2,r2,a3,b3,r3):
-    a=cal_distance(a1,b1,a2,b2)
-    b=cal_distance(a1,b1,a3,b3)
-    c=cal_distance(a2,b2,a2,b2)
-    if(a<=r1+r2 and b<=r1+r3 and c<=r2+r3):
-        first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3)
-    elif(a<=r1+r2 and b>r1+r3 and c>r2+r3):
-        second_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3)
-    elif(a>r1+r2 and b<=r1+r3 and c>r2+r3):
-        second_situation(a1,b1,r1,a3,b3,r3,a2,b2,r2)
-    elif(a>r1+r2 and b>r1+r3 and c<=r2+r3):
-        second_situation(a2,b2,r2,a3,b3,r3,a1,b1,r1)
+    #def third_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#3번째 경우로 겹치는 원이 없는 경우이다.(값이 정확히지는 않음)
+    #    a=2*(a1-a2)
+    #    b=2*(b1-b2)
+    #    c=(r2*r2-r1*r1)+(a1*a1-a2*a2)+(b1*b1-b2*b2)
+    #    d=2*(a2-a3)
+    #    e=2*(b2-b3)
+    #    f=(r3*r3-r2*r2)+(a2*a2-a3*a3)+(b2*b2-b3*b3)
+    #    y1=(f-((d*c) / a)) / (e-((b*d)/a))
+    #    x1=(c-b*y1)/a
+    #    print("x:",x1,"y:",y1)
 
-#예시
-first_situation(20,10,10,9,10,1,10,9,1)
-function(20,10,10,9,10,1,10,9,1)
-print("-----------------------")
-second_situation(0,3,1,0,4,1,5,3,1)
-function(0,3,1,0,4,1,5,3,1)
-print("-----------------------")
\ No newline at end of file
+    def doTriangulation(self):
+        a=self.cal_distance(self.n[0]['x'],self.n[0]['y'],self.n[1]['x'],self.n[1]['y'])
+        b=self.cal_distance(self.n[0]['x'],self.n[0]['y'],self.n[2]['x'],self.n[2]['y'])
+        c=self.cal_distance(self.n[1]['x'],self.n[1]['y'],self.n[1]['x'],self.n[1]['y'])
+        if(a<=self.n[0]['distance']+self.n[1]['distance'] and b<=self.n[0]['distance']+self.n[2]['distance'] and c<=self.n[1]['distance']+self.n[2]['distance']):
+            x, y = self.first_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'],
+            self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'],
+            self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'])
+        elif(a<=self.n[0]['distance']+self.n[1]['distance'] and b>self.n[0]['distance']+self.n[2]['distance'] and c>self.n[1]['distance']+self.n[2]['distance']):
+            x, y = self.second_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'],
+            self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'],
+            self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'])
+        elif(a>self.n[0]['distance']+self.n[1]['distance'] and b<=self.n[0]['distance']+self.n[2]['distance'] and c>self.n[1]['distance']+self.n[2]['distance']):
+            x, y = self.second_situation(self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'],
+            self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'],
+            self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'])
+        elif(a>self.n[0]['distance']+self.n[1]['distance'] and b>self.n[0]['distance']+self.n[2]['distance'] and c<=self.n[1]['distance']+self.n[2]['distance']):
+            x, y = self.second_situation(self.n[1]['x'],self.n[1]['y'],self.n[1]['distance'],
+            self.n[2]['x'],self.n[2]['y'],self.n[2]['distance'],
+            self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'])
+        else:
+            x, y = None, None
+            print("NoneNone")
+        return x, y
+    """
+    #예시
+    self.first_situation(20,10,10,9,10,1,10,9,1)
+    doTriangulation(20,10,10,9,10,1,10,9,1)
+    print("-----------------------")
+    self.second_situation(0,3,1,0,4,1,5,3,1)
+    doTriangulation(0,3,1,0,4,1,5,3,1)
+    print("-----------------------")
+    """
\ No newline at end of file
-- 
GitLab