-
Notifications
You must be signed in to change notification settings - Fork 0
/
arco-declinazione.html
234 lines (191 loc) · 9.64 KB
/
arco-declinazione.html
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calcolo scala graduata declinazione per eliostati di Foucault e Silbermann</title>
<style>
</style>
</head>
<body>
<h1>Calcolo scala graduata declinazione per eliostato di Foucault e Silbermann<br></h1>
Apparentemente è presente anche una scala graduata sul lato opposto dell'arco,
ma non sono riuscito a capire che scala sia; ipotizzo siano semplici gradi da -25 a +25.
<br>
<canvas id="canvas" width="800" height="400"></canvas>
<a href="https://raw.githubusercontent.com/jumpjack/heliostat/main/images/foucault_tipo1/declinazione.png"><img src="https://raw.githubusercontent.com/jumpjack/heliostat/main/images/foucault_tipo1/declinazione.png" width = 600></a>
<script>
// Funzione per calcolare la declinazione solare
function calcolaDeclinazioneGiorno(N) {
return 23.45 * Math.sin((360 * (N + 284)/ 365) * Math.PI / 180) ;
}
// Funzione per ottenere la data corrispondente al giorno dell'anno
function getDataGiorno(N) {
const startDate = new Date(new Date().getFullYear(), 0, 1); // Inizio dell'anno corrente
const data = new Date(startDate);
data.setDate(startDate.getDate() + N); // Aggiunge N giorni
return data.toLocaleDateString("it-IT", { day: "2-digit", month: "2-digit" });
}
// Array per memorizzare i valori di declinazione
let declinazioni = [];
// Calcola la declinazione solare per ogni intervallo di 10 giorni per tutto l'anno
const giorniDelMese = [1, 5, 10, 15, 20, 25];
const giorniTotali = 365; // oppure 366 per gli anni bisestili
for (let mese = 0; mese < 12; mese++) {
for (let i = 0; i < giorniDelMese.length; i++) {
let giorno = giorniDelMese[i];
let giornoDellAnno = calcolaGiornoDellAnno(mese, giorno);
if (giornoDellAnno > giorniTotali) {
break; // Esce dal ciclo se il giorno supera il numero totale di giorni nell'anno
}
let declinazione = calcolaDeclinazioneGiorno(giornoDellAnno);
console.log(getDataGiorno(giornoDellAnno), declinazione.toFixed(2));
declinazioni.push({
giorno: giornoDellAnno,
giornoMese : giorno,
data: getDataGiorno(giornoDellAnno),
declinazione: declinazione.toFixed(2) // Arrotonda a due cifre decimali
});
}
}
// Funzione per disegnare le linee lungo il bordo di una circonferenza e le date corrispondenti
function disegnaLineeCirconferenza() {
// Seleziona l'elemento del documento in cui disegnare le linee
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// Larghezza e altezza del canvas
const width = canvas.width;
const height = canvas.height;
// Raggio della circonferenza
const radius = 700;
const segmentLength = 20;
const XOFFSET = -70;
const YOFFSET = 800;
// Colore e spessore della linea
ctx.strokeStyle = "black";
ctx.lineWidth = 2;
ctx.fillStyle = "black";
ctx.font = "12px Arial";
// Mesi in francese
// const inizialiMesi = ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"];
const inizialiMesi = ["G", "F", "M", "A", "M", "G", "L", "A", "S", "O", "N", "D"];
// Disegna le linee lungo il bordo di una circonferenza - META' SUPERIORE
declinazioni.filter(item => ((item.giorno >= 180) && (item.giorno < 360))).forEach(item => {
// Calcola l'angolo in base al valore di declinazione
const angle = Math.PI - ((item.declinazione - 90 / 1) * Math.PI / 180);
// Calcola le coordinate del punto sul bordo della circonferenza
const x = width / 2 + (radius - 50) * Math.cos(angle);
const y = height / 2 - (radius - 50) * Math.sin(angle);
// Determina la lunghezza del segmento
const currentSegmentLength = item.giornoMese === 1 ? segmentLength * 1.5 : segmentLength;
// Calcola le coordinate del punto finale della linea
const endX = x + currentSegmentLength * Math.cos(angle);
const endY = y - currentSegmentLength * Math.sin(angle);
// Disegna la linea
ctx.lineWidth = 0.5;
ctx.beginPath();
ctx.moveTo(x + XOFFSET, y - YOFFSET + 0);
ctx.lineTo(endX + XOFFSET, endY - YOFFSET + 0);
ctx.stroke();
// Disegna la data o l'iniziale del mese corrispondente accanto alla linea
ctx.font = '8px Arial';
ctx.fillText(item.giornoMese, endX + XOFFSET - 3, endY - YOFFSET + 10);
if (item.giornoMese === 15) {
const mese = Math.floor(item.giorno / 30); // Approssima al mese
ctx.font = '12px Arial';
ctx.fillText(inizialiMesi[mese], endX + XOFFSET - 3, endY - YOFFSET + 25);
ctx.font = '8px Arial';
} else {
//ctx.fillText(item.giornoMese, endX + XOFFSET - 3, endY - YOFFSET + 10);
}
});
// Disegna le linee lungo il bordo di una circonferenza - META' INFERIORE
declinazioni.filter(item => ((item.giorno >= 0) && (item.giorno < 180))).forEach(item => {
// Calcola l'angolo in base al valore di declinazione
const angle = Math.PI - (item.declinazione - 90 / 1) * Math.PI / 180;
// Calcola le coordinate del punto sul bordo della circonferenza
const x = width / 2 + (radius + 10) * Math.cos(angle);
const y = height / 2 - (radius + 10) * Math.sin(angle);
// Determina la lunghezza del segmento
const currentSegmentLength = item.giornoMese === 1 ? segmentLength * 1.5 : segmentLength;
// Calcola le coordinate del punto iniziale e finale della linea
const startX = item.giornoMese === 1 ? x - (currentSegmentLength - segmentLength) * Math.cos(angle) : x;
const startY = item.giornoMese === 1 ? y + (currentSegmentLength - segmentLength) * Math.sin(angle) : y;
const endX = x + segmentLength * Math.cos(angle);
const endY = y - segmentLength * Math.sin(angle);
// Disegna la linea
ctx.lineWidth = 0.5;
ctx.beginPath();
ctx.moveTo(startX + XOFFSET, startY - YOFFSET + 25);
ctx.lineTo(endX + XOFFSET, endY - YOFFSET + 25);
ctx.stroke();
ctx.fillText(item.giornoMese, startX + XOFFSET - 3, startY - YOFFSET + 18);
if (item.giornoMese === 15) {
const mese = Math.floor(item.giorno / 30); // Approssima al mese
ctx.font = '12px Arial';
ctx.fillText(inizialiMesi[mese], startX + XOFFSET - 3, startY - YOFFSET + 4);
ctx.font = '8px Arial';
} else {
//
}
});
// Chiama la funzione per disegnare gli angoli
disegnaAngoli(ctx, width, height);
}
// Funzione per disegnare gli angoli da -24° a +24° con linee più lunghe ogni 5 gradi
function disegnaAngoli(ctx, width, height) {
// Raggio della circonferenza degli angoli
const radiusAngle = 600;
// Lunghezza del segmento delle linee degli angoli
const segmentLengthMain = 10; // Lunghezza della linea principale
const segmentLengthSub = 40; // Lunghezza delle linee secondarie
// Offset per il posizionamento degli angoli
const XOFFSET = -70;
const YOFFSET = -500;
// Disegna gli angoli da -24° a +24°
for (let angle = -25; angle <= 25; angle += 1) {
// Calcola l'angolo in radianti
const angleRad = (270 - angle) * Math.PI / 180;
// Calcola le coordinate del punto iniziale della linea principale degli angoli
const startXMain = width / 2 + radiusAngle * Math.cos(angleRad);
const startYMain = height / 2 - radiusAngle * Math.sin(angleRad);
// Calcola le coordinate del punto finale della linea principale degli angoli
const endXMain = startXMain + segmentLengthMain * Math.cos(angleRad);
const endYMain = startYMain - segmentLengthMain * Math.sin(angleRad);
// Disegna la linea principale degli angoli
ctx.beginPath();
ctx.moveTo(startXMain + XOFFSET, startYMain + YOFFSET);
ctx.lineTo(endXMain + XOFFSET, endYMain + YOFFSET);
ctx.stroke();
// Disegna le linee secondarie ogni 5 gradi
if (angle % 5 === 0) {
// Calcola le coordinate del punto finale della linea secondaria degli angoli
endXSub = startXMain + segmentLengthSub * Math.cos(angleRad);
endYSub = startYMain - segmentLengthSub * Math.sin(angleRad);
// Disegna la linea secondaria degli angoli
ctx.lineWidth = 0.5;
ctx.beginPath();
ctx.moveTo(startXMain + XOFFSET, startYMain + YOFFSET);
ctx.lineTo(endXSub + XOFFSET, endYSub + YOFFSET);
ctx.stroke();
// Disegna l'angolo corrispondente accanto alla linea secondaria
ctx.fillText(-angle, endXSub + XOFFSET, endYSub + YOFFSET + 15);
} else {
//
}
}
}
// Funzione per calcolare il giorno dell'anno a partire dal mese e dal giorno
function calcolaGiornoDellAnno(mese, giorno) {
const giorniPerMese = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let giornoDellAnno = giorno;
for (let i = 0; i < mese; i++) {
giornoDellAnno += giorniPerMese[i];
}
return giornoDellAnno;
}
// Chiama la funzione per disegnare le linee lungo il bordo di una circonferenza e le date quando il documento è pronto
document.addEventListener("DOMContentLoaded", disegnaLineeCirconferenza);
</script>
</body>
</html>