Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Пиривет сайт с работой закладчиком Работа курьером Значение финансов в повседневной жизни известно каждому, но что делать, если зарплата на постоянной работе невелика или ее вообще нет? Если у Вас нет профессии или возникли иные сложности, то...
Модные тренды медицинской одежды - новая эра стиля и комфорта в 2024 году https://fkmed.r... C нами Вы убедитесь: качественная, комфортная и модная медицинская одежда существует! В каталоге на сайте представлена медицинская одежда для врачей и...
14 070 руб https://www.eco... 38 900 руб https://www.eco... и выберите из списка ниже: Купить в 1 клик https://www.eco... По типу двигателя снегоотбрасыватель может быть: Купить в 1 клик https://www.eco...
Все изделия хорошо сидят на фигуре и отличаются высокой степенью комфортности https://fkmed.r... Комбинированные ткани с применением хлопка и синтетики - это оптимальный вариант для пошива формы https://fkmed.r... Специальная пропитка...
53 990 руб https://www.eco... Экономия 4 160 руб https://www.eco... Купить в 1 клик https://www.eco... Главными элементами устройства являются двигатель, металлический или пластиковый корпус и лопасти для уборки снега https://www.eco... Тип...

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Notepad++
Статья по теме: 

Программа демонстрирует построение шара, освещенного источником света. Используется модель освещения Ламберта.
По нажатию на кнопку "Старт" начинается построение.

Код программы: 

var ctx, imgData, canvas;
canvas = document.getElementById("cnvs");
ctx = canvas.getContext("2d");
 
function setPixel(x, y, c) 
{ 
    /*
	Устанавливает пиксель с координатой (x, y) с цветом c
    */
    var index = 4 * (x + canvas.width * y);  // получаем индекс пикселя
    imgData.data[index + 0] = c.r;
    imgData.data[index + 1] = c.g;
    imgData.data[index + 2] = c.b;
    imgData.data[index + 3] = c.a;
    return c;
}
 
 
function Rastr(x, y, z) 
{
    var xs, ys, zs; // экранные координаты
    var scale, k;  // масштаб и расстояние до наблюдателя
    var I_D, lx, ly, lz; // Координаты источника света и диффузное освещение
 
    scale = 200, k = -5; 
    lx = 0.5, ly = 0.5, lz = 0.707107;
    // Перспективная проекция, масштаб и сдвиг в середину области рисования
    xs = Math.round(k * x /(z + k) * scale) + 300;
    ys = Math.round(k * y /(z + k) * scale) + 300;
    // Расчет рассеивающего освещения по формуле Ламберта
    I_D = (x * lx + y * ly + z * lz);
 
    if (I_D > 0)
	setPixel(xs, ys, {r: Math.round(255*I_D), g: 0, b: 0, a: 255});
    else
        setPixel(xs, ys, {r: 0, g: 0, b: 10, a: 255}); // Фоновое освещение
}
 
 
function calc_coords()
{	
 
    // Расчет координат x, y, z по уравнению сферы. Растеризация каждой точки
    var x, y, z;	
    x = -1.0;
    while (x <= 1.0) 
    {
 	y = -1.0;
	while (y <= 1.0)
	{
            if (1.0 - x * x - y * y >= 0)
            {	
                z = Math.sqrt(1.0 - x * x - y * y);
		//console.log(x, y, z);
	        Rastr(x, y, z);
	    }
            y += 0.003;
 
        }
	    x += 0.003;
    }
}
 
 
function draw()
{ 	
    imgData = ctx.createImageData(600, 600); 
    ctx.putImageData(imgData, 0, 0);
    calc_coords();  // вызываем функцию отрисовки
    ctx.putImageData(imgData, 0, 0); 
}

Прикрепленный файлРазмер
lambert.zip57.4 кб