import Blender
from Blender import NMesh
## Calculate the line segment PaPb that is the shortest
route between
## two lines P1P2 and P3P4. Calculate also the values of
mua and
## mub where
## Pa = P1 + mua (P2 - P1)
## Pb = P3 + mub (P4 - P3)
def LineLineIntersect(p1,p2,p3,p4):
EPS=0.0000001
var = 0
p13, p43 = [0,0,0],[0,0,0]
p21 = [0,0,0]
p13[0] = p1[0] - p3[0]
p13[1] = p1[1] - p3[1]
p13[2] = p1[2] - p3[2]
p43[0] = p4[0] - p3[0]
p43[1] = p4[1] - p3[1];
p43[2] = p4[2] - p3[2];
if (abs(p43[0]) < EPS) and (abs(p43[1])
< EPS) and (abs(p43[2]) < EPS):
var = 0
else:
var = 1
p21[0] = p2[0] - p1[0];
p21[1] = p2[1] - p1[1];
p21[2] = p2[2] - p1[2];
if (abs(p21[0]) < EPS) and (abs(p21[1])
< EPS) and (abs(p21[2]) < EPS):
var = 0
else:
var = 1
d1343 = p13[0] * p43[0] + p13[1] * p43[1] + p13[2]
* p43[2]
d4321 = p43[0] * p21[0] + p43[1] * p21[1] + p43[2]
* p21[2]
d1321 = p13[0] * p21[0] + p13[1] * p21[1] + p13[2]
* p21[2]
d4343 = p43[0] * p43[0] + p43[1] * p43[1] + p43[2]
* p43[2]
d2121 = p21[0] * p21[0] + p21[1] * p21[1] + p21[2]
* p21[2]
denom = d2121 * d4343 - d4321 * d4321
print denom
if (abs(denom) < EPS):
var = 0
else:
var = 1
numer = d1343 * d4321 - d1321 * d4343
if var==1:
mua = numer / denom
mub = (d1343 + d4321 * (mua)) / d4343
pa=[0.0,0.0,0.0]
pb=[0.0,0.0,0.0]
pa[0] = p1[0] + mua * p21[0]
pa[1] = p1[1] + mua * p21[1]
pa[2] = p1[2] + mua * p21[2]
pb[0] = p3[0] + mub * p43[0]
pb[1] = p3[1] + mub * p43[1]
pb[2] = p3[2] + mub * p43[2]
return [var, pa, pb, mua, mub]
else:
return [var]
try:
O=Blender.Object.GetSelected()[0]
me=O.getData()
S=[s for s in me.verts if s.sel==1]
for s in S: s.sel=0
print S
z=len(S)
print z
while z>=4:
p1=S[z-4]
p2=S[z-3]
p3=S[z-2]
p4=S[z-1]
coord=LineLineIntersect(p1,p2,p3,p4)
print coord
f=NMesh.Face()
for p in [p1,p2]: f.append(me.verts[me.verts.index(p)])
f=NMesh.Face()
for p in [p3,p4]: f.append(me.verts[me.verts.index(p)])
me.faces.append(f)
if coord[0]==1:
v=NMesh.Vert()
for n
in [0,1,2] : v[n]=coord[1][n]
me.verts.append(v)
v=NMesh.Vert()
for n
in [0,1,2] : v[n]=coord[2][n]
me.verts.append(v)
f=NMesh.Face()
for n
in [-1,-2] : f.append(me.verts[n])
me.faces.append(f)
me.update()
z-=1
except:
pass |