65 lines
1.9 KiB
Plaintext
65 lines
1.9 KiB
Plaintext
// $Id: interpxyz.hoc,v 1.2 2005/09/10 23:02:15 ted Exp $
|
|
/* Compute xyz coords of nodes in a model cell
|
|
whose topology & geometry are defined by pt3d data.
|
|
Expect sections to already exist, and that the xtra mechanism has been inserted
|
|
*/
|
|
|
|
objref xx, yy, zz, length // original data, irregularly spaced
|
|
objref xint, yint, zint, range // interpolated data, spaced at regular intervals
|
|
|
|
proc grindaway() { local ii, nn, kk, xr
|
|
forall {
|
|
if (ismembrane("xtra")) {
|
|
// get the data for the section
|
|
nn = n3d()
|
|
xx = new Vector(nn)
|
|
yy = new Vector(nn)
|
|
zz = new Vector(nn)
|
|
length = new Vector(nn)
|
|
|
|
for ii = 0,nn-1 {
|
|
xx.x[ii] = x3d(ii)
|
|
yy.x[ii] = y3d(ii)
|
|
zz.x[ii] = z3d(ii)
|
|
length.x[ii] = arc3d(ii)
|
|
}
|
|
|
|
// to use Vector class's .interpolate()
|
|
// must first scale the independent variable
|
|
// i.e. normalize length along centroid
|
|
length.div(length.x[nn-1])
|
|
|
|
// initialize the destination "independent" vector
|
|
range = new Vector(nseg+2)
|
|
range.indgen(1/nseg)
|
|
range.sub(1/(2*nseg))
|
|
range.x[0]=0
|
|
range.x[nseg+1]=1
|
|
|
|
// length contains the normalized distances of the pt3d points
|
|
// along the centroid of the section. These are spaced at
|
|
// irregular intervals.
|
|
// range contains the normalized distances of the nodes along the
|
|
// centroid of the section. These are spaced at regular intervals.
|
|
// Ready to interpolate.
|
|
|
|
xint = new Vector(nseg+2)
|
|
yint = new Vector(nseg+2)
|
|
zint = new Vector(nseg+2)
|
|
xint.interpolate(range, length, xx)
|
|
yint.interpolate(range, length, yy)
|
|
zint.interpolate(range, length, zz)
|
|
|
|
// for each node, assign the xyz values to x_xtra, y_xtra, z_xtra
|
|
// don't bother computing coords of the 0 and 1 ends
|
|
// also avoid writing coords of the 1 end into the last internal node's coords
|
|
for ii = 1, nseg {
|
|
xr = range.x[ii]
|
|
x_xtra(xr) = xint.x[ii]
|
|
y_xtra(xr) = yint.x[ii]
|
|
z_xtra(xr) = zint.x[ii]
|
|
}
|
|
}
|
|
}
|
|
}
|