Запись текста в файл postscript с использованием нескольких объектов класса

0

(Полный вопрос указан внизу)

У меня есть задание, которое требует, чтобы я написал текст в файл постскриптума, который позволяет мне рисовать кривые "Госпер" с использованием рекурсии. Однако тестовый драйвер (GosperDriver.cpp), который мой профессор дал нам, напоминает следующее:

#include "Gosper.h"
#include <iostream>
using namespace std;

int main( )
{   
// test right hexagonal Gosper curve at level 4
Gosper gosper1( 100, 100, 0 );
gosper1.rightCurve( 4, 4 ); 

// test left hexagonal Gosper curver at level 4
Gosper gosper2( 500, 100, 0 );
gosper2.leftCurve( 4, 4 );

// test right hexagonal Gosper curve at level 3
Gosper gosper3( 100, 400, 0 );
gosper3.rightCurve( 3, 6 );

// test left hexagonal Gosper curver at level 3
Gosper gosper4( 500, 400, 0 );
gosper4.leftCurve( 3, 6 );

// test right hexagonal Gosper curve at level 2
Gosper gosper5( 100, 600, 0 );
gosper5.rightCurve( 2, 8 );

// test left hexagonal Gosper curver at level 2
Gosper gosper6( 500, 600, 0 );
gosper6.leftCurve( 2, 8 );

// test right hexagonal Gosper curve at level 1
Gosper gosper7( 100, 700, 0 );
gosper7.rightCurve( 1, 10 );

// test left hexagonal Gosper curver at level 1
Gosper gosper8( 500, 700, 0 );
gosper8.leftCurve( 1, 10 );
}

Gosper.h включает Turtle.h, который содержит функции "draw", которые жизненно важны для проекта.

Вот мои файлы Gosper.h, Gosper.cpp, Turtle.h и Turtle.cpp в этом порядке (я вырезаю ненужный код, который управляет рисованием):

Gosper.h:

// Sierpinski Class 
#ifndef GOSPER_H
#define GOSPER_H

#include "Turtle.h"
#include <iostream>
#include <fstream>


using namespace std;

class Gosper : Turtle 
{

public:

    Gosper(float initX=0.0, float initY=0.0, float initA=0.0);

    void leftCurve( int l, float d );  // Draw level l left curve with dist d
    void rightCurve( int l, float d ); // Draw level l right curve with dist d

};

#endif

Gosper.cpp:

#include <iostream>
#include <string>
#include "Gosper.h"

// Initialization and such.
Gosper::Gosper(float initX, float initY, float initA)
{

}


void Gosper::leftCurve(int level, float d)
{
    // Code that uses draw() function of Turtle.h and Turtle.cpp
}


void Gosper::rightCurve(int level, float d)
{
    // Same as above
}

Turtle.h:

#ifndef TURTLE_H
#define TURTLE_H

#include <iostream>
#include <fstream>
#include <math.h>

using namespace std;

const float PI = 3.1459265;

class Turtle {

public:

    Turtle(float initX = 0.0, float initY = 0.0, float initA = 0.0);
    ~Turtle();

    void draw( float d );   // draw line by distance d
    void move( float d );   // simply move by distance d
    void turn( float a );   // turn by angle a

private:

    ofstream out;
    float angle;    // current angle

};

Turtle.cpp:

#include "Turtle.h"
#include <iostream>
#include <fstream>

Turtle::Turtle(float initX, float initY, float initA)
{

out.open("output.ps");

out << "%!PS-Adobe-2.0" << endl;
out << initX << "\t" << initY << "\tmoveto" << endl;

angle = initA;

}

Turtle::~Turtle() 
{
out << "stroke" << endl;
out << "showpage" << endl;
}

void Turtle::turn(float a)
{
angle += a;
}

void Turtle::draw(float d)
{
float dX, dY;

dX = d * cos(PI * angle / 180);
dY = d * sin(PI * angle / 180);
out << dX << "\t" << dY << "\trlineto" << endl;
}

void Turtle::move(float d)
{
float dX, dY;

dX = d * cos(PI * angle / 180);
dY = d * sin(PI * angle / 180);
out << dX << "\t" << dY << "\trmoveto" << endl;
}
#endif

Хорошо, так что теперь, когда вы видели мой код, вот моя проблема:

Я хочу написать текст для каждого объекта класса Gosper в GosperDriver.cpp в один файл postscript. Как и сейчас, любая попытка сделать это приведет к тому, что предыдущий блок текста в назначенном файле output.ps будет перезаписан. На данный момент я могу написать текст, необходимый для объекта класса ONE Gosper. Мне нужно было прокомментировать каждое объявление объекта Gosper в Gosperdriver.cpp, но одно, чтобы проверить, работает ли моя программа правильно.

Короче говоря, мне нужно написать текст, необходимый для вывода.ps для каждого объекта Gosper в GosperDriver.cpp, но он не работает, потому что он позволит мне писать только по одному. Что я делаю?


Бонусный вопрос о наследовании: прямо сейчас моя "начальная точка" для каждого графика Gosper продолжает устанавливаться в x = 0 и y = 0. Как видно из объявлений объектов Gosper, ни один из параметров не содержит 0 для x или y. Что-то ушло. Что происходит?

Заранее благодарю всех, кто может ответить на один или оба этих вопроса! :)

Теги:
file
inheritance
postscript

1 ответ

0
Лучший ответ

Вы можете использовать

out.open("output.ps", std::fstream::in | std::fstream::out | std::fstream::app);

для открытия файла в режиме добавления. Значение старого контента не будет перезаписано. Однако вам нужно добавить что-то, чтобы определить, если заголовок out << "%!PS-Adobe-2.0" << endl; уже написано. (Я предполагаю, что вам нужно это ровно один раз за файл.)

Чтобы не открывать и закрывать файл все время, вы также можете создать отдельный класс, который откроет файл, инициализируйте его (напишите заголовок), а затем используйте этот класс для записи всего содержимого и последующего закрытия файла.

Для бонусных очков используйте RAII, чтобы класс автоматически позаботился о файле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню