-
Notifications
You must be signed in to change notification settings - Fork 0
/
blatt10.cpp
140 lines (96 loc) · 2.56 KB
/
blatt10.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// compile with -std=c++11
// Programmentwurf zu Aufgabe 10, WS 2014/2015
// Programmieren II fuer Mathematiker
// Include- Dateien
#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
struct Ort
{
double phi, psi;
};
constexpr
double rad(double deg) { return deg * (3.1415926535 / 180.0); }
typedef vector<Ort> Kurve;
struct Erde
{
vector<Kurve> breitenkreise;
vector<Kurve> laengenkreise;
vector<Kurve> kuestenlinien;
Erde(string dateiname = "data.mod")
{
ifstream data(dateiname);
// Breitenkreise erzeugen und speichern
breitenkreise.reserve(11);
Kurve k;
for (int psi = -(90-15); psi <= (90-15); psi += 15)
{
k.reserve(360);
for (int phi = 0; phi < 360; ++)
{
k.push_back(Ort(rad(psi),rad(phi));
}
breitenkreise.push_back(move(k));
}
// Laengenkreise erzeugen und speichern
laengenkreise.reserve(12);
for (int phi = -(90-15); phi <= (90-15); psi += 15)
{
k.reserve(360);
}
// Kuestenlinien einlesen und speichern
}
};
class Ansicht
{
private:
double R, D, phi, psi;
double xc, yc, zc, xm, ym, zm;
double bildbreite;
double a, b, c, p, q, s, t;
double rad; // Radius des Kugelumrisses
double skal; // Skalierungsfaktor rad*skal= bildbreite/2
ofstream svgdatei;
public:
Ansicht(double R_, double D_, double phi_, double psi_, Erde erde, string dateiname="erde.svg") :
R(R_),D(D_),phi(phi_),psi(psi_)
{
// Abbildungsparameter berechnen
// SVG-Datei oeffnen, SVG-Prolog schreiben
// Kugelumriss zeichnen (Skalierung!)
// Breitenkreise zeichnen
// Laengenkreise zeichnen
// Kuestenlinien zeichnen
// SVG-Epilog schreiben
}
void kugelkoord_kartesisch(double r, double phi, double psi,
double & x, double & y, double & z)
{
}
void zentrproj(double x,double y, double z, double & u, double & v)
{
}
void ebene_bild(double u, double v, double & bx, double & by)
{
}
void kurve_zeichnen(Kurve kurve)
{
// Ortskoordinaten (Laenge/Breite) in Bildkoordinaten umrechnen
// und Strecken mit lineto zeichnen
// Clipping beruecksichtigen (ggf. statt lineto moveto)
}
};
int main()
{
double R = 1.0,
D = 5.0,
phi,
psi;
// Betrachterstandort, Kugelradius einlesen
Erde erde("data.mod");
Ansicht ansicht(R,D,phi,psi,erde,"erde.svg");
return 0;
}