test-skybox/createSkyboxImage.js

108 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-08-13 14:39:49 +00:00
import hipparcos_catalog from "./hipparcos_7_concise.js";
2024-08-13 10:56:27 +00:00
import CatalogSkybox from "./CatalogSkybox.js";
2024-08-13 14:39:49 +00:00
function createSkyboxImage(faceId0, width) {
// 恒星亮度(等级),亮度等级越小,亮度越大
const magBright = -1;
const magMedium = 7;
const magDim = 12;
// 恒星大小,单位像素
const sizeBright = 5;
const sizeMedium = 1;
const sizeDim = 0.1;
// 恒星透明度(1为不透明0为透明)
const translucentBright = 1.0;
const translucentMedium = 0.5;
const translucentDim = 0.2;
const d2r = Math.PI / 180;
// 创建width*width的jpg格式的图片背景为黑色随机生成1000个像素点颜色为白色大小从1到5像素不等
var canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = width;
var context = canvas.getContext("2d");
// 黑色背景
context.fillStyle = "black";
context.fillRect(0, 0, width, width);
// 循环hipparcos数据,hipparcos_catalog为数组
for (var id = 0; id < hipparcos_catalog.length; id++) {
var star = hipparcos_catalog[id];
var mag = star[1];
var ra = star[2];
var dec = star[3];
// 赤经、赤纬转换为弧度
if (ra > 180) {
ra = ra - 360;
2024-08-13 10:56:27 +00:00
}
2024-08-13 14:39:49 +00:00
ra = ra * d2r;
dec = dec * d2r;
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
// 赤经、赤纬转换为立方盒子坐标,再转换为图片坐标
let { x, y, z } = CatalogSkybox.sphere2CubeXyz(ra, dec);
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
// 转换为图片坐标i,为横坐标,向右,[0,1]), (j为纵坐标,向下,[0,1])
let { i, j, faceId } = CatalogSkybox.cubeXyzToImgUV(x, y, z);
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
if (faceId !== faceId0) {
continue;
}
// 像素大小
let size = sizeBright;
let translucent = translucentBright;
if (mag > magBright && mag <= magMedium) {
size =
sizeMedium +
((sizeBright - sizeMedium) * (mag - magMedium)) /
(magBright - magMedium);
translucent =
translucentMedium +
((translucentBright - translucentMedium) * (mag - magMedium)) /
(magBright - magMedium);
}
// 亮度太暗,最小值
else if (mag > magMedium) {
size = sizeDim;
translucent = translucentDim;
}
if (mag < 1) {
console.log(mag, size, translucent);
}
// 图像坐标系下的坐标
let u = i * width - size / 2;
let v = j * width - size / 2;
if (u < 0) {
u = 0;
}
if (v < 0) {
v = 0;
}
// 画点,白色,带透明度
context.fillStyle = `rgba(255,255,255,${translucent})`;
context.fillRect(u, v, size, size);
}
var dataUrl = canvas.toDataURL("image/jpeg");
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
// 将这个图片插入到id为img1的img元素中
//var img1 = document.getElementById('img1');
//img1.src = dataUrl;
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
return dataUrl;
var image = new Image();
image.src = dataUrl;
2024-08-13 10:56:27 +00:00
2024-08-13 14:39:49 +00:00
return image;
// 将这个图片插入到id为img1的img元素中
//var img1 = document.getElementById('img1');
//img1.src = dataUrl;
2024-08-13 10:56:27 +00:00
}
2024-08-13 14:39:49 +00:00
export default createSkyboxImage;