diff --git a/Server_CoAP/CoAPthon3/coapserver.py b/Server_CoAP/CoAPthon3/coapserver.py index 3f80d0f73d38c9f6b33dc05488a7a0bd21a49b88..a977161dd5fb6c30edf9690dda00354003e1117b 100644 --- a/Server_CoAP/CoAPthon3/coapserver.py +++ b/Server_CoAP/CoAPthon3/coapserver.py @@ -92,9 +92,9 @@ class CoAPServer(CoAP): dd = datetime.datetime.now() dd = dd.replace(hour=dd.hour + 9) userNodeData = { - 'rpuuid1': userLocationData[0]['rpuuid'], - 'rpuuid2': userLocationData[1]['rpuuid'], - 'rpuuid3': userLocationData[2]['rpuuid'], + 'rp1': {'rpuuid' : userLocationData[0]['rpuuid'], 'distance': userLocationData[0]['distance']}, + 'rp2': {'rpuuid' : userLocationData[1]['rpuuid'], 'distance' : userLocationData[1]['distance']}, + 'rp3': {'rpuuid' : userLocationData[2]['rpuuid'], 'distance' : userLocationData[2]['distance']}, 'useruuid': useruuid, 'x': x, 'y': y, diff --git a/Server_CoAP/CoAPthon3/triangulation.py b/Server_CoAP/CoAPthon3/triangulation.py index 9365c81e13eaee5030a8d2e628d55e76b1166286..d45c38d7b7d2cd4b0753a55e179a2faf7d90bdc7 100644 --- a/Server_CoAP/CoAPthon3/triangulation.py +++ b/Server_CoAP/CoAPthon3/triangulation.py @@ -1,5 +1,4 @@ import math - class Triangulation(): def __init__(self, nodeList): self.n = nodeList @@ -71,7 +70,7 @@ class Triangulation(): 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)) + 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)): meet_result[1][0]=meet2[1][0] meet_result[1][1]=meet2[1][1] @@ -104,7 +103,6 @@ class Triangulation(): 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] @@ -121,7 +119,7 @@ class Triangulation(): 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)) + 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)): meet_result[2][0]=meet2[2][0] meet_result[2][1]=meet2[2][1] @@ -130,8 +128,8 @@ class Triangulation(): 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 + 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]) @@ -200,9 +198,8 @@ class Triangulation(): 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) @@ -216,9 +213,25 @@ class Triangulation(): # print("x:",x1,"y:",y1) 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']) 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']): 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'], @@ -236,15 +249,15 @@ class Triangulation(): 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") + print("error") + return None, None 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 +""" +self.doTriangulation(20,10,10,9,10,1,10,9,1) +print("-----------------------") +self.doTriangulation(9,10,1,10,9,1,20,10,10) +print("-----------------------") +self.doTriangulation(10,9,1,9,10,1,20,10,10) +print("-----------------------") +self.doTriangulation(0,3,1,0,4,1,5,3,1) +""" \ No newline at end of file diff --git a/Server_CoAP/triangulation.py b/Server_CoAP/triangulation.py deleted file mode 100644 index 8c0563e2f0ad26d502bd726e2e8a8643279bd15c..0000000000000000000000000000000000000000 --- a/Server_CoAP/triangulation.py +++ /dev/null @@ -1,247 +0,0 @@ -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 diff --git a/Server_CoAP/triangulation2.py b/Server_CoAP/triangulation2.py deleted file mode 100644 index 8c0563e2f0ad26d502bd726e2e8a8643279bd15c..0000000000000000000000000000000000000000 --- a/Server_CoAP/triangulation2.py +++ /dev/null @@ -1,247 +0,0 @@ -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 diff --git a/Server_Vue_Express/backend/models/userNode.js b/Server_Vue_Express/backend/models/userNode.js index 448fddea63781d57bf05ed43a7ab3c7a5b388cae..1fee736cf3c013f04d65461741a0913856598cb3 100644 --- a/Server_Vue_Express/backend/models/userNode.js +++ b/Server_Vue_Express/backend/models/userNode.js @@ -2,7 +2,16 @@ var mongoose = require('mongoose'); const Schema = mongoose.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: "" }, x:{ type: Number, default: 0 }, y:{ type: Number, default: 0 }, diff --git a/Server_Vue_Express/backend/public/chart.js b/Server_Vue_Express/backend/public/chart.js index d461cc046fbe53e77389258b457bec9d70b31abd..847d52d422dc6a90b4425a4b7a385dd218eaea21 100644 --- a/Server_Vue_Express/backend/public/chart.js +++ b/Server_Vue_Express/backend/public/chart.js @@ -21,7 +21,7 @@ var options = { yAxes: [ { ticks: { - //max:30, + max:30, beginAtZero: true } } @@ -29,7 +29,7 @@ var options = { xAxes: [ { ticks: { - //max:20, + max:20, beginAtZero: true } } diff --git a/Server_Vue_Express/backend/routes/api.js b/Server_Vue_Express/backend/routes/api.js index 5e435684682301d69dfebf9060bc82a527d60199..368cb6422b40653f81aec8b6616ff37154a0f602 100644 --- a/Server_Vue_Express/backend/routes/api.js +++ b/Server_Vue_Express/backend/routes/api.js @@ -75,47 +75,57 @@ router.get('/findUserByUUID/:id', function(req, res, next) { var data =new Array(); var UserName = ""; var UserLocation =[]; + var temp; var rpNodeData=[]; //console.log("kkkk") (async () => { try{ await User.find({uuid:req.params.id}, (err,output)=>{ //res.json(output); - console.log(output[0].name) - userData.push({name:output[0].name}) + //console.log(output[0].name) UserName = output[0].name; }) await User.find({uuid:req.params.id}, (err,output)=>{ //res.json(output); - console.log(output[0].name) - userData.push({name:output[0].name}) + //console.log(output[0].name) UserName = output[0].name; }) await UserNode.find({useruuid:req.params.id}, (err,output)=>{ //res.json(output); + //console.log("tt,",output[0].rp1) + try{ + temp =[output[0].rp1,output[0].rp2,output[0].rp3]; UserLocation ={ x:output[0].x, y:output[0].y, r:10 } - userData.push({ - x:output[0].x, - y:output[0].y, - updateTime:output[0].updateTime, - }) }catch(exception){} }) - await rpNode.find((err,output) =>{ - rpNodeData = output; - console.log("tt",JSON.stringify(rpNodeData)); - }) + // await rpNode.find((err,output) =>{ + // rpNodeData = output; + // 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){ console.log(exception) } - + console.log(rpNodeData) res.render('index',{title:'Express',UserName:UserName ,UserLocation: UserLocation, rpNodeData:JSON.stringify(rpNodeData)}) })(); }); diff --git a/Server_Vue_Express/backend/views/index.pug b/Server_Vue_Express/backend/views/index.pug index ece03bdd40bedc215c5e0213aa16d08144f4129e..952ffcf754e027bc20650a8f1b4c1cbd84bca45c 100644 --- a/Server_Vue_Express/backend/views/index.pug +++ b/Server_Vue_Express/backend/views/index.pug @@ -33,7 +33,7 @@ block content t.push({ x: nodeData[i].x, y: nodeData[i].y, - r: 5 + r: nodeData[i].r }) }