test-skybox/createSkyboxImage.js
2024-08-13 22:39:49 +08:00

108 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import hipparcos_catalog from "./hipparcos_7_concise.js";
import CatalogSkybox from "./CatalogSkybox.js";
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;
}
ra = ra * d2r;
dec = dec * d2r;
// 赤经、赤纬转换为立方盒子坐标,再转换为图片坐标
let { x, y, z } = CatalogSkybox.sphere2CubeXyz(ra, dec);
// 转换为图片坐标i,为横坐标,向右,[0,1]), (j为纵坐标,向下,[0,1])
let { i, j, faceId } = CatalogSkybox.cubeXyzToImgUV(x, y, z);
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");
// 将这个图片插入到id为img1的img元素中
//var img1 = document.getElementById('img1');
//img1.src = dataUrl;
return dataUrl;
var image = new Image();
image.src = dataUrl;
return image;
// 将这个图片插入到id为img1的img元素中
//var img1 = document.getElementById('img1');
//img1.src = dataUrl;
}
export default createSkyboxImage;