⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displint.h

📁 转化为DIB位图再显示出来的dicom文件C++代码
💻 H
字号:
/* * *  Copyright (C) 1996-2005, OFFIS * *  This software and supporting documentation were developed by * *    Kuratorium OFFIS e.V. *    Healthcare Information and Communication Systems *    Escherweg 2 *    D-26121 Oldenburg, Germany * *  THIS SOFTWARE IS MADE AVAILABLE,  AS IS,  AND OFFIS MAKES NO  WARRANTY *  REGARDING  THE  SOFTWARE,  ITS  PERFORMANCE,  ITS  MERCHANTABILITY  OR *  FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES  OR *  ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND *  PERFORMANCE OF THE SOFTWARE IS WITH THE USER. * *  Module:  dcmimgle * *  Author:  Joerg Riesmeier * *  Purpose: DiCubicSpline Function/Interpolation (Header/Implementation) * *  Last Update:      $Author: meichel $ *  Update Date:      $Date: 2005/12/08 16:48:10 $ *  CVS/RCS Revision: $Revision: 1.19 $ *  Status:           $State: Exp $ * *  CVS/RCS Log at end of file * */#ifndef DISPLINT_H#define DISPLINT_H#include "dcmtk/config/osconfig.h"#include "dcmtk/ofstd/ofcast.h"/*--------------------* *  macro definition  * *--------------------*/// SunCC 4.x does not support default values for template types :-/#define T3_ double/*------------------* *  template class  * *------------------*//** Template class for cubic spline interpolation */template <class T1, class T2 /*, class T3 = double*/>class DiCubicSpline{ public:    /** calculate spline function for given points.     *  T1  = type of x coordinates     *  T2  = type of y coordinates     *  T3_ = type of y coordinates of the spline function     *     ** @param  x    array with x coordinates of given points     *  @param  y    array with y coordinates of given points     *  @param  n    number of entries in array (= points)     *  @param  y2   array used to store the resulting spline function (used for CubicSplineInterpolation)     *  @param  yp1  first derivative of the interpolating function at point 1     *  @param  ypn  first derivative of the interpolating function at point n     *     ** @return true if successful, false otherwise     */    static int Function(const T1 *x,                        const T2 *y,                        const unsigned int n,                        T3_ *y2,                        const T3_ yp1 = 1.0e30,                        const T3_ ypn = 1.0e30)    {        if ((x != NULL) && (y != NULL) && (n > 0) && (y2 != NULL))        {            T3_ *u = new T3_[n];                            // temporary vector            if (u != NULL)            {                register unsigned int i;                T3_ p, qn, sig, un;                if (yp1 > 0.99e30)                          // ignore value for first derivative at point 1                    y2[0] = u[0] = 0.0;                else                {                    y2[0] = -0.5;                    u[0] = (3.0 / (OFstatic_cast(T3_, x[1]) - OFstatic_cast(T3_, x[0]))) *                           ((OFstatic_cast(T3_, y[1]) - OFstatic_cast(T3_, y[0])) /                           (OFstatic_cast(T3_, x[1]) - OFstatic_cast(T3_, x[0])) - yp1);                }                for (i = 1; i < n - 1; ++i)                {                    sig = (OFstatic_cast(T3_, x[i]) - OFstatic_cast(T3_, x[i - 1])) /                          (OFstatic_cast(T3_, x[i + 1]) - OFstatic_cast(T3_, x[i - 1]));                    p = sig * y2[i - 1] + 2.0;                    y2[i] = (sig - 1.0) / p;                    u[i] = (OFstatic_cast(T3_, y[i + 1]) - OFstatic_cast(T3_, y[i])) /                           (OFstatic_cast(T3_, x[i + 1]) - OFstatic_cast(T3_, x[i])) -                           (OFstatic_cast(T3_, y[i]) - OFstatic_cast(T3_, y[i - 1])) /                           (OFstatic_cast(T3_, x[i]) - OFstatic_cast(T3_, x[i - 1]));                    u[i] = (6.0 * u[i] / (OFstatic_cast(T3_, x[i + 1]) -                            OFstatic_cast(T3_, x[i - 1])) - sig * u[i - 1]) / p;                }                if (ypn > 0.99e30)                          // ignore value for first derivative at point 1                    qn = un = 0.0;                else                {                    qn = 0.5;                    un = (3.0 / (OFstatic_cast(T3_, x[n - 1]) - OFstatic_cast(T3_, x[n - 2]))) *                         (ypn - (OFstatic_cast(T3_, y[n - 1]) - OFstatic_cast(T3_, y[n - 2])) /                         (OFstatic_cast(T3_, x[n - 1]) - OFstatic_cast(T3_, x[n - 2])));                }                y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);                for (i = n - 1; i > 0; --i)                    y2[i - 1] = y2[i - 1] * y2[i] + u[i - 1];                delete[] u;                return 1;            }        }        return 0;    }    /** perform cubic spline interpolation for given points.     *  T1  = type of x coordinates     *  T2  = type of y coordinates     *  T3_ = type of y coordinates of the spline function     *     ** @param  xa   array with x coordinates of given points     *  @param  ya   array with y coordinates of given points     *  @param  y2a  array used to store the resulting spline function (calculated by CubicSplineFunction)     *  @param  na   number of entries in above arrays (xa, ya and y2a)     *  @param  x    array with x coordinates of points to be interpolated     *  @param  y    array used to store interpolated values     *  @param  n    number of entries in above array (x and y)     *     ** @return true if successful, false otherwise     */    static int Interpolation(const T1 *xa,                             const T2 *ya,                             const T3_ *y2a,                             const unsigned int na,                             const T1 *x,                             T2 *y,                             const unsigned int n)    {        if ((xa != NULL) && (ya != NULL) && (y2a != NULL) && (na > 0) && (x != NULL) && (y != NULL) && (n > 0))        {            register unsigned int k, i;            register unsigned int klo = 0;            register unsigned int khi = na - 1;            T3_ h, b, a;            for (i = 0; i < n; ++i)            {                if ((xa[klo] > x[i]) || (xa[khi] < x[i]))       // optimization                {                    klo = 0;                    khi = na - 1;                }                while (khi - klo > 1)                           // search right place in the table, if necessary                {                    k = (khi + klo) >> 1;                    if (xa[k] > x[i])                        khi = k;                    else                        klo = k;                }                if (xa[khi] == x[i])                            // optimization: use known values                    y[i] = ya[khi];                else                {                    h = OFstatic_cast(T3_, xa[khi]) - OFstatic_cast(T3_, xa[klo]);                    if (h == 0.0)                               // bad xa input, values must be distinct !                        return 0;                    a = (OFstatic_cast(T3_, xa[khi]) - OFstatic_cast(T3_, x[i])) / h;                    b = (OFstatic_cast(T3_, x[i]) - OFstatic_cast(T3_, xa[klo])) / h;                    y[i] = OFstatic_cast(T2, a * OFstatic_cast(T3_, ya[klo]) + b * OFstatic_cast(T3_, ya[khi]) +                           ((a * a * a - a) * y2a[klo] + (b * b * b - b) * y2a[khi]) * (h * h) / 6.0);                }            }            return 1;        }        return 0;    }};#endif/* * * CVS/RCS Log: * $Log: displint.h,v $ * Revision 1.19  2005/12/08 16:48:10  meichel * Changed include path schema for all DCMTK header files * * Revision 1.18  2003/12/23 15:53:22  joergr * Replaced post-increment/decrement operators by pre-increment/decrement * operators where appropriate (e.g. 'i++' by '++i'). * * Revision 1.17  2003/12/08 19:20:47  joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed leading underscore characters from preprocessor symbols (reserved * symbols). Updated copyright header. * * Revision 1.16  2002/07/18 12:30:59  joergr * Removed unused code. * * Revision 1.15  2001/06/01 15:49:51  meichel * Updated copyright header * * Revision 1.14  2000/03/08 16:24:24  meichel * Updated copyright header. * * Revision 1.13  2000/02/02 14:33:54  joergr * Replaced 'delete' statements by 'delete[]' for objects created with 'new[]'. * * Revision 1.12  1999/10/21 08:29:42  joergr * Renamed template type definition from 'T3' to 'T3_' to avoid naming * conflicts. * * Revision 1.11  1999/10/20 18:38:50  joergr * Eliminated default values for template types since this features is not * supported by SunCC 4.x (temporarily introduced '#define' instead). * * Revision 1.10  1999/10/15 09:38:31  joergr * Fixed typos. * * Revision 1.9  1999/10/14 19:05:17  joergr * Fixed typo. * * Revision 1.8  1999/10/01 13:25:35  joergr * Enhanced template class for cubic spline interpolation to support * non-floating point classes/types as y-coordinates. * * Revision 1.7  1999/07/23 14:11:25  joergr * Added preliminary support for 2D bi-cubic spline interpolation (currently * not used). * * Revision 1.6  1999/05/03 11:09:31  joergr * Minor code purifications to keep Sun CC 2.0.1 quiet. * * Revision 1.5  1999/04/29 13:49:08  joergr * Renamed class CubicSpline to DiCubicSpline. * * Revision 1.4  1999/03/24 17:20:26  joergr * Added/Modified comments and formatting. * * Revision 1.3  1999/03/22 08:52:43  joergr * Added/Changed comments. * * Revision 1.2  1999/02/25 16:17:16  joergr * Initialize local variables to avoid compiler warnings (reported by gcc * 2.7.2.1 on Linux). * * Revision 1.1  1999/02/11 16:36:29  joergr * Renamed file to indicate the use of templates. * * Revision 1.2  1999/02/09 14:21:54  meichel * Removed default parameters from template functions, required for Sun CC 4.2 * * Revision 1.1  1999/02/04 17:59:23  joergr * Added support for calibration according to Barten transformation (incl. * a DISPLAY file describing the monitor characteristic). * * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -