색좌표상의 x, y 값을 이용한 LED Dominant 파장 계산 알고리즘
Characteristics Data/LED(Light Emitting Diode)2023. 2. 15. 13:57
반응형
계산상 필요한 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 ;
}
//---------------------------------------------------------------------------
반응형
'Characteristics Data > LED(Light Emitting Diode)' 카테고리의 다른 글
OLED의 양자효율(Quantum Efficiency) 계산 방법 (0) | 2023.03.17 |
---|---|
LED 의 색좌표 u', v' (CIE1976) 계산 알고리즘 (0) | 2023.03.02 |
LED 의 색좌표 x, y (CIE1931) 계산 알고리즘 (0) | 2023.02.15 |
색좌표상의 x, y 값을 이용한 LED 색온도(CCT) 계산 알고리즘 (0) | 2023.02.15 |
댓글()