00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "plplotP.h"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 void
00043 c_plhist(PLINT n, PLFLT *data, PLFLT datmin, PLFLT datmax,
00044 PLINT nbin, PLINT flags)
00045 {
00046 PLINT i, bin;
00047 PLFLT *x, *y, dx, ymax;
00048
00049 if (plsc->level < 1) {
00050 plabort("plhist: Please call plinit first");
00051 return;
00052 }
00053 if (plsc->level < 3 && (flags & 1)) {
00054 plabort("plhist: Please set up window first");
00055 return;
00056 }
00057 if (datmin >= datmax) {
00058 plabort("plhist: Data range invalid");
00059 return;
00060 }
00061 if ( ! (x = (PLFLT *) malloc((size_t) nbin * sizeof(PLFLT)))) {
00062 plabort("plhist: Out of memory");
00063 return;
00064 }
00065 if ( ! (y = (PLFLT *) malloc((size_t) nbin * sizeof(PLFLT)))) {
00066 free((void *) x);
00067 plabort("plhist: Out of memory");
00068 return;
00069 }
00070
00071 dx = (datmax - datmin) / nbin;
00072 for (i = 0; i < nbin; i++) {
00073 x[i] = datmin + i * dx;
00074 y[i] = 0.0;
00075 }
00076
00077 for (i = 0; i < n; i++) {
00078 bin = (PLINT)((data[i] - datmin) / dx);
00079 if ((flags & 2) == 0) {
00080 bin = bin > 0 ? bin : 0;
00081 bin = bin < nbin ? bin : nbin - 1;
00082 y[bin]++;
00083 } else {
00084 if(bin >= 0 && bin < nbin) {
00085 y[bin]++;
00086 }
00087 }
00088 }
00089
00090 if (!(flags & 1)) {
00091 ymax = 0.0;
00092 for (i = 0; i < nbin; i++)
00093 ymax = MAX(ymax, y[i]);
00094
00095 plenv(datmin, datmax, (PLFLT) 0.0, (PLFLT) (1.1 * ymax), 0, 0);
00096 }
00097
00098 plbin(nbin, x, y, (flags & (4+8+16+32)) >> 2);
00099 free((void *) x);
00100 free((void *) y);
00101 }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 void
00115 c_plbin(PLINT nbin, PLFLT *x, PLFLT *y, PLINT flags)
00116 {
00117 PLINT i;
00118 PLFLT xmin, xmax, vpwxmi, vpwxma, vpwymi, vpwyma;
00119
00120 if (plsc->level < 3) {
00121 plabort("plbin: Please set up window first");
00122 return;
00123 }
00124
00125
00126
00127 for (i = 0; i < nbin - 1; i++) {
00128 if (x[i] >= x[i + 1]) {
00129 plabort("plbin: Elements of x array must be increasing");
00130 return;
00131 }
00132 }
00133
00134 plP_xgvpw(&vpwxmi, &vpwxma, &vpwymi, &vpwyma);
00135 if (!(flags & 1)) {
00136 for (i = 0; i < nbin - 1; i++) {
00137 if (!(flags & 4) || (y[i] != vpwymi)) {
00138 pljoin(x[i], vpwymi, x[i], y[i]);
00139 pljoin(x[i], y[i], x[i + 1], y[i]);
00140 pljoin(x[i + 1], y[i], x[i + 1], vpwymi);
00141 }
00142 }
00143 if (flags & 2) {
00144 if (!(flags & 4) || (y[i] != vpwymi)) {
00145 int xm = (int)(x[i] + (x[i] - x[i-1]));
00146 pljoin(x[i], vpwymi, x[i], y[i]);
00147 pljoin(x[i], y[i], xm, y[i]);
00148 pljoin(xm, y[i], xm, vpwymi);
00149 }
00150 } else {
00151 if (x[i] < vpwxma) {
00152 if (!(flags & 4) || (y[i] != vpwymi)) {
00153 pljoin(x[i], vpwymi, x[i], y[i]);
00154 pljoin(x[i], y[i], vpwxma, y[i]);
00155 pljoin(vpwxma, y[i], vpwxma, vpwymi);
00156 }
00157 }
00158 }
00159 } else {
00160 if (nbin < 2)
00161 return;
00162 if (flags & 2) {
00163 xmin = MAX(vpwxmi, 0.5 * (3 * x[0] - x[1]));
00164 } else {
00165 xmin = vpwxmi;
00166 }
00167
00168 xmax = MAX(0.5 * (x[0] + x[1]), vpwxmi);
00169 if (xmin < xmax) {
00170 pljoin(xmin, vpwymi, xmin, y[0]);
00171 pljoin(xmin, y[0], xmax, y[0]);
00172 pljoin(xmax, y[0], xmax, vpwymi);
00173 }
00174 for (i = 1; i < nbin - 1; i++) {
00175 xmin = xmax;
00176 xmax = MIN(0.5 * (x[i] + x[i + 1]), vpwxma);
00177 if (!(flags & 4) || (y[i] != vpwymi)) {
00178 pljoin(xmin, vpwymi, xmin, y[i]);
00179 pljoin(xmin, y[i], xmax, y[i]);
00180 pljoin(xmax, y[i], xmax, vpwymi);
00181 }
00182 }
00183 xmin = xmax;
00184 xmax = vpwxma;
00185 if (flags & 2) {
00186 xmax = MIN(vpwxma, 0.5 * (3 * x[i] - x[i-1]));
00187 } else {
00188 xmax = vpwxma;
00189 }
00190 if (xmin < xmax) {
00191 if (!(flags & 4) || (y[i] != vpwymi)) {
00192 pljoin(xmin, vpwymi, xmin, y[i]);
00193 pljoin(xmin, y[i], xmax, y[i]);
00194 pljoin(xmax, y[i], xmax, vpwymi);
00195 }
00196 }
00197 }
00198 }