Skip to content
Snippets Groups Projects
Commit 5d7df415 authored by Server (Shared Users)'s avatar Server (Shared Users)
Browse files

add triangulation.py

parent 083b87bd
No related branches found
No related tags found
No related merge requests found
......@@ -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,
......
......@@ -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")
......
import pymongo
import math
from pymongo import MongoClient
def cal_distance(a1,b1,a2,b2):
class Triangulation():
def __init__(self, nodeList):
self.n = nodeList
for a in self.n:
print(a)
def cal_distance(self, a1,b1,a2,b2):
return math.sqrt((a2-a1)*(a2-a1)+(b2-b1)*(b2-b1))
def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가 서로에게 모두 겹치는 경우가 있는 경우이다
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]]
......@@ -29,7 +33,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -40,7 +44,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -54,7 +58,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -68,7 +72,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -79,7 +83,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -93,20 +97,21 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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(cal_distance(meet1[2][0],meet1[2][1],a1,b1)>=cal_distance(meet2[2][0],meet2[2][1],a1,b1)):
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:
......@@ -117,7 +122,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -131,7 +136,7 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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)):
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:
......@@ -140,10 +145,10 @@ def first_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#첫번째 경우로 원 3개가
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
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개의 원만 겹치는 부분이 있는 경우이다.
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]]
......@@ -159,7 +164,7 @@ def second_situation(a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의
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)):
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:
......@@ -170,7 +175,7 @@ def second_situation(a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의
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)):
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:
......@@ -187,15 +192,17 @@ def second_situation(a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의
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)):
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]
print("x:",meet_result[0][0],"y:",meet_result[0][1])
return meet_result[0][0], meet_result[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)
......@@ -208,23 +215,36 @@ def second_situation(a1,b1,r1,a2,b2,r2,oa3,ob3,or3):#2번째 경우로 2개의
# x1=(c-b*y1)/a
# print("x:",x1,"y:",y1)
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 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
"""
#예시
first_situation(20,10,10,9,10,1,10,9,1)
function(20,10,10,9,10,1,10,9,1)
self.first_situation(20,10,10,9,10,1,10,9,1)
doTriangulation(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)
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment