summaryrefslogtreecommitdiff
path: root/src/MapView.js
blob: 44191b048b54e36d6d16cea44b4130396a7abfff (plain)
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
import Canvas from './Canvas.js';
import { Mat3, Vec3, Point, Shape } from './Geometry.js';


const yAxis = new Vec3(0, 1, 0);
const zAxis = new Vec3(0, 0, 1);


function radians(degrees) {
	return degrees * (Math.PI/180);
}

function Circle(p0, axis, subdiv) {
	const rotationMatrix = new Mat3().rotation(axis, 2*Math.PI/(subdiv-1));
	const points = [p0];
	for (let i=0; i<subdiv-1; i++) {
		const point = rotationMatrix.mulv(points[i]);
		points.push(point);
	}
	return new Shape(points);
}

export class MapGrid {
	constructor(latDiv, longDiv, circleDiv=50) {
		// create latitudes
		this.latitudes = [];
		// equator
		this.latitudes.push(Circle(
			new Point(0, radians(0)).normal(), yAxis, circleDiv
		));
		for (let angle=latDiv; angle<90; angle += latDiv) {
			// positive (north)
			this.latitudes.push(Circle(
				new Point(0, radians(angle)).normal(), yAxis, circleDiv
			));
			// negative (south)
			this.latitudes.push(Circle(
				new Point(0, radians(-angle)).normal(), yAxis, circleDiv
			));
		}

		// create longitudes
		this.longitudes = [];
		for (let angle=0; angle<180; angle += longDiv) {
			console.log(angle);
			const point = new Point(radians(angle), 0).normal();
			const axis = point.cross(yAxis).normalize();
			console.log(axis);
			this.longitudes.push(Circle(
				point, axis, circleDiv
			));
		}
	}

	render(ct, view) {
		ct.beginPath();
		ct.arc(0, 0, 1, 0, 2*Math.PI);
		ct.stroke();

		for (let latitude of this.latitudes) {
			latitude.render(ct, view);
		}
		for (let longitude of this.longitudes) {
			longitude.render(ct, view);
		}
	}
}