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

middle output

parent bf8f797e
Branches
No related tags found
No related merge requests found
...@@ -92,9 +92,9 @@ class CoAPServer(CoAP): ...@@ -92,9 +92,9 @@ class CoAPServer(CoAP):
dd = datetime.datetime.now() dd = datetime.datetime.now()
dd = dd.replace(hour=dd.hour + 9) dd = dd.replace(hour=dd.hour + 9)
userNodeData = { userNodeData = {
'rpuuid1': userLocationData[0]['rpuuid'], 'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']},
'rpuuid2': userLocationData[1]['rpuuid'], 'rp2': {'rpuuid' : userLocationData[1]['rpuuid'], 'distance' : userLocationData[1]['distance']},
'rpuuid3': userLocationData[2]['rpuuid'], 'rp3': {'rpuuid' : userLocationData[2]['rpuuid'], 'distance' : userLocationData[2]['distance']},
'useruuid': useruuid, 'useruuid': useruuid,
'x': x, 'x': x,
'y': y, 'y': y,
......
import math import math
class Triangulation(): class Triangulation():
def __init__(self, nodeList): def __init__(self, nodeList):
self.n = nodeList self.n = nodeList
...@@ -71,7 +70,7 @@ class Triangulation(): ...@@ -71,7 +70,7 @@ class Triangulation():
meet1[1][1]=line_position[1][2]/line_position[1][1] meet1[1][1]=line_position[1][2]/line_position[1][1]
meet2[1][1]=meet1[0][1] meet2[1][1]=meet1[0][1]
meet1[1][0]=math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[1][1]-b1))+a1 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)) meet2[1][0]=a1-math.sqrt(r1*r1-(meet1[1][1]-b1)*(meet1[1][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)): 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][0]=meet2[1][0]
meet_result[1][1]=meet2[1][1] meet_result[1][1]=meet2[1][1]
...@@ -104,7 +103,6 @@ class Triangulation(): ...@@ -104,7 +103,6 @@ class Triangulation():
meet_result[1][0]=meet1[1][0] meet_result[1][0]=meet1[1][0]
meet_result[1][1]=meet1[1][1] meet_result[1][1]=meet1[1][1]
print("x2:",meet_result[1][0],"y2:",meet_result[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): if(line_position[2][0]==0 and line_position[2][1]!=0):
meet1[2][1]=line_position[2][2]/line_position[2][1] meet1[2][1]=line_position[2][2]/line_position[2][1]
...@@ -121,7 +119,7 @@ class Triangulation(): ...@@ -121,7 +119,7 @@ class Triangulation():
meet1[2][0]=line_position[2][2]/line_position[2][0] meet1[2][0]=line_position[2][2]/line_position[2][0]
meet2[2][0]=meet1[2][0] meet2[2][0]=meet1[2][0]
meet1[2][1]=math.sqrt(r2*r2-(meet1[2][0]-a2)*(meet1[2][0]-a2))+b2 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)) meet2[2][1]=b2-math.sqrt(r2*r2-(meet1[2][0]-a2)*(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)): 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][0]=meet2[2][0]
meet_result[2][1]=meet2[2][1] meet_result[2][1]=meet2[2][1]
...@@ -130,8 +128,8 @@ class Triangulation(): ...@@ -130,8 +128,8 @@ class Triangulation():
meet_result[2][1]=meet1[2][1] meet_result[2][1]=meet1[2][1]
else: else:
a=1+(line_position[2][0]/line_position[2][1])*(line_position[2][0]/line_position[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]) 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]*b2/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 c=(line_position[2][2]/line_position[2][1])*(line_position[2][2]/line_position[2][1]) + (-2*line_position[2][2]*b2/line_position[2][1]) + b2*b2 - r2*r2 +a2*a2
meet1[2][0]=(-b+math.sqrt(b*b-4*a*c))/(2*a) 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) 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]) meet1[2][1]=(-1*line_position[2][0]*meet1[2][0]/line_position[2][1])+(line_position[2][2]/line_position[2][1])
...@@ -200,9 +198,8 @@ class Triangulation(): ...@@ -200,9 +198,8 @@ class Triangulation():
else: else:
meet_result[0][0]=meet1[0][0] meet_result[0][0]=meet1[0][0]
meet_result[0][1]=meet1[0][1] 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] 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번째 경우로 겹치는 원이 없는 경우이다.(값이 정확히지는 않음) #def third_situation(a1,b1,r1,a2,b2,r2,a3,b3,r3):#3번째 경우로 겹치는 원이 없는 경우이다.(값이 정확히지는 않음)
# a=2*(a1-a2) # a=2*(a1-a2)
...@@ -216,9 +213,25 @@ class Triangulation(): ...@@ -216,9 +213,25 @@ class Triangulation():
# print("x:",x1,"y:",y1) # print("x:",x1,"y:",y1)
def doTriangulation(self): def doTriangulation(self):
x, y = 0, 0
list=[self.n[0]['distance'],self.n[1]['distance'],self.n[2]['distance']]
list.sort()
a=self.cal_distance(self.n[0]['x'],self.n[0]['y'],self.n[1]['x'],self.n[1]['y']) 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']) 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']) c=self.cal_distance(self.n[1]['x'],self.n[1]['y'],self.n[2]['x'],self.n[2]['y'])
if(list[2]==self.n[0]['distance']):
if(self.n[1]['distance']+a<=self.n[0]['distance'] or self.n[2]['distance']+b<=self.n[0]['distance']):
print("error")
return None, None
elif(list[2]==self.n[1]['distance']):
if(self.n[0]['distance']+a<=self.n[1]['distance'] or self.n[2]['distance']+c<=self.n[1]['distance']):
print("error")
return None, None
elif(list[2]==self.n[2]['distance']):
if(self.n[0]['distance']+b<=self.n[2]['distance'] or self.n[1]['distance']+c<=self.n[2]['distance']):
print("error")
return None, None
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']): 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'], 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[1]['x'],self.n[1]['y'],self.n[1]['distance'],
...@@ -236,15 +249,15 @@ class Triangulation(): ...@@ -236,15 +249,15 @@ class Triangulation():
self.n[2]['x'],self.n[2]['y'],self.n[2]['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']) self.n[0]['x'],self.n[0]['y'],self.n[0]['distance'])
else: else:
x, y = None, None print("error")
print("NoneNone") return None, None
return x, y return x, y
""" """
#예시 self.doTriangulation(20,10,10,9,10,1,10,9,1)
self.first_situation(20,10,10,9,10,1,10,9,1) print("-----------------------")
doTriangulation(20,10,10,9,10,1,10,9,1) self.doTriangulation(9,10,1,10,9,1,20,10,10)
print("-----------------------") print("-----------------------")
self.second_situation(0,3,1,0,4,1,5,3,1) self.doTriangulation(10,9,1,9,10,1,20,10,10)
doTriangulation(0,3,1,0,4,1,5,3,1)
print("-----------------------") print("-----------------------")
self.doTriangulation(0,3,1,0,4,1,5,3,1)
""" """
\ No newline at end of file
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))
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)
#첫번째 직선의 교점
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])
#두번째 직선의 교점
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[1][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]
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]-a2)*(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]
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]*b2/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]*b2/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]
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
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]
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)
def function(a1,b1,r1,a2,b2,r2,a3,b3,r3):
list=[r1,r2,r3]
list.sort()
a=cal_distance(a1,b1,a2,b2)
b=cal_distance(a1,b1,a3,b3)
c=cal_distance(a2,b2,a3,b3)
if(list[2]==r1):
if(r2+a<=r1 or r3+b<=r1):
print("error")
return 0
elif(list[2]==r2):
if(r1+a<=r2 or r3+c<=r2):
print("error")
return 0
elif(list[2]==r3):
if(r1+b<=r3 or r2+c<=r3):
print("error")
return 0
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)
else:
print("error")
return 0
function(20,10,10,9,10,1,10,9,1)
print("-----------------------")
function(9,10,1,10,9,1,20,10,10)
print("-----------------------")
function(10,9,1,9,10,1,20,10,10)
print("-----------------------")
\ No newline at end of file
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))
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)
#첫번째 직선의 교점
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])
#두번째 직선의 교점
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[1][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]
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]-a2)*(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]
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]*b2/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]*b2/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]
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
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]
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)
def function(a1,b1,r1,a2,b2,r2,a3,b3,r3):
list=[r1,r2,r3]
list.sort()
a=cal_distance(a1,b1,a2,b2)
b=cal_distance(a1,b1,a3,b3)
c=cal_distance(a2,b2,a3,b3)
if(list[2]==r1):
if(r2+a<=r1 or r3+b<=r1):
print("error")
return 0
elif(list[2]==r2):
if(r1+a<=r2 or r3+c<=r2):
print("error")
return 0
elif(list[2]==r3):
if(r1+b<=r3 or r2+c<=r3):
print("error")
return 0
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)
else:
print("error")
return 0
function(20,10,10,9,10,1,10,9,1)
print("-----------------------")
function(9,10,1,10,9,1,20,10,10)
print("-----------------------")
function(10,9,1,9,10,1,20,10,10)
print("-----------------------")
\ No newline at end of file
...@@ -2,7 +2,16 @@ var mongoose = require('mongoose'); ...@@ -2,7 +2,16 @@ var mongoose = require('mongoose');
const Schema = mongoose.Schema; const Schema = mongoose.Schema;
const userNodeSchema = new Schema({ const userNodeSchema = new Schema({
rasbpID: { type: String, default: "" }, rp1: {
rpuuid:{ type: String, default: "" },
distance:{ type: Number, default: 0 }
},rp2: {
rpuuid:{ type: String, default: "" },
distance:{ type: Number, default: 0 }
},rp3: {
rpuuid:{ type: String, default: "" },
distance:{ type: Number, default: 0 }
},
useruuid: { type: String, default: "" }, useruuid: { type: String, default: "" },
x:{ type: Number, default: 0 }, x:{ type: Number, default: 0 },
y:{ type: Number, default: 0 }, y:{ type: Number, default: 0 },
......
...@@ -21,7 +21,7 @@ var options = { ...@@ -21,7 +21,7 @@ var options = {
yAxes: [ yAxes: [
{ {
ticks: { ticks: {
//max:30, max:30,
beginAtZero: true beginAtZero: true
} }
} }
...@@ -29,7 +29,7 @@ var options = { ...@@ -29,7 +29,7 @@ var options = {
xAxes: [ xAxes: [
{ {
ticks: { ticks: {
//max:20, max:20,
beginAtZero: true beginAtZero: true
} }
} }
......
...@@ -75,47 +75,57 @@ router.get('/findUserByUUID/:id', function(req, res, next) { ...@@ -75,47 +75,57 @@ router.get('/findUserByUUID/:id', function(req, res, next) {
var data =new Array(); var data =new Array();
var UserName = ""; var UserName = "";
var UserLocation =[]; var UserLocation =[];
var temp;
var rpNodeData=[]; var rpNodeData=[];
//console.log("kkkk") //console.log("kkkk")
(async () => { (async () => {
try{ try{
await User.find({uuid:req.params.id}, (err,output)=>{ await User.find({uuid:req.params.id}, (err,output)=>{
//res.json(output); //res.json(output);
console.log(output[0].name) //console.log(output[0].name)
userData.push({name:output[0].name})
UserName = output[0].name; UserName = output[0].name;
}) })
await User.find({uuid:req.params.id}, (err,output)=>{ await User.find({uuid:req.params.id}, (err,output)=>{
//res.json(output); //res.json(output);
console.log(output[0].name) //console.log(output[0].name)
userData.push({name:output[0].name})
UserName = output[0].name; UserName = output[0].name;
}) })
await UserNode.find({useruuid:req.params.id}, (err,output)=>{ await UserNode.find({useruuid:req.params.id}, (err,output)=>{
//res.json(output); //res.json(output);
//console.log("tt,",output[0].rp1)
try{ try{
temp =[output[0].rp1,output[0].rp2,output[0].rp3];
UserLocation ={ UserLocation ={
x:output[0].x, x:output[0].x,
y:output[0].y, y:output[0].y,
r:10 r:10
} }
userData.push({
x:output[0].x,
y:output[0].y,
updateTime:output[0].updateTime,
})
}catch(exception){} }catch(exception){}
}) })
await rpNode.find((err,output) =>{ // await rpNode.find((err,output) =>{
rpNodeData = output; // rpNodeData = output;
console.log("tt",JSON.stringify(rpNodeData)); // console.log("tt",JSON.stringify(rpNodeData));
// })
for(i in temp){
console.log(i, temp[i].rpuuid)
await rpNode.find({'rpuuid': temp[i].rpuuid},(err,output)=>{
//console.log(temp[i].distance)
rpNodeData.push({
rpuuid : temp[i].rpuuid,
x: output[0].x,
y: output[0].y,
r: temp[i].distance * 20
})
}) })
//console.log(rpNodeData,i)
}
} }
catch(exception){ catch(exception){
console.log(exception) console.log(exception)
} }
console.log(rpNodeData)
res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)}) res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)})
})(); })();
}); });
......
...@@ -33,7 +33,7 @@ block content ...@@ -33,7 +33,7 @@ block content
t.push({ t.push({
x: nodeData[i].x, x: nodeData[i].x,
y: nodeData[i].y, y: nodeData[i].y,
r: 5 r: nodeData[i].r
}) })
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment