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]
Exemplo n.º 6
0
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))