import maya.cmds as cmds
import math
import maya.mel as mm
def getDistance(start, end):
#start and end must be lists xyz
v = [start[0]-end[0], start[1]-end[1], start[2]-end[2]] #list format x,y,z
vector = "<<" + str(v[0]) + "," + str(v[1]) + "," + str(v[2]) + ">>"
mag = mm.eval("mag " + vector + ";")
return mag
#########THIS IS THE NON_RECURSIVE PART ------ JUST SKIP#######################
'''
mySquare = cmds.nurbsSquare(sl1=10, sl2=15)
isSides = cmds.filterExpand (sm=9)
pos = []
for i in range (len(isSides)):
posa = cmds.pointPosition(isSides[i]+".cv[0]")
pos.append (posa)
diag = getDistance(pos[0],pos[2])
a = getDistance(pos[2],pos[3])
b = getDistance(pos[3],pos[0])
h = math.sqrt(a*a - ((a*diag)/(b+a)) * ((a*diag)/(b+a)))
mySquare2 = cmds.nurbsSquare(sl1=h, sl2=diag)
isSides2 = cmds.filterExpand (sm=9)
pos2 = []
for i in range (len(isSides2)):
posb = cmds.pointPosition(isSides2[i]+".cv[0]")
pos2.append (posb)
#get diference between actual location and move
dist = getDistance(pos[2],pos2[2])
p1 = pos[2]
p2 = pos2[2]
x=p2[0] - p1[0]
print x
y=p2[0] - p1[0]
cmds.move(x,-y,0,mySquare)
#get angle of rotation
sinF = getDistance(pos[0],pos[1])
alpha = math.asin(sinF/diag)
Ld= math.degrees (alpha)
cmds.rotate(0,0,Ld,mySquare2, pivot = pos2[2])
'''
#create initial rectangle
mySquare = cmds.nurbsSquare(sl1=a, sl2=b)
#define recursive function
def MyRecursive(iterations,a,b):
isSides = cmds.filterExpand (sm=9)
pos = []
for i in range (len(isSides)):
posa = cmds.pointPosition(isSides[i]+".cv[0]")
pos.append (posa)
#define length of diagonal in order to use it for next rectangle
diag = getDistance(pos[0],pos[2])
#define length of 2 sides to get height
a = getDistance(pos[2],pos[3])
b = getDistance(pos[3],pos[0])
#get height of triangle (diagonal and the two sides)
h = math.sqrt(a*a - ((a*diag)/(b+a)) * ((a*diag)/(b+a)))
#create new rectangle with l2=diagonal length and l1= height of triangle
mySquare2 = cmds.nurbsSquare(sl1=h, sl2=diag)
isSides2 = cmds.filterExpand (sm=9)
pos2 = []
for i in range (len(isSides2)):
posb = cmds.pointPosition(isSides2[i]+".cv[0]")
pos2.append (posb)
#get diference between actual location and move to future pivot point
dist = getDistance(pos[2],pos2[2])
p1 = pos[2]
p2 = pos2[2]
x=p2[0] - p1[0]
y=p2[0] - p1[0]
cmds.move(x,-y,0,mySquare)
#get angle of rotation from diagonal
sinF = getDistance(pos[0],pos[1])
alpha = math.asin(sinF/diag)
Ld= math.degrees (alpha)
#rotate on diagonal
cmds.rotate(0,0,Ld,mySquare2, pivot = pos2[2])
#recursion part
#if else conditions
if iterations == 0:
return "Done"
else:
iterations -= 1
MyRecursive(iterations, a,b)
#call function
MyRecursive(10,10,15)
The problems i have are first of all that the height of the triangle i am calculating is not corresponding to the actual height.
Second would be that the recursion is not working as it should.
What it should do is first create a rectangle, create another one(with length=diagonal, and width=height of the triangle formed by diagonal and two sides). Rotate the last created rectangle on the diagonal, so that one of the sides "becomes" the diagonal. And then repeat everything for the next one.
Hi!
ReplyDeleteClearly something is going on wrong here. I mean, the whole things works and returns no errors, and lots of squares are created (look in the outliner...), but not the way you want, right? So something is wrong with the values you are getting via the mathematical calculations. You should print them out and analyze them closely. A diagram of this idea is also missing, and trust me, it helps to solve strange problems like this.
So recheck the way you get your values (side lengths, diagonals, triangle heights), because you problem lies there. Otherwise it would not even create all the squares. The way you are calling the recursion is working fine...