Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.02.2019, 18:04
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Как нарисовать овал в массив?
Голова кипит спасайте кто может)

Вопрос больше не к javascript, а к математики, как заполнить многомерную матрицу (2d) цифрами образуя овал?

Допустим есть матрица 7х5, как реализовать её заполнение такого вида:
0001000
0111110
1111111
0111110
0001000

Или вопрос по другому, есть canvas и я пытаюсь понять как из прямоугольника одного цвета сделать вписаный овал в этот прямоугольник с затуханием альфа канала.

var
	canvas	= document.createElement('canvas'),
	context	= canvas.getContext('2d'),
	image	= context.createImageData(12, 16),
	data		= image.data;
	
	canvas.width	= 12; // Может быть любое значение 
	canvas.height	= 16; // Может быть любое значение 

	
	for(var i = 0; i < data.length; i+=4) {
		data[i]	= 255;
		data[i+1]	= 255;
		data[i+2]	= 255;
		data[i+3]	= ????; // Прозрачность (0-255) как её для каждого пикселя просчитать?
	}
				
	context.putImageData(image, 0, 0);


P.S. Нативные функции рисования мне не подойдут(
P.P.S. Давно с подобным не сталкивался. в голове клин от всяких синусов и косинусов
__________________
.
Ответить с цитированием
  #2 (permalink)  
Старый 28.02.2019, 18:30
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Skipp
в голове клин от всяких синусов и косинусов
можешь о них забыть )

пусть эллипс с центром в точке (a, b) и радиусами (А, В)
тогда закрашиваются все точки с координатами (х, у), которые удовлетворяют условию

(x - a)**2 / A**2 + (y - b)**2 / B**2 <= 1

здесь "**2" - возведение в квадрат.

для ускорения этого дела, не надо для каждой точки проверять это неравенство, а, например, для каждой горизонтальной линии просто вычислить начальный и конечный Х и всё что между ними заполнить

но это для простого случая, когда эллипс горизонтальный или вертикальный. А если он наклонный, то ещё матрицу преобразований надо будет делать, тут навскидку не помню.

Последний раз редактировалось Alexandroppolus, 28.02.2019 в 18:37.
Ответить с цитированием
  #3 (permalink)  
Старый 01.03.2019, 08:59
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Огромное спасибо тебе добрый человек, это именно, то что мне нужно!)))

Самое забавное, что я видел эту формулу, но после кучи материалов по данной теме я не смог понять, что это именно оно

Надеюсь кому-нибудь тоже пригодится.
__________________
.
Ответить с цитированием
  #4 (permalink)  
Старый 01.03.2019, 11:31
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Что в итоге получилось, может кому пригодится.
var
	width		= 80,
	height	= 100,
	color		= [255, 255, 255],
	depth	= 100; // 1-100
	scale		= 100; // 1-100
	canvas	= document.createElement('canvas'),
	context	= canvas.getContext('2d'),
	image	= context.createImageData(width, height),
	data		= image.data;
	
	canvas.width	= width;
	canvas.height	= height;

	for(var j = 0, row = 0, column = 0; j < data.length; j+=4, column++) {
		if(column >= width) {
			row++;
			column = 0;
		}
			
		data[j]		= color[0];
		data[j+1]	= color[1];
		data[j+2]	= color[2];
		data[j+3]	= 255 * ((scale * 0.02 - (Math.pow(row - height/2, 2) / Math.pow(height/2, 2) + Math.pow(column - width/2, 2) / Math.pow(width/2, 2)))/(depth/100))
	}
				
context.putImageData(image, 0, 0);


P.S. с терминами может напутал scale и depth
__________________
.
Ответить с цитированием
  #5 (permalink)  
Старый 01.03.2019, 20:19
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Skipp,
а почему всё-таки не воспользовался стандартными канвасными примитивами? из-за сглаживания?
Ответить с цитированием
  #6 (permalink)  
Старый 05.03.2019, 15:48
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Alexandroppolus,
И не только.
Делаю генерацию частиц так сказать дыма, добавил туда ещё шумов и получилось вполне ничего, особенно в скоплении)
__________________
.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добавить данные в глобальный массив из функции Jigan2 jQuery 2 14.03.2015 18:06
Как получить из строки массив? optron Общие вопросы Javascript 0 28.01.2015 04:49
Как нарисовать такой слой? LabMapDo Элементы интерфейса 4 27.08.2014 03:00
Как в шаблоне диррективы узнать массив это или строка? delias Angular.js 1 18.03.2014 07:33
Как удалить массив? SunYang Общие вопросы Javascript 14 05.02.2010 14:31