안녕하세요?
제가 C++을 이해를 못해서 그런데 다음 소스좀 델파이로 변환하는데 문제가 있네요..갈쳐주세요.
Rudder.h
---------------------------------------------------------------------------------
// Rudder.h: interface for the CRudder class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)
#define AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Motion.h"
#include "Propeller.h"
#define PI 3.141592
#define Rho 104.61
class CRudder
{
public:
double smm_Height,smm_Area,smm_AspectRatio,smm_RudderXPosition;
double smm_RudderWake,smm_RudderWake0;
double smm_TR,smm_AH,smm_XH;
double smm_RudderAngle,smm_OrderRudderAngleD,smm_OrderRudderAngle;
double smm_Dot_RudderAngle,smm_Dot_MaxRudderAngle;
double smm_Nd_LR,smm_GammaR,smm_TE;
double smm_NormalForce;
double smm_RudderXForce,smm_RudderYForce,smm_RudderNMoment;
public:
CRudder();
virtual ~CRudder();
void RudderFN(CMotion &motion,CPropeller &propeller);
double RudderXForce(CMotion &motion,CPropeller &propeller);
double RudderYForce(CMotion &motion,CPropeller &propeller);
double RudderNMoment(CMotion &motion,CPropeller &propeller);
void Steer();
};
#endif // !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)
---------------------------------------------------------------------------------
Rudder.cpp입니다.
----------------------------------------------------------------------------------
// Rudder.cpp: implementation of the CRudder class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Rudder.h"
#include "math.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRudder::CRudder()
{
smm_Height = 7.70;
smm_Area = 26.69;
smm_AspectRatio = 1.833;
smm_AH = 0.261;
smm_Nd_LR = -0.90;
smm_Dot_MaxRudderAngle = 3.0*PI/180.0;
smm_RudderWake0 = 0.270;
smm_RudderXPosition = -0.5;
smm_TR = 0.29;
smm_XH = -0.45;
smm_GammaR = 0.5;
smm_RudderAngle = 0.0;
smm_OrderRudderAngleD = 0.0;
smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;
smm_TE = 2.5;
}
CRudder::~CRudder()
{
}
void CRudder::RudderFN(CMotion &motion,CPropeller &propeller)
{
double Eta,Epsilon,Kapa;
double ResultRudderVel,AlphaR,AlphaRMax,FAlpha;
double SlipRatio;
double XVel,YVel;
FAlpha = 6.13*smm_AspectRatio/(smm_AspectRatio+2.25);
if(smm_Height
Eta = 1.0;
else
Eta = propeller.smm_Dia/smm_Height;
smm_RudderWake = propeller.smm_ProWake*smm_RudderWake0/propeller.smm_ProWake0;
Epsilon = (1.0-smm_RudderWake)/(1.0-propeller.smm_ProWake);
Kapa = 0.6/Epsilon;
SlipRatio = 1.0-propeller.smm_ProVel/(propeller.smm_RPS*propeller.smm_Pitch);
if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS < 0.0)
{
ResultRudderVel = 0.0;
AlphaR = 0.0;
}
else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS<= 0.0)
{
ResultRudderVel = sqrt(pow(motion.smm_SurgeVel,2)+pow(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel,2));
AlphaR = -smm_RudderAngle+atan2((motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel),fabs(motion.smm_SurgeVel));
}
else
{
if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio >= 0.0)
{
XVel = Epsilon*propeller.smm_RPS*propeller.smm_Pitch
*sqrt(1.0-2.0*(1.0-Eta*Kapa)*SlipRatio+(1.0-Eta*Kapa*(2.0-Kapa))*pow(SlipRatio,2));
}
else if((motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio < 0.0 )
|| (motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS == 0.0))
{
XVel = motion.smm_SurgeVel*(1.0-smm_RudderWake);
}
else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS > 0.0)
{
XVel = motion.smm_SurgeVel+0.6*sqrt(Eta)*propeller.smm_RPS*propeller.smm_Pitch;
}
YVel = -smm_GammaR*(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel);
if(XVel < 0.0001) XVel = 0.0;
if(XVel <= 0.0)
{
XVel = 0.0;
YVel = 0.0;
}
ResultRudderVel = sqrt(pow(XVel,2)+pow(YVel,2));
AlphaR = smm_RudderAngle-atan2(YVel,XVel);
AlphaRMax = 35.0*PI/180.0;
if(fabs(AlphaR) > AlphaRMax)
{
if(AlphaR >0) AlphaR = AlphaRMax;
else AlphaR = -AlphaRMax;
}
}
smm_NormalForce = 0.5*Rho*smm_Area*pow(ResultRudderVel,2)*FAlpha*sin(AlphaR);
}
double CRudder::RudderXForce(CMotion &motion,CPropeller &propeller)
{
RudderFN(motion,propeller);
smm_RudderXForce = -(1.0-smm_TR)*smm_NormalForce*sin(smm_RudderAngle);
return smm_RudderXForce;
}
double CRudder::RudderYForce(CMotion &motion,CPropeller &propeller)
{
RudderFN(motion,propeller);
smm_RudderYForce = -(1.0+smm_AH)*smm_NormalForce*cos(smm_RudderAngle);
return smm_RudderYForce;
}
double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)
{
RudderFN(motion,propeller);
smm_RudderNMoment = -(smm_RudderXPosition+smm_AH*smm_XH)*motion.smm_LBP*smm_NormalForce*cos(smm_RudderAngle);
return smm_RudderNMoment;
}
void CRudder::Steer()
{
smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;
smm_Dot_RudderAngle = (smm_OrderRudderAngle-smm_RudderAngle)/smm_TE;
if(fabs(smm_Dot_RudderAngle) > smm_Dot_MaxRudderAngle)
{
if(smm_Dot_RudderAngle > 0.0) smm_Dot_RudderAngle = smm_Dot_MaxRudderAngle;
else smm_Dot_RudderAngle = -smm_Dot_MaxRudderAngle;
}
}
----------------------------------------------------------------------------------
이 부분중에서 제가 특히 이해가 안가는 부분은 생성자의 소멸자를 다루는건데요.
위의 부분중에서 하나입니다.
double RudderNMoment(CMotion &motion,CPropeller &propeller);
Motion.h의 Class를 델파이로 변환시에는
procedure RuddreNMoment(?) double;
그리고 Cpp문에서도
double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)
이렇게 정의하는 부분 있지요
이걸 델파이의 한 Unit로 구성할때는 Class를 정의하는것과 함수를 참조하는것을 예를 들어서 갈켜주시면 감사하겠어요 그럼 수고하세요..
Obj단에서 링크하면
Delphi에서 C 소스를 사용할 수 있습니다.
그 방법을 사용하시면 어떻습니까?
우나기 wrote:
> 안녕하세요?
> 제가 C++을 이해를 못해서 그런데 다음 소스좀 델파이로 변환하는데 문제가 있네요..갈쳐주세요.
>
> Rudder.h
> ---------------------------------------------------------------------------------
> // Rudder.h: interface for the CRudder class.
>
> //
>
> //////////////////////////////////////////////////////////////////////
>
>
>
> #if !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)
>
> #define AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_
>
>
>
> #if _MSC_VER > 1000
>
> #pragma once
>
> #endif // _MSC_VER > 1000
>
>
>
> #include "Motion.h"
>
> #include "Propeller.h"
>
>
>
> #define PI 3.141592
>
> #define Rho 104.61
>
>
>
> class CRudder
>
> {
>
> public:
>
> double smm_Height,smm_Area,smm_AspectRatio,smm_RudderXPosition;
>
> double smm_RudderWake,smm_RudderWake0;
>
> double smm_TR,smm_AH,smm_XH;
>
> double smm_RudderAngle,smm_OrderRudderAngleD,smm_OrderRudderAngle;
>
> double smm_Dot_RudderAngle,smm_Dot_MaxRudderAngle;
>
> double smm_Nd_LR,smm_GammaR,smm_TE;
>
>
>
> double smm_NormalForce;
>
> double smm_RudderXForce,smm_RudderYForce,smm_RudderNMoment;
>
>
>
> public:
>
> CRudder();
>
> virtual ~CRudder();
>
>
>
> void RudderFN(CMotion &motion,CPropeller &propeller);
>
> double RudderXForce(CMotion &motion,CPropeller &propeller);
>
> double RudderYForce(CMotion &motion,CPropeller &propeller);
>
> double RudderNMoment(CMotion &motion,CPropeller &propeller);
>
> void Steer();
>
> };
>
>
>
> #endif // !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)
> ---------------------------------------------------------------------------------
>
> Rudder.cpp입니다.
> ----------------------------------------------------------------------------------
> // Rudder.cpp: implementation of the CRudder class.
>
> //
>
> //////////////////////////////////////////////////////////////////////
>
>
>
> #include "stdafx.h"
>
> #include "Rudder.h"
>
> #include "math.h"
>
>
>
> //////////////////////////////////////////////////////////////////////
>
> // Construction/Destruction
>
> //////////////////////////////////////////////////////////////////////
>
>
>
> CRudder::CRudder()
>
> {
>
> smm_Height = 7.70;
>
> smm_Area = 26.69;
>
> smm_AspectRatio = 1.833;
>
> smm_AH = 0.261;
>
> smm_Nd_LR = -0.90;
>
> smm_Dot_MaxRudderAngle = 3.0*PI/180.0;
>
> smm_RudderWake0 = 0.270;
>
> smm_RudderXPosition = -0.5;
>
> smm_TR = 0.29;
>
> smm_XH = -0.45;
>
> smm_GammaR = 0.5;
>
> smm_RudderAngle = 0.0;
>
> smm_OrderRudderAngleD = 0.0;
>
> smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;
>
> smm_TE = 2.5;
>
> }
>
>
>
> CRudder::~CRudder()
>
> {
>
>
>
> }
>
>
>
> void CRudder::RudderFN(CMotion &motion,CPropeller &propeller)
>
> {
>
> double Eta,Epsilon,Kapa;
>
> double ResultRudderVel,AlphaR,AlphaRMax,FAlpha;
>
> double SlipRatio;
>
> double XVel,YVel;
>
>
>
> FAlpha = 6.13*smm_AspectRatio/(smm_AspectRatio+2.25);
>
>
>
> if(smm_Height
>
> Eta = 1.0;
>
> else
>
> Eta = propeller.smm_Dia/smm_Height;
>
>
>
> smm_RudderWake = propeller.smm_ProWake*smm_RudderWake0/propeller.smm_ProWake0;
>
>
>
> Epsilon = (1.0-smm_RudderWake)/(1.0-propeller.smm_ProWake);
>
>
>
> Kapa = 0.6/Epsilon;
>
>
>
> SlipRatio = 1.0-propeller.smm_ProVel/(propeller.smm_RPS*propeller.smm_Pitch);
>
>
>
> if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS < 0.0)
>
> {
>
> ResultRudderVel = 0.0;
>
> AlphaR = 0.0;
>
> }
>
>
>
> else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS<= 0.0)
>
> {
>
> ResultRudderVel = sqrt(pow(motion.smm_SurgeVel,2)+pow(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel,2));
>
> AlphaR = -smm_RudderAngle+atan2((motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel),fabs(motion.smm_SurgeVel));
>
> }
>
>
>
> else
>
> {
>
> if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio >= 0.0)
>
> {
>
> XVel = Epsilon*propeller.smm_RPS*propeller.smm_Pitch
>
> *sqrt(1.0-2.0*(1.0-Eta*Kapa)*SlipRatio+(1.0-Eta*Kapa*(2.0-Kapa))*pow(SlipRatio,2));
>
> }
>
>
>
> else if((motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio < 0.0 )
>
> || (motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS == 0.0))
>
> {
>
> XVel = motion.smm_SurgeVel*(1.0-smm_RudderWake);
>
> }
>
>
>
> else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS > 0.0)
>
> {
>
> XVel = motion.smm_SurgeVel+0.6*sqrt(Eta)*propeller.smm_RPS*propeller.smm_Pitch;
>
> }
>
>
>
> YVel = -smm_GammaR*(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel);
>
>
>
> if(XVel < 0.0001) XVel = 0.0;
>
> if(XVel <= 0.0)
>
> {
>
> XVel = 0.0;
>
> YVel = 0.0;
>
> }
>
>
>
> ResultRudderVel = sqrt(pow(XVel,2)+pow(YVel,2));
>
>
>
> AlphaR = smm_RudderAngle-atan2(YVel,XVel);
>
>
>
> AlphaRMax = 35.0*PI/180.0;
>
>
>
> if(fabs(AlphaR) > AlphaRMax)
>
> {
>
> if(AlphaR >0) AlphaR = AlphaRMax;
>
> else AlphaR = -AlphaRMax;
>
> }
>
> }
>
>
>
> smm_NormalForce = 0.5*Rho*smm_Area*pow(ResultRudderVel,2)*FAlpha*sin(AlphaR);
>
> }
>
>
>
> double CRudder::RudderXForce(CMotion &motion,CPropeller &propeller)
>
> {
>
> RudderFN(motion,propeller);
>
>
>
> smm_RudderXForce = -(1.0-smm_TR)*smm_NormalForce*sin(smm_RudderAngle);
>
>
>
> return smm_RudderXForce;
>
> }
>
>
>
> double CRudder::RudderYForce(CMotion &motion,CPropeller &propeller)
>
> {
>
> RudderFN(motion,propeller);
>
>
>
> smm_RudderYForce = -(1.0+smm_AH)*smm_NormalForce*cos(smm_RudderAngle);
>
>
>
> return smm_RudderYForce;
>
> }
>
>
>
> double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)
>
> {
>
> RudderFN(motion,propeller);
>
>
>
> smm_RudderNMoment = -(smm_RudderXPosition+smm_AH*smm_XH)*motion.smm_LBP*smm_NormalForce*cos(smm_RudderAngle);
>
>
>
> return smm_RudderNMoment;
>
> }
>
>
>
> void CRudder::Steer()
>
> {
>
> smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;
>
>
>
> smm_Dot_RudderAngle = (smm_OrderRudderAngle-smm_RudderAngle)/smm_TE;
>
>
>
> if(fabs(smm_Dot_RudderAngle) > smm_Dot_MaxRudderAngle)
>
> {
>
> if(smm_Dot_RudderAngle > 0.0) smm_Dot_RudderAngle = smm_Dot_MaxRudderAngle;
>
> else smm_Dot_RudderAngle = -smm_Dot_MaxRudderAngle;
>
> }
>
> }
> ----------------------------------------------------------------------------------
>
> 이 부분중에서 제가 특히 이해가 안가는 부분은 생성자의 소멸자를 다루는건데요.
> 위의 부분중에서 하나입니다.
> double RudderNMoment(CMotion &motion,CPropeller &propeller);
>
> Motion.h의 Class를 델파이로 변환시에는
> procedure RuddreNMoment(?) double;
>
> 그리고 Cpp문에서도
> double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)
> 이렇게 정의하는 부분 있지요
> 이걸 델파이의 한 Unit로 구성할때는 Class를 정의하는것과 함수를 참조하는것을 예를 들어서 갈켜주시면 감사하겠어요 그럼 수고하세요..
>