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