Avatar billede zerohero Nybegynder
19. september 2001 - 00:27 Der er 10 kommentarer og
1 løsning

Oversæt C++ til Delphi

Jeg har noget C++ kode jeg gerne vil have have oversat følgende:


#include \"main.h\"

CCamera::CCamera()
{
    CVector vZero = {0.0, 0.0, 0.0};
    CVector vView = {0.0, 1.0, 0.5};
    CVector vUp  = {0.0, 0.0, 1.0};

    mPosition    = vZero;
    mView        = vView;
    mUpVector    = vUp;
}

GLvoid CCamera::PositionCamera(float positionX, float positionY, float positionZ,
                                float viewX,    float viewY,    float viewZ,
                              float upVectorX, float upVectorY, float upVectorZ)
{
    CVector vPosition    = {positionX, positionY, positionZ};
    CVector vView        = {viewX, viewY, viewZ};
    CVector vUpVector    = {upVectorX, upVectorY, upVectorZ};

    mPosition = vPosition;
    mView = vView;
    mUpVector = vUpVector;
}

bool CCamera::MoveCameraByMouse()
{
    POINT mousePos;
    int middleX = SCREEN_WIDTH  >> 1;
    int middleY = SCREEN_HEIGHT >> 1;
    float deltaY  = 0.0f;
    float rotateY = 0.0f;
   
    GetCursorPos(&mousePos);                       

    if( (mousePos.x == middleX) && (mousePos.y == middleY) ) return false;

    SetCursorPos(middleX, middleY);                           

    rotateY = (float)( (middleX - mousePos.x) ) / 1000;       
    deltaY  = (float)( (middleY - mousePos.y) ) / 1000;

    mView.y += deltaY * 8;

    if( ( mView.y - mPosition.y ) >  10)  mView.y = mPosition.y + 10;

    if( ( mView.y - mPosition.y ) < -10)  mView.y = mPosition.y - 10;

    RotateView(0, -rotateY, 0);

    return true;
}

void CCamera::RotateView(float X, float Y, float Z)
{
    CVector vector;

    vector.x = mView.x - mPosition.x;   
    vector.y = mView.y - mPosition.y;
    vector.z = mView.z - mPosition.z;

    if(X) {
        mView.z = (float)(mPosition.z + sin(X)*vector.y + cos(X)*vector.z);
        mView.y = (float)(mPosition.y + cos(X)*vector.y - sin(X)*vector.z);
    }
    if(Y) {
        mView.z = (float)(mPosition.z + sin(Y)*vector.x + cos(Y)*vector.z);
        mView.x = (float)(mPosition.x + cos(Y)*vector.x - sin(Y)*vector.z);
    }
    if(Z) {
        mView.x = (float)(mPosition.x + sin(Z)*vector.y + cos(Z)*vector.x);       
        mView.y = (float)(mPosition.y + cos(Z)*vector.y - sin(Z)*vector.x);
    }
}


void CCamera::MoveCamera(float speed)
{
    CVector vector={0};

    vector.x = mView.x - mPosition.x;   
    vector.y = mView.y - mPosition.y;
    vector.z = mView.z - mPosition.z;

    mPosition.x += vector.x * speed;
    mPosition.z += vector.z * speed;
    mView.x += vector.x * speed;
    mView.z += vector.z * speed;
}

Jeg har prøvet at oversætte det men måtte opgive...

ZeroHero
Avatar billede cyberlsn Nybegynder
19. september 2001 - 11:31 #1
Jeg kan se, at du har nogle konstanter.
Dem kan du oversætte med Const kommandoen.

Alle Void skal så laves om til Procedure, og :: som er \"tilhøringsoperatoren\" skal laves om til et \".\"

Float skal så laves om til noget med Real eller Double.

Så har du nogle X og Y´er.
I Delphi er disse komponenter positioner ikke X, Y, men TOP og LEFT (x = LEFT, y = TOP).

Prøv dig lidt frem med min hjælp i Delphi Hjælpen inde under Search eller Søg, og søg efter Procedure eller Const.

Håber det var en hjælp.

