You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
6.3 KiB
191 lines
6.3 KiB
/**
|
|
* \file polygon.h
|
|
*
|
|
* \brief definiert alle Klassen zu Polygonen (Gruppen mehrerer Vertexe die
|
|
* eine Fläche bilden.
|
|
*
|
|
* Hier ist die Klasse polygon definiert, die die zentrale Klasse der
|
|
* 3D-Application ist. Es werden immer Polygone dargestellt.
|
|
*
|
|
* \author Georg Steffers <georg@steffers.org> [gs]
|
|
*
|
|
* \date 16.12.2003
|
|
*
|
|
* \version ..2002 [gs]: erste Implementation
|
|
* \version 16.12.2003 [gs]: <ul><li>
|
|
* Beginn der Dokumentation mir Doxygen
|
|
* </li><li>
|
|
* Den Sutherland-Hodgman Clipping Algorithmus
|
|
* eingebaut. Er scheint zu funktionieren, muss
|
|
* aber noch ausgiebig getestet werden.
|
|
* </li></ul>
|
|
* \version 19.12.2003 [gs]: <ul><li>
|
|
* Vergleichsoprator hinzugefügt
|
|
* </li><li>
|
|
* polygon_movable von gra_app übertragen
|
|
* </li></ul>
|
|
* \version 21.12.2003 [gs]: vorderes z-clipping eingebaut.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C)2003 Georg Steffers
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef __polygon_h__
|
|
#define __polygon_h__
|
|
|
|
#include "../helper/container.h"
|
|
#include "../math/Mmn.h"
|
|
#include "vertex.h"
|
|
#include "movable.h"
|
|
|
|
|
|
class polyeder;
|
|
|
|
class polygon : public container<unsigned> {
|
|
private:
|
|
vertex_list* vl;
|
|
vertex center;
|
|
vertex normal;
|
|
|
|
polyeder* pe;
|
|
char id[30];
|
|
|
|
public:
|
|
polygon()
|
|
: container<unsigned>(), vl(NULL), center(vertex()),
|
|
normal(vertex()), pe(NULL) {}
|
|
polygon(vertex_list *const vl)
|
|
: container<unsigned>(), vl(vl), center(vertex()),
|
|
normal(vertex()), pe(NULL) {}
|
|
polygon(const unsigned& p, vertex_list *const vl)
|
|
: container<unsigned>(p), vl(vl), pe(NULL) { _init_normal_(); }
|
|
polygon(const container<unsigned>& p, vertex_list *const vl)
|
|
: container<unsigned>(p), vl(vl), pe(NULL) { _init_normal_(); }
|
|
polygon(const unsigned* idxs, unsigned count, vertex_list *const vl)
|
|
: container<unsigned>(idxs, count), vl(vl),
|
|
pe(NULL) { _init_normal_(); }
|
|
polygon(const polygon& p)
|
|
: container<unsigned>(p), vl(p.vl),
|
|
center(p.center), normal(p.normal), pe(p.pe) { strncpy(id, p.id, 29); }
|
|
~polygon() {}
|
|
|
|
virtual void _init_normal_();
|
|
|
|
virtual bool operator==(const polygon& p) const {
|
|
if(this->container<unsigned>::operator==((container<unsigned>)p)&&
|
|
center==p.center &&
|
|
normal==p.normal)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void set_id(const char* i) { strncpy(id, i, 29); }
|
|
const char* get_id(void) const { return id; }
|
|
|
|
virtual polygon clip_2d(const polygon& p) const;
|
|
virtual polygon clip_front_z(double min_Z) const;
|
|
|
|
virtual const polygon& operator=(const polygon& p) {
|
|
if(this==&p)
|
|
return *this;
|
|
|
|
container<unsigned>::operator=(p);
|
|
vl=p.vl;
|
|
center=p.center;
|
|
normal=p.normal;
|
|
pe=p.pe;
|
|
strncpy(id, p.id, 29);
|
|
|
|
return *this;
|
|
}
|
|
virtual void set_vertex_list(vertex_list *const vl) {
|
|
this->vl=vl;
|
|
// dachte ich zuerst, aber eigentlich sollte alles richtig
|
|
// gesetzt sein, da sich ja die indizies in der neuen Vertexliste
|
|
// nicht aender sondern nur die Adressen!
|
|
//if(normal==0 || center==0)
|
|
// _init_normal_();
|
|
}
|
|
virtual void set_polyeder(polyeder *const pe) {
|
|
this->pe=pe;
|
|
}
|
|
virtual const polyeder& get_polyeder(void) {
|
|
return *pe;
|
|
}
|
|
virtual const vertex& operator[](unsigned index) const {
|
|
return (*vl)[content[index]];
|
|
}
|
|
virtual vertex& operator[](unsigned index) {
|
|
return (*vl)[content[index]];
|
|
}
|
|
|
|
virtual unsigned vl_idx(unsigned index) {
|
|
return content[index];
|
|
}
|
|
|
|
/*
|
|
* Ich sollte den Normalenvektor aus der Vertexliste nehmen und
|
|
* bei bedarf neu berechnen oder aber die transformation für
|
|
* normalenvektoren benutzen wenn ich ihn transformiere.
|
|
*/
|
|
virtual vertex const& center_p(void) {
|
|
return center;
|
|
}
|
|
|
|
virtual vertex const& normal_p(void) const {
|
|
return normal;
|
|
}
|
|
|
|
virtual void transform(const Mmn<double>&, int=0);
|
|
virtual void transform_normal(const Mmn<double>&, int=0);
|
|
virtual void reset(void);
|
|
virtual void project_2d(double lcx, double sw, double sh,
|
|
double ph_ar, double sy=1, int p=0);
|
|
};
|
|
|
|
class polygon_movable : public polygon, public movable {
|
|
public:
|
|
polygon_movable() : polygon(), movable() {}
|
|
polygon_movable(vertex_list *const vl) :
|
|
polygon(vl) {}
|
|
polygon_movable(const unsigned& p, vertex_list *const vl) :
|
|
polygon(p, vl) {}
|
|
polygon_movable(const unsigned* idxs, unsigned count,
|
|
vertex_list *const vl) :
|
|
polygon(idxs, count, vl) {}
|
|
polygon_movable(const polygon& p) :
|
|
polygon(p) {}
|
|
|
|
void transform(int transstage) {
|
|
polygon::transform(t_mat, transstage);
|
|
movable::transform(transstage);
|
|
}
|
|
|
|
void transform_normal(int p) {
|
|
polygon::transform_normal(t_mat, p);
|
|
}
|
|
|
|
void reset(void) {
|
|
polygon::reset();
|
|
movable::reset();
|
|
}
|
|
};
|
|
|
|
|
|
#endif // __polygon_h__
|