/*
* Copyright 2024 The Ray Optics Simulation authors and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import BaseSceneObj from '../BaseSceneObj.js';
import LineObjMixin from '../LineObjMixin.js';
import Simulator from '../../Simulator.js';
import geometry from '../../geometry.js';
import i18next from 'i18next';
/**
* A single ray of light.
*
* Tools -> Light source -> Single ray
* @class
* @extends BaseSceneObj
* @memberof sceneObjs
* @property {Point} p1 - The start point of the ray.
* @property {Point} p2 - Another point on the ray.
* @property {number} brightness - The brightness of the ray.
* @property {number} wavelength - The wavelength of the ray in nm. Only effective when "Simulate Colors" is on.
*/
class SingleRay extends LineObjMixin(BaseSceneObj) {
static type = 'SingleRay';
static isOptical = true;
static serializableDefaults = {
p1: null,
p2: null,
brightness: 1,
wavelength: Simulator.GREEN_WAVELENGTH
};
populateObjBar(objBar) {
objBar.setTitle(i18next.t('main:tools.SingleRay.title'));
objBar.createNumber(i18next.t('simulator:sceneObjs.common.brightness'), 0.01, 1, 0.01, this.brightness, function (obj, value) {
obj.brightness = value;
});
if (this.scene.simulateColors) {
objBar.createNumber(i18next.t('simulator:sceneObjs.common.wavelength') + ' (nm)', Simulator.UV_WAVELENGTH, Simulator.INFRARED_WAVELENGTH, 1, this.wavelength, function (obj, value) {
obj.wavelength = value;
});
}
}
draw(canvasRenderer, isAboveLight, isHovered) {
const ctx = canvasRenderer.ctx;
const ls = canvasRenderer.lengthScale;
const colorArray = Simulator.wavelengthToColor(this.wavelength, 1);
ctx.fillStyle = isHovered ? 'cyan' : (this.scene.simulateColors ? canvasRenderer.rgbaToCssColor(colorArray) : 'rgb(255,0,0)');
ctx.fillRect(this.p1.x - 2.5 * ls, this.p1.y - 2.5 * ls, 5 * ls, 5 * ls);
ctx.fillStyle = isHovered ? 'cyan' : ('rgb(255,0,0)');
ctx.fillRect(this.p2.x - 1.5 * ls, this.p2.y - 1.5 * ls, 3 * ls, 3 * ls);
}
onSimulationStart() {
var ray1 = geometry.line(this.p1, this.p2);
ray1.brightness_s = 0.5 * this.brightness;
ray1.brightness_p = 0.5 * this.brightness;
if (this.scene.simulateColors) {
ray1.wavelength = this.wavelength;
}
ray1.gap = true;
ray1.isNew = true;
return {
newRays: [ray1]
};
}
};
export default SingleRay;