#include "StdAfx.h" #include "CoordCalibrator.h" #include CCoordCalibrator::CCoordCalibrator() : CAlignCalibrator() { m_dOriginMotorX = 0.0; m_dOriginMotorY = 0.0; m_bUseAOICam = FALSE; m_nARDirX = 1; m_nARDirY = 1; m_dARDistX = 0.0; m_dARDistY = 0.0; } CCoordCalibrator::~CCoordCalibrator(void) { } void CCoordCalibrator::ResetAlignResult() { m_nResultCode = 0; m_sAlignResult.Reset(); m_sAlignResult.dOriginX = m_dOriginMotorX; m_sAlignResult.dOriginY = m_dOriginMotorY; } void CCoordCalibrator::SetOriginMotorPosition(double dPosX, double dPosY) { m_nResultCode = 0; m_sAlignResult.Reset(); m_dOriginMotorX = m_sAlignResult.dOriginX = dPosX; m_dOriginMotorY = m_sAlignResult.dOriginY = dPosY; } void CCoordCalibrator::SetRotationInfo(double dMotorPosX, double dMotorPosY, double dGlassPosX, double dGlassPosY, double dDegree) { m_sAlignResult.Reset(); m_dRotateCenterX = dMotorPosX; m_dRotateCenterY = dMotorPosY; m_dRotateDegree = dDegree; m_sAlignResult.dDegree = dDegree; m_sAlignResult.dRadian = ToRadian(m_sAlignResult.dDegree); m_sAlignResult.dSinValue = sin(m_sAlignResult.dRadian); m_sAlignResult.dCosValue = cos(m_sAlignResult.dRadian); // 기준 얼라인 마크의 모터 위치를 회전중심으로 정/역 회전변환 행렬 계산 m_sAlignResult.SetRotateMatrix(dMotorPosX, dMotorPosY); // 기준 얼라인 마크의 모터 위치와 글라스 위치로 글라스 원점의 모터 위치 설정 m_sAlignResult.dOriginX = dMotorPosX - (dGlassPosX * m_dDirectionX); m_sAlignResult.dOriginY = dMotorPosY - (dGlassPosY * m_dDirectionY); m_nResultCode = 1; } void CCoordCalibrator::SetTransDirection(int nDirectionX, int nDirectionY) { CAlignCalibrator::SetDirection(nDirectionX, nDirectionY); } void CCoordCalibrator::GetTransDirection(int& nDirectionX, int& nDirectionY) const { CAlignCalibrator::GetDirection(nDirectionX, nDirectionY); } void CCoordCalibrator::TransGlass2Motor(const SCoordInfo* pCoordInfo, double& dPositionX, double& dPositionY) const { double dTransX = 0.0, dTransY = 0.0; // 글라스 좌표를 기준카메라의 모터좌표로 변환 CAlignCalibrator::TransformGlass2Motor(dPositionX, dPositionY, dTransX, dTransY); // 해당 카메라 모터좌표 변환 dPositionX = (dTransX - pCoordInfo->dDistanceX) * pCoordInfo->nDirectionX; dPositionY = (dTransY - pCoordInfo->dDistanceY) * pCoordInfo->nDirectionY; } void CCoordCalibrator::TransMotor2Glass(const SCoordInfo* pCoordInfo, SMotorPosition* pMotorPosition) const { double dTransX = 0.0, dTransY = 0.0; // 기준 카메라 모터 좌표로 변환 dTransX = pCoordInfo->dDistanceX + pCoordInfo->nDirectionX * pMotorPosition->dMotorPosX; dTransY = pCoordInfo->dDistanceY + pCoordInfo->nDirectionY * pMotorPosition->dMotorPosY; // 원점기준 글라스 좌표 변환 CAlignCalibrator::TransformMotor2Glass(dTransX, dTransY, pMotorPosition->dGlassPosX, pMotorPosition->dGlassPosY); if (pMotorPosition->bUseWSI) { // 기준 카메라 모터 좌표로 변환 dTransX = pCoordInfo->dDistanceX + pCoordInfo->nDirectionX * (pMotorPosition->dMotorPosX + pMotorPosition->dWSIOffsetX); dTransY = pCoordInfo->dDistanceY + pCoordInfo->nDirectionY * (pMotorPosition->dMotorPosY + pMotorPosition->dWSIOffsetY); // 원점기준 글라스 좌표 변환 CAlignCalibrator::TransformMotor2Glass(dTransX, dTransY, pMotorPosition->dWSIPosX, pMotorPosition->dWSIPosY); } } void CCoordCalibrator::SetARMotorInfo(int nDirX, int nDirY, double dDistX, double dDistY) { m_nARDirX = (nDirX==0) ? 1: nDirX; m_nARDirY = (nDirY==0) ? 1: nDirY; m_dARDistX = dDistX; m_dARDistY = dDistY; } void CCoordCalibrator::TransAOI2Review(const SCoordInfo* pCoordInfo, double dAOIPosX, double dAOIPosY, double& dReviewPosX, double& dReviewPosY) const { double dReviewX=0, dReviewY=0; // AOI 모터 좌표를 Review 모터 좌표로 변환 dReviewX = (dAOIPosX - m_dARDistX) * m_nARDirX; dReviewY = (dAOIPosY - m_dARDistY) * m_nARDirY; // 해당 Review 카메라 모터 좌표로 변환 dReviewPosX = (dReviewX - pCoordInfo->dDistanceX) * pCoordInfo->nDirectionX; dReviewPosY = (dReviewY - pCoordInfo->dDistanceY) * pCoordInfo->nDirectionY; } void CCoordCalibrator::TransReview2AOI(const SCoordInfo* pCoordInfo, double dReviewPosX, double dReviewPosY, double& dAOIPosX, double& dAOIPosY) const { double dReviewX=0, dReviewY=0; // 기준 Review 카메라 모터 좌표로 변환 dReviewX = pCoordInfo->dDistanceX + pCoordInfo->nDirectionX * dReviewPosX; dReviewY = pCoordInfo->dDistanceY + pCoordInfo->nDirectionY * dReviewPosY; // Review 모터 좌표를 AOI 모터 좌표로 변환 dAOIPosX = m_dARDistX + m_nARDirX * dReviewX; dAOIPosY = m_dARDistY + m_nARDirY * dReviewY; } void CCoordCalibrator::TransMain2Sub(const SCoordInfo* pCoordInfo, double dMainPosX, double dMainPosY, double& dSubPosX, double& dSubPosY) const { // main 카메라 좌표를 sub 카메라 좌표로 변환 dSubPosX = (dMainPosX - pCoordInfo->dDistanceX) * pCoordInfo->nDirectionX; dSubPosY = (dMainPosY - pCoordInfo->dDistanceY) * pCoordInfo->nDirectionY; } void CCoordCalibrator::TransSub2Main(const SCoordInfo* pCoordInfo, double dSubPosX, double dSubPosY, double& dMainPosX, double& dMainPosY) const { // sub 카메라 좌표를 main 카메라 좌표로 변환 dMainPosX = pCoordInfo->dDistanceX + pCoordInfo->nDirectionX * dSubPosX; dMainPosY = pCoordInfo->dDistanceY + pCoordInfo->nDirectionY * dSubPosY; } /* void CCoordCalibrator::TransGlass2Motor(SCoordInfo* pCoordInfo, double& dPositionX, double& dPositionY) { double dTempX = 0.0, dTempY = 0.0, dTransX = 0.0, dTransY = 0.0; //1. 기준 카메라 모터좌표로 변환 dTempX = (dPositionX - m_dOriginMotorX) * (m_nTransDirectionX * -1); dTempY = (dPositionY - m_dOriginMotorY) * (m_nTransDirectionY * -1); //2. 얼라인 역보정 dTransX = (cos(m_dAlignTheta * -1) * dTempX) - (sin(m_dAlignTheta * -1) * dTempY); dTransY = (sin(m_dAlignTheta * -1) * dTempX) + (cos(m_dAlignTheta * -1) * dTempY); //3. 해당 카메라 모터좌표 변환 dPositionX = pCoordInfo->dDistanceX + (pCoordInfo->nDirectionX * -1) * dTransX; dPositionY = pCoordInfo->dDistanceY + (pCoordInfo->nDirectionY * -1) * dTransY; } void CCoordCalibrator::TransMotor2Glass(SCoordInfo* pCoordInfo, SMotorPosition* pMotorPosition) { double dTempX = 0.0, dTempY = 0.0, dTransX = 0.0, dTransY = 0.0; //1. 기준 카메라 모터 좌표로 변환 dTempX = pCoordInfo->dDistanceX + pCoordInfo->nDirectionX * pMotorPosition->dMotorPosX; dTempY = pCoordInfo->dDistanceY + pCoordInfo->nDirectionY * pMotorPosition->dMotorPosY; //2. 얼라인 보정 dTransX = (cos(m_dAlignTheta) * dTempX) - (sin(m_dAlignTheta) * dTempY); dTransY = (sin(m_dAlignTheta) * dTempX) + (cos(m_dAlignTheta) * dTempY); //3. 원점기준 글라스 좌표로 변환 pMotorPosition->dGlassPosX = (dTransX - m_dOriginMotorX) * m_nTransDirectionX; pMotorPosition->dGlassPosY = (dTransY - m_dOriginMotorY) * m_nTransDirectionY; } */