예제 #1
0
int main(int argc, char const *argv[])
{
	while (scanf("%d", &n) && n) {
		for (int i = 0; i < n; i++) {
			scanf("%lf%lf%lf", x + i, y + i, z + i);
		}

		double x0 = 0, y0 = 0, z0 = 0, lambda = 1;
		for (int k = 0; k < 100000; k++) {
			int i_opt;
			double d_opt = -1;
			for (int i = 0; i < n; i++) {
				double d = sqsum(x[i] - x0, y[i] - y0, z[i] - z0);
				if (d_opt < d) {
					d_opt = d;
					i_opt = i;
				}
			}
			x0 += lambda * (x[i_opt] - x0);
			y0 += lambda * (y[i_opt] - y0);
			z0 += lambda * (z[i_opt] - z0);
			lambda *= 0.99;
		}
		double radius = 0;
		for (int i = 0; i < n; i++) {
			double d = sqsum(x[i] - x0, y[i] - y0, z[i] - z0);
			if (radius < d) {
				radius = d;
			}
		}
		printf("%.9f\n", sqrt(radius));
		printf("%.9f %.9f %.9f\n", x0, y0, z0);
	}
	return 0;
}
예제 #2
0
파일: recorder.c 프로젝트: kudrom/noapp
/*
 * Set the threshold in the recorder_context structure.
 */
static void detect_threshold_cb(pa_stream *stream, size_t length, void *userdata)
{
    //TODO: Calculate a dynamic threshold both when the environment has changed
    // and when a SIGPIPE signal has been received.
    const void *data;
    size_t size = 0;
    static size_t acc_size = 0;
    double sum;
    static double acc_sqsum = 0;
    recorder_context_t *rctx = (recorder_context_t *) userdata;

    pa_stream_peek(stream, &data, &size);
#ifdef DEBUG
    fwrite(data, sizeof(uint8_t), size, threshold_file);
#endif
    if (data)
        pa_stream_drop(stream);

    /* We are sampling with 16 bits but size is measured in bytes */
    size >>= 1;
    sum = sqsum((const uint8_t *) data, size);
    acc_sqsum += sum;
    acc_size += size;
    rctx->threshold = sqrt(acc_sqsum / acc_size);
}
예제 #3
0
void meanStdDev(const Size2D &size,
                const u8 * srcBase, ptrdiff_t srcStride,
                f32 * pMean, f32 * pStdDev)
{
    internal::assertSupportedConfiguration();
#ifdef CAROTENE_NEON
    f64 fsum = 0.0f, fsqsum = 0.0f;
    sqsum(size, srcBase, srcStride, &fsum, &fsqsum, 1);

    // calc mean and stddev
    f64 itotal = 1.0 / size.total();
    f64 mean = fsum * itotal;
    f64 stddev = sqrt(std::max(fsqsum * itotal - mean * mean, 0.0));

    if (pMean)
        *pMean = mean;
    if (pStdDev)
        *pStdDev = stddev;
#else
    (void)size;
    (void)srcBase;
    (void)srcStride;
    (void)pMean;
    (void)pStdDev;
#endif
}
예제 #4
0
파일: recorder.c 프로젝트: kudrom/noapp
/*
 * Calculates the root-median-square power of a sequence of size's length
 */
static double calculate_rms_power(const uint8_t *data, size_t size)
{
    double sum = sqsum(data, size);
    return sqrt(sum / size);
}