import math def volumeCylinder(x0,y0,z0,x1,y1,z1,r): return math.pi * r**2 * ((x1-x0)**2 + (y1-y0)**2 + (z1-z0)**2 )**(1/2) def distLinePoint(x0,y0,z0,x1,y1,z1,x2,y2,z2): a2 = (x1-x0)**2 + (y1-y0)**2 + (z1-z0)**2 b2 = (x2-x0)**2 + (y2-y0)**2 + (z2-z0)**2 pole2 = a2*b2 - ((x1-x0)*(x2-x0) + (y1-y0)*(y2-y0) + (z1-z0)*(z2-z0))**2 #kwadrat pola równoległoboku z tożsamości (a x b)^2 = a^2 * b^2 - (a . b)^2 return (pole2/a2)**(1/2) # odległość od prostej wyznaczonej przez punkty P1, P0, czyli wysokość równoległoboku def inCylinder(x0,y0,z0,x1,y1,z1,r,x2,y2,z2): if distLinePoint(x0,y0,z0,x1,y1,z1,x2,y2,z2) > r: return 0 # w następnej linii interesuje nas znak iloczynu skalarnego, # gdy dodatni, to kąt tworzony przez wektory zaczepione w P1 i P0 jest mniejszy od 90 if (x1-x0)*(x2-x0)+(y1-y0)*(y2-y0)+(z1-z0)*(z2-z0) > 0 and (x0-x1)*(x2-x1)+(y0-y1)*(y2-y1)+(z0-z1)*(z2-z1) > 0: return 1 return 0