(Полный вопрос указан внизу)
У меня есть задание, которое требует от меня записи текста в файл postscript, который позволяет рисовать кривые «Госпер» с помощью рекурсии. Однако тестовый драйвер (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, который содержит функции «рисования», которые жизненно важны для проекта.
Вот мои файлы 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 будет перезаписан. На данный момент я могу написать только текст, необходимый для объекта класса ОДИН Госпер. Мне пришлось закомментировать каждое объявление объекта Gosper в Gosperdriver.cpp, кроме одного, чтобы проверить, правильно ли работает моя программа.
Короче говоря, мне нужно написать текст, необходимый для output.ps для каждого объекта Gosper, в GosperDriver.cpp, но он не работает, потому что он позволяет писать только по одному за раз. Что я делаю?
Дополнительный вопрос о наследовании: прямо сейчас моя «начальная точка» для каждого чертежа Gosper по-прежнему установлена на x = 0 и y = 0. Как видно из объявлений объекта Gosper, ни один из параметров не содержит 0 для x или y. Что-то пошло не так. Что происходит?
Заранее спасибо всем, кто может ответить на один или оба этих вопроса! 🙂
Ты можешь использовать
out.open("output.ps", std::fstream::in | std::fstream::out | std::fstream::app);
открыть файл в режиме добавления. Значение старого контента не будет перезаписано.
Вам, однако, нужно будет что-то добавить, чтобы обнаружить, если заголовок
out << "%!PS-Adobe-2.0" << endl;
уже написано. (Я предполагаю, что вам нужно это точно один раз на файл.)
Чтобы не открывать и не закрывать файл постоянно, вы также можете создать отдельный класс, который будет открывать файл, инициализировать его (написать заголовок), а затем использовать этот класс, чтобы записать все содержимое и впоследствии закрыть файл.
Для получения бонусных баллов используйте RAII, чтобы класс автоматически позаботился о файле.
Других решений пока нет …