From 56cc59cf44ec64440ba4d1c0d005196195c758e6 Mon Sep 17 00:00:00 2001 From: hugues Date: Sat, 25 Mar 2006 15:07:51 +0000 Subject: Nettoyage du repository glagen git-svn-id: file:///usr/local/opt/svn/repos/glagen@12 0f7e0d06-a6f9-0310-a55f-d5f984f55e4c --- 3d/isosahedron.cc | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 3d/isosahedron.cc (limited to '3d/isosahedron.cc') diff --git a/3d/isosahedron.cc b/3d/isosahedron.cc new file mode 100644 index 0000000..1f3fc71 --- /dev/null +++ b/3d/isosahedron.cc @@ -0,0 +1,220 @@ +//============================================================================= +// +// Glagen : a planet sized landscape generator +// Copyright (C) 2002 Julien Guertault, Hugues Hiegel, Meng-Tih Lam +// +// 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. +// +//============================================================================= +// +// Glagen : GPL LAndscape GENerator +// +// isosahedron.cc for Glagen : made by Zavie (Julien Guertault) +// +// www.glagen.org +// +//============================================================================= + +#include +#include "data_glagen.hh" +#include "dot.hh" +#include "triangle.hh" + +// The regular polyhedron we use to create the planet is an isosahedron : +// 20 triangular faces, 12 vertex and 30 edges +// +// Vertex coordinates : +// +// { 0, 1, 0 } = P0 +// { sqrtf((5 - sqrtf(5)) / 10), (sqrtf(5)) / 5, -(5 + sqrtf(5)) / 10 } = P1 +// { -sqrtf((5 - sqrtf(5)) / 10), (sqrtf(5)) / 5, -(5 + sqrtf(5)) / 10 } = P2 +// { -sqrtf((5 + sqrtf(5)) / 10), (sqrtf(5)) / 5, (5 - sqrtf(5)) / 10 } = P3 +// { 0, (sqrtf(5)) / 5, 2 x ((sqrtf(5)) / 5) } = P4 +// { sqrtf((5 + sqrtf(5)) / 10), (sqrtf(5)) / 5, (5 - sqrtf(5)) / 10 } = P5 +// { sqrtf((5 - sqrtf(5)) / 10), -(sqrtf(5)) / 5, (5 + sqrtf(5)) / 10 } = P6 +// { -sqrtf((5 - sqrtf(5)) / 10), -(sqrtf(5)) / 5, (5 + sqrtf(5)) / 10 } = P7 +// { -sqrtf((5 + sqrtf(5)) / 10), -(sqrtf(5)) / 5, -(5 - sqrtf(5)) / 10 } = P8 +// { 0, -(sqrtf(5)) / 5, -2 x ((sqrtf(5)) / 5) } = P9 +// { sqrtf((5 + sqrtf(5)) / 10), -(sqrtf(5)) / 5, -(5 + sqrtf(5)) / 10 } = P10 +// { 0, -1, 0 } = P11 +// +// Faces : +// +// F0 = P0, P1, P2 +// F1 = P0, P2, P3 +// F2 = P0, P3, P4 +// F3 = P0, P4, P5 +// F4 = P0, P5, P1 +// F5 = P2, P1, P9 +// F6 = P8, P2, P9 +// F7 = P3, P2, P8 +// F8 = P7, P3, P8 +// F9 = P4, P3, P7 +// F10 = P6, P4, P7 +// F11 = P5, P4, P6 +// F12 = P10, P5, P6 +// F13 = P10, P1, P5 +// F14 = P9, P1, P10 +// F15 = P11, P8, P9 +// F16 = P11, P7, P8 +// F17 = P11, P6, P7 +// F18 = P11, P10, P6 +// F19 = P11, P9, P10 + +Triangle *isosahedron (float size) +{ + Dot *vertex[12]; + Triangle *face[20]; + float expr_1 = size * sqrtf((5 + sqrtf(5)) / 10); + float expr_2 = size * sqrtf((5 - sqrtf(5)) / 10); + float expr_3 = size * (5 + sqrtf(5)) / 10; + float expr_4 = size * (5 - sqrtf(5)) / 10; + float expr_5 = size * (sqrtf(5)) / 5; + + // Creation of the vertex + vertex[0] = new Dot ( 0, 1, 0); + vertex[1] = new Dot ( expr_2, expr_5, -expr_3); + vertex[2] = new Dot (-expr_2, expr_5, -expr_3); + vertex[3] = new Dot (-expr_1, expr_5, expr_4); + vertex[4] = new Dot ( 0, expr_5, 2 * expr_5); + vertex[5] = new Dot ( expr_1, expr_5, expr_4); + vertex[6] = new Dot ( expr_2, -expr_5, expr_3); + vertex[7] = new Dot (-expr_2, -expr_5, expr_3); + vertex[8] = new Dot (-expr_1, -expr_5, -expr_4); + vertex[9] = new Dot ( 0, -expr_5, -2 * expr_5); + vertex[10] = new Dot ( expr_1, -expr_5, -expr_4); + vertex[11] = new Dot ( 0, -1, 0); + + // Creation of the triangles + face[0] = new Triangle (vertex[0], vertex[1], vertex[2], NULL); + face[1] = new Triangle (vertex[0], vertex[2], vertex[3], NULL); + face[2] = new Triangle (vertex[0], vertex[3], vertex[4], NULL); + face[3] = new Triangle (vertex[0], vertex[4], vertex[5], NULL); + face[4] = new Triangle (vertex[0], vertex[5], vertex[1], NULL); + face[5] = new Triangle (vertex[2], vertex[1], vertex[9], NULL); + face[6] = new Triangle (vertex[8], vertex[2], vertex[9], NULL); + face[7] = new Triangle (vertex[3], vertex[2], vertex[8], NULL); + face[8] = new Triangle (vertex[7], vertex[3], vertex[8], NULL); + face[9] = new Triangle (vertex[4], vertex[3], vertex[7], NULL); + face[10] = new Triangle (vertex[6], vertex[4], vertex[7], NULL); + face[11] = new Triangle (vertex[5], vertex[4], vertex[6], NULL); + face[12] = new Triangle (vertex[10], vertex[5], vertex[6], NULL); + face[13] = new Triangle (vertex[10], vertex[1], vertex[5], NULL); + face[14] = new Triangle (vertex[9], vertex[1], vertex[10], NULL); + face[15] = new Triangle (vertex[11], vertex[8], vertex[9], NULL); + face[16] = new Triangle (vertex[11], vertex[7], vertex[8], NULL); + face[17] = new Triangle (vertex[11], vertex[6], vertex[7], NULL); + face[18] = new Triangle (vertex[11], vertex[10], vertex[6], NULL); + face[19] = new Triangle (vertex[11], vertex[9], vertex[10], NULL); + + // Setting up of the connexity + face[0]->Make_connexity (face[1]); + face[0]->Make_connexity (face[4]); + face[0]->Make_connexity (face[5]); + + face[1]->Make_connexity (face[0]); + face[1]->Make_connexity (face[2]); + face[1]->Make_connexity (face[7]); + + face[2]->Make_connexity (face[1]); + face[2]->Make_connexity (face[3]); + face[2]->Make_connexity (face[9]); + + face[3]->Make_connexity (face[2]); + face[3]->Make_connexity (face[4]); + face[3]->Make_connexity (face[11]); + + face[4]->Make_connexity (face[0]); + face[4]->Make_connexity (face[3]); + face[4]->Make_connexity (face[13]); + + face[5]->Make_connexity (face[0]); + face[5]->Make_connexity (face[6]); + face[5]->Make_connexity (face[14]); + + face[6]->Make_connexity (face[5]); + face[6]->Make_connexity (face[7]); + face[6]->Make_connexity (face[15]); + + face[7]->Make_connexity (face[1]); + face[7]->Make_connexity (face[6]); + face[7]->Make_connexity (face[8]); + + face[8]->Make_connexity (face[7]); + face[8]->Make_connexity (face[9]); + face[8]->Make_connexity (face[16]); + + face[9]->Make_connexity (face[2]); + face[9]->Make_connexity (face[8]); + face[9]->Make_connexity (face[10]); + + face[10]->Make_connexity (face[9]); + face[10]->Make_connexity (face[11]); + face[10]->Make_connexity (face[17]); + + face[11]->Make_connexity (face[3]); + face[11]->Make_connexity (face[10]); + face[11]->Make_connexity (face[12]); + + face[12]->Make_connexity (face[11]); + face[12]->Make_connexity (face[13]); + face[12]->Make_connexity (face[18]); + + face[13]->Make_connexity (face[4]); + face[13]->Make_connexity (face[12]); + face[13]->Make_connexity (face[14]); + + face[14]->Make_connexity (face[5]); + face[14]->Make_connexity (face[13]); + face[14]->Make_connexity (face[19]); + + face[15]->Make_connexity (face[6]); + face[15]->Make_connexity (face[16]); + face[15]->Make_connexity (face[19]); + + face[16]->Make_connexity (face[8]); + face[16]->Make_connexity (face[15]); + face[16]->Make_connexity (face[17]); + + face[17]->Make_connexity (face[10]); + face[17]->Make_connexity (face[16]); + face[17]->Make_connexity (face[18]); + + face[18]->Make_connexity (face[12]); + face[18]->Make_connexity (face[17]); + face[18]->Make_connexity (face[19]); + + face[19]->Make_connexity (face[14]); + face[19]->Make_connexity (face[15]); + face[19]->Make_connexity (face[18]); + + return face[0]; +} + +void split_all (Triangle *triangle) +{ + if (triangle->Is_checked ()) + return; + triangle->Checked (); + + triangle->Split (); + + if (triangle->Neighbor_ab () != 0) + split_all (triangle->Neighbor_ab ()); + if (triangle->Neighbor_bc () != 0) + split_all (triangle->Neighbor_bc ()); + if (triangle->Neighbor_ca () != 0) + split_all (triangle->Neighbor_ca ()); +} -- cgit v1.2.3