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
| import Map from 'ol/Map.js'; import OSM from 'ol/source/OSM.js'; import TileLayer from 'ol/layer/Tile.js'; import View from 'ol/View.js'; import {Circle as CircleStyle, Fill, Stroke, Style} from 'ol/style.js'; import {MultiPoint, Point} from 'ol/geom.js'; import {getVectorContext} from 'ol/render.js';
const tileLayer = new TileLayer({ source: new OSM(), });
const map = new Map({ layers: [tileLayer], target: 'map', view: new View({ center: [0, 0], zoom: 2, }), });
const imageStyle = new Style({ image: new CircleStyle({ radius: 5, fill: new Fill({color: 'yellow'}), stroke: new Stroke({color: 'red', width: 1}), }), });
const headInnerImageStyle = new Style({ image: new CircleStyle({ radius: 2, fill: new Fill({color: 'blue'}), }), });
const headOuterImageStyle = new Style({ image: new CircleStyle({ radius: 5, fill: new Fill({color: 'black'}), }), });
const n = 200; const omegaTheta = 30000; const R = 7e6; const r = 2e6; const p = 2e6; tileLayer.on('postrender', function (event) { const vectorContext = getVectorContext(event); const frameState = event.frameState; const theta = (2 * Math.PI * frameState.time) / omegaTheta; const coordinates = []; let i; for (i = 0; i < n; ++i) { const t = theta + (2 * Math.PI * i) / n; const x = (R + r) * Math.cos(t) + p * Math.cos(((R + r) * t) / r); const y = (R + r) * Math.sin(t) + p * Math.sin(((R + r) * t) / r); coordinates.push([x, y]); } vectorContext.setStyle(imageStyle); vectorContext.drawGeometry(new MultiPoint(coordinates));
const headPoint = new Point(coordinates[coordinates.length - 1]);
vectorContext.setStyle(headOuterImageStyle); vectorContext.drawGeometry(headPoint);
vectorContext.setStyle(headInnerImageStyle); vectorContext.drawGeometry(headPoint);
map.render(); }); map.render();
|