TPCCLIB
Toggle main menu visibility
Loading...
Searching...
No Matches
libtpcidi
heart.c
Go to the documentation of this file.
1
5
/*****************************************************************************/
6
#include "
libtpcidi.h
"
7
/*****************************************************************************/
8
9
/*****************************************************************************/
17
int
imgSimulateRing
(
21
IMG
*img,
23
int
fi,
25
int
zi,
27
double
cx,
29
double
cy,
31
double
r1,
33
double
r2,
36
double
vr,
39
double
vi,
42
double
vo,
44
int
verbose
45
) {
46
int
nr, ni, no, xi, yi, i, j;
47
double
dx[5], dy[5], v, d;
48
double
ri2, ro2;
49
50
if
(verbose>0)
51
printf(
"%s(img, %d, %d, %g, %g, %g, %g, %g, %g, %g, %d)\n"
,
52
__func__, fi, zi, cx, cy, r1, r2, vr, vi, vo, verbose);
53
if
(r1>=r2 || r1<0.0) {
54
if
(verbose>0) fprintf(stderr,
"Error: invalid radius.\n"
);
55
return
(1);
56
}
57
58
if
(img->
status
<
IMG_STATUS_OCCUPIED
)
return
(1);
59
if
(zi<0 || zi>=img->
dimz
)
return
(2);
60
if
(img->
sizey
<=0.0 || img->
sizex
<=0.0)
return
(3);
61
if
(img->
sizey
!=img->
sizex
)
return
(4);
62
if
(img->
dimt
<1 || fi>=img->
dimt
)
return
(5);
63
if
(r1<0.0 || r2<r1)
return
(6);
64
65
/* Compare radius ^2 to sum of squared distances instead of square roots */
66
ri2=r1*r1; ro2=r2*r2;
67
for
(yi=0; yi<img->
dimy
; yi++) {
68
dy[0]=(0.1+(double)yi)*img->
sizey
- cy;
69
for
(j=1; j<5; j++) dy[j]=dy[j-1]+0.2*img->
sizey
;
70
for
(xi=0; xi<img->
dimx
; xi++) {
71
dx[0]=(0.1+(double)xi)*img->
sizex
- cx;
72
for
(i=1; i<5; i++) dx[i]=dx[i-1]+0.2*img->
sizex
;
73
nr=ni=no=0;
74
for
(i=0; i<5; i++)
for
(j=0; j<5; j++) {
75
d=dx[i]*dx[i]+dy[j]*dy[j];
76
if
(d<ri2) ni++;
else
if
(d<ro2) nr++;
else
no++;
77
}
78
v=(double)nr*vr/25.0;
79
v+=(double)ni*vi/25.0;
80
v+=(double)no*vo/25.0;
81
img->
m
[zi][yi][xi][fi]+=v;
82
}
83
}
84
return
(0);
85
}
86
/*****************************************************************************/
87
88
/*****************************************************************************/
96
int
simMyocDiameterCurve
(
98
DFT
*dft,
100
double
t1,
102
double
t2,
104
double
hbr,
106
double
maxdiam,
108
double
mindiam
109
) {
110
int
n, i, ret;
111
double
s;
112
double
rfract[10]={1.0, 0.6, 0.25, 0.0, 0.1, 0.25, 0.6, 0.8, 0.9, 0.95};
113
114
/* check input */
115
if
(dft==NULL)
return
(1);
116
if
(t2<t1)
return
(1);
117
if
(maxdiam<mindiam)
return
(1);
118
119
/* delete any previous curve contents */
120
dftEmpty
(dft);
121
122
/* convert heart rate to per sec */
123
if
(hbr>0.0) hbr/=60.0;
else
hbr=0.0;
124
125
/* calculate the nr of samples */
126
if
(hbr>0.0 && (t2-t1)>0.0) n=10.0*(t2-t1)/hbr;
else
n=1;
127
128
/* Set up curve struct */
129
ret=
dftSetmem
(dft, n, 1);
if
(ret!=0)
return
(3);
130
dft->
frameNr
=n; dft->
voiNr
=1; dft->
timetype
=
DFT_TIME_STARTEND
;
131
dft->
timeunit
=TUNIT_SEC;
132
133
/* Fill curve */
134
dft->
x1
[0]=t1;
if
(hbr>0.0) s=0.1*hbr;
else
s=t2-t1;
135
for
(i=n=0; i<dft->
frameNr
; i++) {
136
if
(i>0) dft->
x1
[i]=dft->
x2
[i-1];
137
dft->
x2
[i]=dft->
x1
[i]+s; dft->
x
[i]=0.5*(dft->
x1
[i]+dft->
x2
[i]);
138
dft->
voi
[0].
y
[i]=mindiam+rfract[n]*(maxdiam-mindiam); n++;
if
(n==10) n=0;
139
}
140
141
return
0;
142
}
143
/*****************************************************************************/
144
145
/*****************************************************************************/
154
int
imgSimulateSphere
(
158
IMG
*img,
160
int
fi,
162
double
cx,
164
double
cy,
166
double
cz,
168
double
r1,
170
double
r2,
173
double
vr,
176
double
vi,
179
double
vo,
181
int
verbose
182
) {
183
int
nr, ni, no, xi, yi, zi, i, j, k;
184
double
dx[5], dy[5], dz[5], v, d;
185
double
ri2, ro2;
186
187
if
(verbose>0)
188
printf(
"%s(img, %d, %g, %g, %g, %g, %g, %g, %g, %g, %d)\n"
,
189
__func__, fi, cx, cy, cz, r1, r2, vr, vi, vo, verbose);
190
if
(r1>=r2 || r1<0.0) {
191
if
(verbose>0) fprintf(stderr,
"Error: invalid radius.\n"
);
192
return
(1);
193
}
194
195
if
(img->
status
<
IMG_STATUS_OCCUPIED
)
return
(1);
196
if
(img->
sizez
<=0.0 || img->
sizey
<=0.0 || img->
sizex
<=0.0)
return
(2);
197
if
(img->
sizey
!=img->
sizex
|| img->
sizez
!=img->
sizex
)
return
(3);
198
if
(img->
dimt
<1 || fi>=img->
dimt
)
return
(4);
199
if
(r1<0.0 || r2<r1)
return
(5);
200
201
/* Compare radius ^2 to sum of squared distances instead of square roots */
202
ri2=r1*r1; ro2=r2*r2;
203
for
(zi=0; zi<img->
dimz
; zi++) {
204
dz[0]=(0.1+(double)zi)*img->
sizez
- cz;
205
for
(k=1; k<5; k++) dz[k]=dz[k-1]+0.2*img->
sizez
;
206
for
(yi=0; yi<img->
dimy
; yi++) {
207
dy[0]=(0.1+(double)yi)*img->
sizey
- cy;
208
for
(j=1; j<5; j++) dy[j]=dy[j-1]+0.2*img->
sizey
;
209
for
(xi=0; xi<img->
dimx
; xi++) {
210
dx[0]=(0.1+(double)xi)*img->
sizex
- cx;
211
for
(i=1; i<5; i++) dx[i]=dx[i-1]+0.2*img->
sizex
;
212
nr=ni=no=0;
213
for
(i=0; i<5; i++)
for
(j=0; j<5; j++)
for
(k=0; k<5; k++) {
214
d=dx[i]*dx[i]+dy[j]*dy[j]+dz[k]*dz[k];
215
if
(d<ri2) ni++;
else
if
(d<ro2) nr++;
else
no++;
216
}
217
v=(double)nr*vr/125.0;
218
v+=(double)ni*vi/125.0;
219
v+=(double)no*vo/125.0;
220
img->
m
[zi][yi][xi][fi]+=v;
221
}
222
}
223
}
224
return
(0);
225
}
226
/*****************************************************************************/
227
228
/*****************************************************************************/
dftSetmem
int dftSetmem(DFT *data, int frameNr, int voiNr)
Definition
dft.c:57
dftEmpty
void dftEmpty(DFT *data)
Definition
dft.c:20
imgSimulateSphere
int imgSimulateSphere(IMG *img, int fi, double cx, double cy, double cz, double r1, double r2, double vr, double vi, double vo, int verbose)
Definition
heart.c:154
imgSimulateRing
int imgSimulateRing(IMG *img, int fi, int zi, double cx, double cy, double r1, double r2, double vr, double vi, double vo, int verbose)
Definition
heart.c:17
simMyocDiameterCurve
int simMyocDiameterCurve(DFT *dft, double t1, double t2, double hbr, double maxdiam, double mindiam)
Definition
heart.c:96
DFT_TIME_STARTEND
#define DFT_TIME_STARTEND
Definition
libtpccurveio.h:439
libtpcidi.h
Header file for libtpcidi.
IMG_STATUS_OCCUPIED
#define IMG_STATUS_OCCUPIED
Definition
libtpcimgio.h:1479
DFT
Definition
libtpccurveio.h:73
DFT::timetype
int timetype
Definition
libtpccurveio.h:99
DFT::voi
Voi * voi
Definition
libtpccurveio.h:108
DFT::timeunit
int timeunit
Definition
libtpccurveio.h:85
DFT::x1
double * x1
Definition
libtpccurveio.h:104
DFT::voiNr
int voiNr
Definition
libtpccurveio.h:78
DFT::x2
double * x2
Definition
libtpccurveio.h:106
DFT::frameNr
int frameNr
Definition
libtpccurveio.h:76
DFT::x
double * x
Definition
libtpccurveio.h:102
IMG
Definition
libtpcimgio.h:1657
IMG::sizex
float sizex
Definition
libtpcimgio.h:1714
IMG::dimx
unsigned short int dimx
Definition
libtpcimgio.h:1780
IMG::m
float **** m
Definition
libtpcimgio.h:1799
IMG::status
char status
Definition
libtpcimgio.h:1665
IMG::dimt
unsigned short int dimt
Definition
libtpcimgio.h:1778
IMG::sizey
float sizey
Definition
libtpcimgio.h:1716
IMG::dimz
unsigned short int dimz
Definition
libtpcimgio.h:1784
IMG::dimy
unsigned short int dimy
Definition
libtpcimgio.h:1782
IMG::sizez
float sizez
Definition
libtpcimgio.h:1718
Voi::y
double * y
Definition
libtpccurveio.h:59
Generated on
for TPCCLIB by
1.17.0