/* (non-Javadoc) * @see net.sourceforge.arbaro.tree.TraversableTree#traverseTree(net.sourceforge.arbaro.tree.TreeTraversal) */ DX_Transformation trunkDirection(DX_Transformation trf, CS_LevelParams lpar) { // get rotation angle double rotangle; if (lpar.nRotate >= 0) { // rotating trunk trunk_rotangle = (trunk_rotangle + lpar.nRotate + lpar.var(lpar.nRotateV) + 360) % 360; rotangle = trunk_rotangle; } else { // alternating trunks if (Math.Abs(trunk_rotangle) != 1) { trunk_rotangle = 1; } trunk_rotangle = -trunk_rotangle; rotangle = trunk_rotangle * (180 + lpar.nRotate + lpar.var(lpar.nRotateV)); } // get downangle double downangle; downangle = lpar.nDownAngle + lpar.var(lpar.nDownAngleV); return(trf.rotxz(downangle, rotangle)); }
/** * Calcs the direction of a substem from the parameters * * @param trf The transformation of the current stem segment * @param offset The offset of the substem from the base of the currents stem * @return The direction of the substem */ DX_Transformation substemDirection(DX_Transformation trf, float offset) { CS_LevelParams lpar_1 = par.getLevelParams(stemlevel + 1); //lev = min(level+1,3); // get rotation angle float rotangle; if (lpar_1.nRotate >= 0) { // rotating substems substemRotangle = (substemRotangle + lpar_1.nRotate + lpar_1.var(lpar_1.nRotateV) + 360) % 360; rotangle = substemRotangle; } else { // alternating substems if (Math.Abs(substemRotangle) != 1) { substemRotangle = 1; } substemRotangle = -substemRotangle; rotangle = substemRotangle * (180 + lpar_1.nRotate + lpar_1.var(lpar_1.nRotateV)); } // get downangle float downangle; if (lpar_1.nDownAngleV >= 0) { downangle = lpar_1.nDownAngle + lpar_1.var(lpar_1.nDownAngleV); } else { float len = (stemlevel == 0) ? length * (1 - par.BaseSize) : length; downangle = lpar_1.nDownAngle + lpar_1.nDownAngleV * (1 - 2 * par.getShapeRatio((length - offset) / len, 0)); } /* * if (Console.debug()) * DBG("Stem.substem_direction(): down: "+downangle+" rot: "+rotangle); */ return(trf.rotxz(downangle, rotangle)); }