def findNearestRoofPoint(polygon,a,b):#return min_distance.index(min(min_distance)) - Finds the point on a polygon which is closest to a line segment given by two points Va=Vector(a[0],a[1],0) Vb=Vector(b[0],b[1],0) Vab=Vb.sum(Va.multiply(-1)) min_distance=[] for point in polygon: p=Vector(point[0],point[1],0) ap=p.sum(Va.multiply(-1)) min_distance.append((Vab.cross(ap).magnitude())/Vab.magnitude()) #print min(min_distance), "in roof point" return min_distance.index(min(min_distance))
def perDistancePointLine_2(a,s1,s2): #return [min_distance,final_point] - Gives minimum distance between point and a line and the point of intersection of perpendicular from the point onto the line Va=Vector(a[0],a[1],0) Vs1=Vector(s1[0],s1[1],0) Vs2=Vector(s2[0],s2[1],0) Vas1=Va.sum(Vs1.multiply(-1)) Vs1s2=Vs2.sum(Vs1.multiply(-1)) min_distance=(Vas1.cross(Vs1s2)).magnitude()/Vs1s2.magnitude() perpendicular_point_vector=Vs1s2.multiply(Vas1.dot(Vs1s2)/Vs1s2.magnitude()/Vs1s2.magnitude()) final_point=perpendicular_point_vector.sum(Vs1) return [min_distance,final_point]
def isInternal(a,b,c):# returns True if a is internal to a and b Va=Vector(a[0],a[1],0) Vb=Vector(b[0],b[1],0) Vc=Vector(c[0],c[1],0) Vab=Va.sum(Vb.multiply(-1)) Vac=Va.sum(Vc.multiply(-1)) Vbc=Vc.sum(Vb.multiply(-1)) zero_vector=Point(0,0,0) min_distance=100 final_point=[] type=[] if Vbc.magnitude()<.0001: return False if abs(Vab.dot(Vbc)/Vbc.magnitude())<= Vbc.magnitude() and abs(Vac.dot(Vbc)/Vbc.magnitude())<= Vbc.magnitude(): return True else : return False return False
def projectOnLine(arg1,arg2,arg3): #return t which is the projection amount between 0 and 1 - find the projection of a point on a line segment a=Vector(arg1[0],arg1[1],0) b=Vector(arg2[0],arg2[1],0) k=Vector(arg3[0],arg3[1],0) #a=Vector(1,2,0) #b=Vector(3,4,0) #k=Vector(2,-8,0) axis_vector=b.sum(a.multiply(-1)) per_vector=Vector(axis_vector.y,-1*axis_vector.x,0) lhs=a.sum(k.multiply(-1)) lhsx=float(lhs.x) lhsy=float(lhs.y) axisx=float(axis_vector.x) axisy=float(axis_vector.y) perx=float(per_vector.x) pery=float(per_vector.y) t=(lhsx-perx/pery*lhsy)/(perx*axisy/pery-axisx) return t
def distanceBetweenSegmentandBuilding(ab,a,af,s1,s2):#return final_result[0][1],final_result[1] - Gives min distance between two adjacent sides of a polygon and a line segment and the point of of shortest distance Vab=Vector(ab[0],ab[1],0) Va=Vector(a[0],a[1],0) Vaf=Vector(af[0],af[1],0) Vs1=Vector(s1[0],s1[1],0) Vs2=Vector(s2[0],s2[1],0) Vs1s2=Vs2.sum(Vs1.multiply(-1)) result=[] result.append([perDistancePointLine(Vab,Vs1,Vs2,Vs1s2),Vab]) result.append([perDistancePointLine(Va,Vs1,Vs2,Vs1s2),Va]) result.append([perDistancePointLine(Vaf,Vs1,Vs2,Vs1s2),Vaf]) distances=[result[0][0][0],result[1][0][0],result[2][0][0]] final_result=result[distances.index(min(distances))] return final_result[0][1],final_result[1]
import numpy as np from vectors import Point, Vector import functools v1 = Vector(1, 2, 3) v2 = Vector(10, 20, 30) print(v1.add(10)) print(v1.sum(v2)) # displays <1 22 33> print(v1.magnitude()) #We can multiply a vector by a real number. print(v2.multiply(4)) #=> Vector(4.0, 8.0, 12.0) print(v1.dot(v2)) print(v1.dot(v2, 180)) print(v1.cross(v2)) print(v1.angle(v2)) print(v1.parallel(v2)) print(v1.perpendicular(v2)) #print(v1.non_parallel(v2))