색좌표상의 x, y 값을 이용한 LED Dominant 파장 계산 알고리즘

반응형

table.h
0.02MB

계산상 필요한 table 은 위의 파일을 다운로드 받으세요

색좌표상의 X,Y 값을 이용한 LED Dominant 파장 계산을 위한 알고리즘 입니다.

double __fastcall Dominant_Wavelength(double Chroma_x, double Chroma_y)
{
    DPOINT TempPos[4], Dominant ;
    double dtemp = 1000, value, degree, result ;
    int start = 0, stop = 0, temp = 0 ;
    double  dominant_wavelength ;

    TempPos[0].x = TempPos[0].y = 0.33 ;
    TempPos[1].x = Chroma_x ;
    TempPos[1].y = Chroma_y ;

    try{ degree = (Chroma_y - 0.33) / (Chroma_x - 0.33) ; }  //  색좌표의 x,y 값과 백색좌표값의 기울기 계산
    catch(...) { degree = 0 ; }

    if(Chroma_x > 0.33){ start = 35 ; stop = 80 ; }
    else if(Chroma_y > 0.33) { start = 23 ; stop = 34 ; }
    else{ start = 0 ; stop = 22 ; }

    for(int i=start ; i<stop ; i++)     // 색좌표의 기울기와 가장 근사한 기울기를 가진 파장의 좌표를 찾는다.
    {
        result = (wxy[i].y - 0.33) / (wxy[i].x - 0.33) ;

        value = fabs(result-degree) ;
        if(dtemp > value)
        {
            dtemp = value ;
            temp  = i ;
            TempPos[2].x = wxy[i].x  ;
            TempPos[2].y = wxy[i].y  ;
        }
    }

    result = (wxy[temp+1].y - 0.33) / (wxy[temp+1].x - 0.33) ;
    value  = (wxy[temp-1].y - 0.33) / (wxy[temp-1].x - 0.33) ;

    result = fabs(degree - result) ;
    value  = fabs(degree - value) ;

    if(result > value)
    {
        TempPos[3].x = wxy[temp-1].x  ;
        TempPos[3].y = wxy[temp-1].y  ;
        temp -- ;
    }
    else
    {
        TempPos[3].x = wxy[temp+1].x  ;
        TempPos[3].y = wxy[temp+1].y  ;
    }

    GetIntersectPoint(TempPos[0],TempPos[1],TempPos[2],TempPos[3],&Dominant) ;    // 두직선의 교점
    dominant_wavelength = Calculate_Dominant_Wavelength(Dominant, temp) ;

    m_dfDominant_X = Dominant.x  ;
    m_dfDominant_Y = Dominant.y  ;

    return dominant_wavelength ;
}
//---------------------------------------------------------------------------

bool __fastcall GetIntersectPoint(const DPOINT& AP1, const DPOINT& AP2, const DPOINT& BP1, const DPOINT& BP2, DPOINT* IP)
{
// 두 직선의 교점을 구하는 함수 

double t, s ;
double under = (BP2.y-BP1.y)*(AP2.x-AP1.x)-(BP2.x-BP1.x)*(AP2.y-AP1.y) ;

if(under == 0)
    {
     IP->x = 0 ;
    IP->y = 0 ;
        return false ;
    }

double _t = (BP2.x-BP1.x)*(AP1.y-BP1.y) - (BP2.y-BP1.y)*(AP1.x-BP1.x) ;
double _s = (AP2.x-AP1.x)*(AP1.y-BP1.y) - (AP2.y-AP1.y)*(AP1.x-BP1.x) ;

t = _t / under ;
s = _s / under ;

if(_t==0 && _s==0) return false ;

IP->x = AP1.x + t * (double)(AP2.x-AP1.x) ;
IP->y = AP1.y + t * (double)(AP2.y-AP1.y) ;

return true ;
}
//---------------------------------------------------------------------------
double __fastcall Calculate_Dominant_Wavelength(DPOINT Dominant, int index)
{
    double Wavelength ;
    double temp1, temp2 ;

    temp1 = fabs(wxy[index].y - wxy[index+1].y) ;
    temp2 = fabs(wxy[index].y - Dominant.y) ;

    if(temp1 == 0) Wavelength = 0 ;
    else
    {
        try
        {
            temp1 = (temp2 / temp1) * 5.0 ;
            Wavelength = wxy[index].wavelength + temp1 ;
        }
        catch(...)
        {
            Wavelength = 0 ;
        }
    }

    return Wavelength ;
}
//---------------------------------------------------------------------------
반응형

댓글()