pmc/cube.cc
author Markus Bröker <mbroeker@largo.dyndns.tv>
Sun, 27 Sep 2009 10:56:49 +0200
changeset 107 244356bc3a20
parent 77 49e0babccb23
permissions -rw-r--r--
Pipes and COPY-ON-WRITE In this example, every forked process gets its own copy of the countervariable i through copy-on-write. committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * pmc/cube.cc
 * Copyright (C) 2008 Markus Broeker
 */

#include <cube.hpp>
#include <cstdio>

using namespace algebra;

Cube::Cube (Surface * s)
{
    surface = s;
    name = "Cube";
    height = 25;

    P[0] = new Vector (0, 0);
    P[1] = new Vector (100, 0);
    P[2] = new Vector (100, 100);
    P[3] = new Vector (0, 100);

    P[4] = new Vector (25, 25);
    P[5] = new Vector (125, 25);
    P[6] = new Vector (125, 125);
    P[7] = new Vector (25, 125);

    refCounter++;
}

Cube::Cube (Surface * s, Vector & p1, Vector & p2, Vector & p3, Vector & p4, int h)
{
    surface = s;
    name = "Cube";
    height = h;

    Vector location (h / 4, h / 4);

    P[0] = new Vector (p1);
    P[1] = new Vector (p2);
    P[2] = new Vector (p3);
    P[3] = new Vector (p4);

    for (int i = 0; i < 4; i++) {
        P[4 + i] = new Vector ();
        *P[4 + i] = *P[i] + location;
    }

    refCounter++;
}

Cube::Cube (Surface * s, Vector p[4], int h)
{
    surface = s;
    name = "Cube";
    height = h;

    Vector location (h / 4, h / 4);

    for (int i = 0; i < 4; i++) {
        P[i] = new Vector (p[i]);
        P[4 + i] = new Vector (*P[i]);
        *P[4 + i] = *P[i] + location;
    }

    refCounter++;
}

Cube::Cube (const Cube & copy)
{
    fprintf (stderr, "Copy Constructor in Cube disabled...\n");
}

Cube::~Cube ()
{
    for (int i = 0; i < 8; i++) {
#ifdef DEBUG
        fprintf (stderr, "Removing P[%d]: ", i);
#endif
        delete P[i];
    }
}

void Cube::move (Vector location)
{
    for (int i = 0; i < 8; i++) {
        *P[i] = *P[i] + location;
    }
}

void Cube::show ()
{
    surface->drawLine (P[0]->X (), P[0]->Y (), P[1]->X (), P[1]->Y ());
    surface->drawLine (P[3]->X (), P[3]->Y (), P[2]->X (), P[2]->Y ());
    surface->drawLine (P[2]->X (), P[2]->Y (), P[1]->X (), P[1]->Y ());
    surface->drawLine (P[3]->X (), P[3]->Y (), P[0]->X (), P[0]->Y ());

    surface->drawLine (P[4]->X (), P[4]->Y (), P[5]->X (), P[5]->Y ());
    surface->drawLine (P[7]->X (), P[7]->Y (), P[6]->X (), P[6]->Y ());
    surface->drawLine (P[7]->X (), P[7]->Y (), P[4]->X (), P[4]->Y ());
    surface->drawLine (P[6]->X (), P[6]->Y (), P[5]->X (), P[5]->Y ());

    surface->drawLine (P[0]->X (), P[0]->Y (), P[4]->X (), P[4]->Y ());
    surface->drawLine (P[1]->X (), P[1]->Y (), P[5]->X (), P[5]->Y ());

    surface->drawLine (P[2]->X (), P[2]->Y (), P[6]->X (), P[6]->Y ());
    surface->drawLine (P[3]->X (), P[3]->Y (), P[7]->X (), P[7]->Y ());
}