CyberLSN
Avatar billede zerohero Nybegynder
19. september 2001 - 14:31 #2
Hvordan skal if(X) {et eller andet...} fotståes???

Er det en boolean (synes ikke at jeg se det nogen steder)???
Avatar billede cyberlsn Nybegynder
19. september 2001 - 17:06 #3
Hvad skal programmet da kunne?
Avatar billede cyberlsn Nybegynder
19. september 2001 - 17:10 #4
Vent lige...
Jeg skal sender dig lige noget kode.
Du kan ikke sådan lige umidelbart bare kunne indsætte koden i dit program, så du bliver nød til selv at tilføje nogle funktioner og/eller procedure til dit program.

Avatar billede cyberlsn Nybegynder
19. september 2001 - 17:20 #5
Ej. glem det.
Jeg mener ikke lige det sådan umidelbart kan lade sig gøre i Pascal-sproget...

Avatar billede pellelil Nybegynder
19. september 2001 - 19:10 #6
zerohero> I C/C++ bruges Tuborg-pranteserne {} i stedet for \"begin..end\", og \"if(x)\" betyder at din If skal udføres hvis x er sandt hvilket vil sige forskellig fra 0. Hvis x er 1,2,7 eller 13 så vil udtrykket være sandt - hvis x er 0 så er udtrykket ikke sandt.

Jeg skrev for flere år siden \"en bog\" (jeg nåede 150 sider - får jeg mistede interessen/tiden) der beskriver hvordan man som pascal programmør \"skifter\" til C/C++. Hvis det har interesse kan jeg maile den (MS-Word), men så skal jeg lige ha\' din adresse.
Avatar billede pellelil Nybegynder
19. september 2001 - 19:30 #7
zerohero> Jeg valgte at \"uploade\" den, så du kan selv hente den http://www.liljendal.dk/files/pasctilc.zip (ca. 175 Kb)
Avatar billede zerohero Nybegynder
19. september 2001 - 19:47 #8
Hejsa pellelil...
tak - for dit indslag, jeg vil se på det med det samme... i mellemtiden kan du vel forklare mig hvorfor Delphi ikke regner rigtigt...
Når jeg bruger sin() og cos() så beregner de altså forkert...

Jeg prøvede dette og samtidig kontrollerede resultatet med en lommeregner... og fik forskellige resultater (når jeg bruger positive tal, så kan man sku aldrig få negative tal med sinus og cosinus - men det kan delphi???)

MÆRKLIGT

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
caption := inttostr(scrollbar1.position)+\' \'+floattostr(sin(scrollbar1.position));
end;

Hvad skal jeg gøre i stedet????
Avatar billede pellelil Nybegynder
19. september 2001 - 20:00 #9
Din lommeregner arbejder nok i grader hvorimod Delphi arbejder i Radianer. Når vi taler grader så er en fuld cirkel 360 grader (mon ikke du vidste det <G>). Når du i stedet regner i Radianer så er en fuld cirkel 2 * pi.

For at omregne mellem Grader og Radianer se: RadToDeg og DegToRad.
Avatar billede borrisholt Novice
26. september 2001 - 09:33 #10
prøv den her :

unit Unit2;

interface
uses
  Windows, Types;

type
  TVector = packed record
    x,y,z : Double;
  end;
  TCamera = class
  private
    FPosition: TVector;
    FView: TVector;
    FUpVector: TVector;
    procedure SetPosition(const Value: TVector);
    procedure SetUpVector(const Value: TVector);
    procedure SetView(const Value: TVector);
  protected
  public
    Constructor Create;
    procedure PositionCamera(positionX, positionY, positionZ,
                            viewX,    viewY,    viewZ,
                            upVectorX, upVectorY, upVectorZ : Extended);
    function  MoveCameraByMouse : boolean;
    procedure RotateView(X, Y, Z : Extended);
    procedure MoveCamera(speed : Extended);


    property Position : TVector read FPosition write SetPosition;
    property View    : TVector read FView    write SetView;
    property UpVector : TVector read FUpVector write SetUpVector;
  end;
implementation

{ TCamera }

procedure TCamera.MoveCamera(speed: Extended);
var
  Vector : TVector;
