double solve(double left, double right){
    while(xy(left, right)){
        double mid = DMID(left, right);
        double midmid = DMID(mid, right);
        double mid_area = cal(mid);
        double midmid_area = cal(midmid);
        if (xyd(mid_area, midmid_area))     //下凸函数,上凸函数用dyd(mid_area, midmid_area)
            right = midmid;
        else
            left = mid;
    }
    return left;
}
Пример #2
0
//--------------------------------------------------------------------------------------------------
/// 
//--------------------------------------------------------------------------------------------------
void RimWellPathGeometryDef::setReferencePointXyz(const cvf::Vec3d& refPointXyz)
{
    cvf::Vec3d xyd(refPointXyz); 
    xyd.z() = -xyd.z(); 
    m_referencePointUtmXyd = xyd;
}
__declspec(dllexport) void invmad(int m, double xp[], int kp,
	int *kxx, double p[], int n, int incr)
{
	/* calculate kx preimage p node */
	/*   node type mapping m level  */

	double mne, d1, dd, x, dr, del, convers;
	double r, d, u[10], y[10];
	int i, k, kx, nexp;
	void xyd(double *, int, double *, int);

	kx = 0;
	kp--;
	for (nexp = 1, i = 0; i<n; i++) {
		nexp *= 2; u[i] = -1.0;
	}
	dr = nexp;
	for (mne = 1, r = 0.5, i = 0; i<m; i++) {
		mne *= dr; r *= 0.5;
	}
	dr = mne / nexp;

	dr=dr-fmod(dr,1.0);  
	//dr = (dr>0) ? floor(dr) : ceil(dr);

	del = 1. / (mne - dr);
	d1 = del*(incr + 0.5);
	for (kx = -1; kx<kp;) {
		for (i = 0; i<n; i++) {       /* label 2 */
			d = p[i];
			y[i] = d - r*u[i];
		}
		for (i = 0; (i<n) && (fabs(y[i]) < 0.5); i++);
		if (i >= n) {
			xyd(&x, m, y, n);
			dr = x*mne;
			dd=dr-fmod(dr,1.0); 
			//dd = (dr>0) ? floor(dr) : ceil(dr);
			dr = dd / nexp;
			dd=dd-dr+fmod(dr,1.0); 
			//dd = dd - ((dr>0) ? floor(dr) : ceil(dr));
			x = dd*del;
			if (kx>kp) break;
			k = kx++;                     /* label 9 */
			if (kx == 0) xp[0] = x;
			else {
				while (k >= 0) {
					dr = fabs(x - xp[k]);     /* label 11 */
					if (dr <= d1) {
						for (kx--; k<kx; k++, xp[k] = xp[k + 1]);
						goto m6;
					}
					else
						if (x <= xp[k]) {
							xp[k + 1] = xp[k]; k--;
						}
						else break;
				}
				xp[k + 1] = x;
			}
		}
	m6: for (i = n - 1; (i >= 0) && (u[i] = (u[i] <= 0.0) ? 1 : -1)<0; i--);
		if (i<0) break;
	}
	*kxx = ++kx;

}