begin
  Vector.x := FView.x - FPosition.x;
  Vector.y := FView.y - FPosition.y;
  Vector.z := FView.z - FPosition.z;

  FPosition.x := FPosition.x + (Vector.x * speed);
  FPosition.z := FPosition.z + (Vector.z * speed);
  FView.x := FView.x + (vector.x * speed);
  FView.z := FView.z + (vector.z * speed);
end;

constructor TCamera.Create;
var
  vZero, vView, vUp : TVector;
begin
    with vZero do
    begin
      x := 0.0;
      y := 0.0;
      z := 0.0;
    end;

    with vView do
    begin
      x := 0.0;
      y := 1.0;
      z := 0.5;
    end;

    with vUp do
    begin
      x := 0.0;
      y := 0.0;
      z := 1.0;
    end;

    Position    := vZero;
    View        := vView;
    UpVector    := vUp;
end;

function TCamera.MoveCameraByMouse : Boolean;
var
  middleX, middleY : Integer;
  deltaY, rotateY : Extended;
  mousePos : TPoint;
begin
  middleX := GetSystemMetrics(SM_CXSCREEN) shr 1;
  middleY := GetSystemMetrics(SM_CYSCREEN) shr 1;
  GetCursorPos(mousePos);

  Result := false;

  if (mousePos.x = middleX) and (mousePos.y = middleY) then
    exit;

  SetCursorPos(middleX, middleY);
  rotateY := (middleX - mousePos.x)  / 1000;
  deltaY  := (middleY - mousePos.y)  / 1000;

  FView.y := FView.y + (deltaY * 8);

  if FView.y - FPosition.y  >  10 then
      FView.y := FPosition.y + 10;

  if FView.y - FPosition.y  < -10 then
  FView.y := FPosition.y - 10;

  RotateView(0, -rotateY, 0);
end;

procedure TCamera.PositionCamera(positionX, positionY, positionZ, viewX,  viewY, viewZ, upVectorX, upVectorY, upVectorZ: Extended);
var
  vPosition, vView,  vUpVector : TVector;
begin
    with vPosition do
    begin
      x := positionX;
      y := positionY;
      z := positionZ;
    end;

    with vView do
    begin
      x := viewX;
      y := viewY;
      z := viewZ;
    end;

    with vUpVector do
    begin
      x := upVectorX;
      y := upVectorY;
      z := upVectorZ;
    end;

    Position    := vPosition;
    View        := vView;
    UpVector    := vUpVector;
end;

procedure TCamera.RotateView(X, Y, Z: Extended);
var
  Vector : TVector;
begin
  vector.x := fView.x - fPosition.x;
  vector.y := fView.y - fPosition.y;
  vector.z := fView.z - fPosition.z;

    if X <> 0 then
    begin
      fView.z := fPosition.z + sin(X)*vector.y + cos(X)*vector.z;
      fView.y := fPosition.y + cos(X)*vector.y - sin(X)*vector.z;
    end;

    if Y <> 0 then
    begin
      fView.z := fPosition.z + sin(Y)*vector.x + cos(Y)*vector.z;
      fView.x := fPosition.x + cos(Y)*vector.x - sin(Y)*vector.z;
    end;

    if Z <> 0 then
    begin
      fView.x := fPosition.x + sin(Z)*vector.y + cos(Z)*vector.x;
      fView.y := fPosition.y + cos(Z)*vector.y - sin(Z)*vector.x;
    end;
end;

procedure TCamera.SetPosition(const Value: TVector);
begin
  FPosition := Value;
end;

procedure TCamera.SetUpVector(const Value: TVector);
begin
  FUpVector := Value;
end;

procedure TCamera.SetView(const Value: TVector);
begin
  FView := Value;
end;

end.


Jens B
Avatar billede zerohero Nybegynder
28. september 2001 - 00:23 #11
Jeg ville gerne give alle point - men i dette tilfælde har jeg valgt at give dem alle til BorrisHolt for hans komplette oversættelse...

Tak BorrisHolt :-P

ZeroHero

(Jeg håber I andre kan bære over med mit valg!!!)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester