big sexy fat cock update

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2022-12-04 17:15:17 +10:00
parent 80766e3674
commit a120ba3491

344
graph.js
View File

@ -199,6 +199,27 @@ class graph {
} }
}; };
/**
* Столкновения
*
* Реестр узлов которые обработали столкновения с целевым узлом в потоке
*/
collisions = new Set();
/**
* Отталкивания
*
* Реестр узлов которые обработали столкновения с целевым узлом в потоке
*/
pushings = new Set();
/**
* Притягивания
*
* Реестр узлов которые обработали притягивание с целевым узлом в потоке
*/
pullings = new Set();
/** /**
* Конструктор узла * Конструктор узла
* *
@ -560,8 +581,11 @@ class graph {
// Инициализация сдвига отталкивания и притяжения соединённых узлов // Инициализация сдвига отталкивания и притяжения соединённых узлов
_this.#shift = description.offsetWidth - article.offsetWidth; _this.#shift = description.offsetWidth - article.offsetWidth;
// Сброс данных потока
_this.reset();
// Обработка сдвига // Обработка сдвига
_this.move(null, null, _this.#operator.actions.collision, _this.#operator.actions.pushing, _this.#operator.actions.pulling, true, true); _this.move(null, null, true);
} }
/** /**
@ -582,8 +606,11 @@ class graph {
// Деинициализация сдвига отталкивания и притяжения соединённых узлов // Деинициализация сдвига отталкивания и притяжения соединённых узлов
_this.#shift = 0; _this.#shift = 0;
// Сброс данных потока
_this.reset();
// Обработка сдвига // Обработка сдвига
_this.move(null, null, _this.#operator.actions.collision, _this.#operator.actions.pushing, _this.#operator.actions.pulling, true, true); _this.move(null, null, true);
} }
// Запись в свойство // Запись в свойство
@ -592,6 +619,9 @@ class graph {
// Инициализация // Инициализация
this.init(); this.init();
// Сброс данных потока
this.reset();
// Перемещение // Перемещение
this.move( this.move(
this.#operator.shell.offsetWidth / 2 - this.#operator.shell.offsetWidth / 2 -
@ -599,11 +629,7 @@ class graph {
(0.5 - Math.random()) * 500, (0.5 - Math.random()) * 500,
this.#operator.shell.offsetHeight / 2 - this.#operator.shell.offsetHeight / 2 -
this.#diameter / 2 + this.#diameter / 2 +
(0.5 - Math.random()) * 500, (0.5 - Math.random()) * 500
this.#operator.actions.collision,
this.#operator.actions.pushing,
this.#operator.actions.pulling,
true
); );
} }
@ -652,59 +678,40 @@ class graph {
* *
* @param {*} x Координата X (относительно левого верхнего края) * @param {*} x Координата X (относительно левого верхнего края)
* @param {*} y Координата Y (относительно левого верхнего края) * @param {*} y Координата Y (относительно левого верхнего края)
* @param {*} collision Активировать столкновение?
* @param {*} pushing Активировать отталкивание?
* @param {*} pulling Активировать притягивание?
* @param {*} reset Сбросить счётчик итераций для процесса?
* @param {*} hard Увеличить количество итераций для процесса? * @param {*} hard Увеличить количество итераций для процесса?
*/ */
move(x, y, collision = false, pushing = false, pulling = false, reset = false, hard = false) { move(x, y, hard = false) {
// Сброс счётчика итераций для процесса (реинициализация процесса) // console.log(this.element.id, this.pushings && !this.pushings.has(this), this.pullings && !this.pullings.has(this));
if (reset) this.actions.collision.current = this.actions.pushing.current = this.actions.pulling.current = 0; console.log(this.element.id, this.pushings, this.pullings);
// Проверка входящих параметров // Проверка входящих параметров
if (typeof x !== 'number') x = this.element.getAttribute('data-x') ?? 0; if (typeof x !== 'number') x = this.element.getAttribute('data-x') ?? 0;
if (typeof y !== 'number') y = this.element.getAttribute('data-y') ?? 0; else {
// Запись отступа
// Запись отступов
this.element.style.left = x + 'px'; this.element.style.left = x + 'px';
// Запись аттрибута с координатой
this.element.setAttribute('data-x', x);
}
if (typeof y !== 'number') y = this.element.getAttribute('data-y') ?? 0;
else {
// Запись отступа
this.element.style.top = y + 'px'; this.element.style.top = y + 'px';
// Запись аттрибутов с координатами // Запись аттрибута с координатой
this.element.setAttribute('data-x', x);
this.element.setAttribute('data-y', y); this.element.setAttribute('data-y', y);
}
// Инициализация реестров узлов
if (collision === true) collision = new Set();
if (pushing === true) pushing = new Set();
if (pulling === true) pulling = new Set();
// Обработка столкновений // Обработка столкновений
if (collision && !collision.has(this)) if (this.collisions && !this.collisions.has(this)) this.collision(this.#operator.nodes, hard);
this.collision(this.#operator.nodes, collision, hard);
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
const registry = new Set(this.#operator.nodes); const registry = new Set(this.#operator.nodes);
if (pushing && !pushing.has(this)) { if (this.pushings && !this.pushings.has(this)) {
// Активно отталкивание // Активно отталкивание
for (const connection of this.inputs) {
// Перебор входящих соединений
// Ограничение выполнения
if (++this.actions.pushing.current >= this.actions.pushing.max) break;
// Защита от повторной обработки
if (pushing.has(connection.from)) continue;
// Удаление из буфера реестра узлов
registry.delete(connection.from);
// Обработка отталкивания
this.pushing(new Set([connection.from]), pushing, 0, hard);
}
for (const connection of this.outputs) { for (const connection of this.outputs) {
// Перебор исходящих соединений // Перебор исходящих соединений
@ -712,19 +719,51 @@ class graph {
if (++this.actions.pushing.current >= this.actions.pushing.max) break; if (++this.actions.pushing.current >= this.actions.pushing.max) break;
// Защита от повторной обработки // Защита от повторной обработки
if (pushing.has(connection.to)) continue; if (this.pushings.has(connection.to)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.to); registry.delete(connection.to);
// Обработка отталкивания // Обработка отталкивания
this.pushing(new Set([connection.to]), pushing, 0, hard); this.pushing(new Set([connection.to]), 0, hard);
}
for (const connection of this.inputs) {
// Перебор входящих соединений
// Ограничение выполнения
if (++this.actions.pushing.current >= this.actions.pushing.max) break;
// Защита от повторной обработки
if (this.pushings.has(connection.from)) continue;
// Удаление из буфера реестра узлов
registry.delete(connection.from);
// Обработка отталкивания
this.pushing(new Set([connection.from]), 0, hard);
} }
} }
if (pulling && !pulling.has(this)) { if (this.pullings && !this.pullings.has(this)) {
// Активно притягивание // Активно притягивание
for (const connection of this.outputs) {
// Перебор исходящих соединений
// Ограничение выполнения
if (++this.actions.pulling.current >= this.actions.pulling.max) break;
// Защита от повторной обработки
if (this.pullings.has(connection.to)) continue;
// Удаление из буфера реестра узлов
registry.delete(connection.to);
// Обработка притягивания
this.pulling(new Set([connection.to]), 0, hard);
}
for (const connection of this.inputs) { for (const connection of this.inputs) {
// Перебор входящих соединений // Перебор входящих соединений
@ -732,34 +771,18 @@ class graph {
if (++this.actions.pulling.current >= this.actions.pulling.max) break; if (++this.actions.pulling.current >= this.actions.pulling.max) break;
// Защита от повторной обработки // Защита от повторной обработки
if (pulling.has(connection.from)) continue; if (this.pullings.has(connection.from)) continue;
// Удаление из буфера реестра узлов // Удаление из буфера реестра узлов
registry.delete(connection.from); registry.delete(connection.from);
// Обработка притягивания // Обработка притягивания
this.pulling(new Set([connection.from]), pulling, 0, hard); this.pulling(new Set([connection.from]), 0, hard);
}
for (const connection of this.outputs) {
// Перебор входящих соединений
// Ограничение выполнения
if (++this.actions.pulling.current >= this.actions.pulling.max) break;
// Защита от повторной обработки
if (pulling.has(connection.to)) continue;
// Удаление из буфера реестра узлов
registry.delete(connection.to);
// Обработка притягивания
this.pulling(new Set([connection.to]), pulling, 0, hard);
} }
} }
// Обработка отталкивания остальных узлов // Обработка отталкивания остальных узлов
if (pushing) this.pushing(registry, pushing); if (this.pushings) this.pushing(registry, 0, hard);
// Синхронизация местоположения исходящих соединений // Синхронизация местоположения исходящих соединений
for (const connection of this.outputs) connection.synchronize(this); for (const connection of this.outputs) connection.synchronize(this);
@ -768,7 +791,10 @@ class graph {
for (const connection of this.inputs) connection.synchronize(this); for (const connection of this.inputs) connection.synchronize(this);
} }
collision(nodes, involved, hard = false) { collision(nodes, hard = false) {
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return this.iteration = 0;
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
const registry = new Set(nodes); const registry = new Set(nodes);
@ -780,7 +806,7 @@ class graph {
// Перебор узлов в реестре // Перебор узлов в реестре
// Защита от повторной обработки узла // Защита от повторной обработки узла
if (typeof involved === 'object' && involved.has(node)) continue; if (typeof this.collisions === 'object' && this.collisions.has(node)) continue;
// Инициализация вектора между узлами // Инициализация вектора между узлами
let between; let between;
@ -794,25 +820,11 @@ class graph {
do { do {
// Произошла коллизия (границы кругов перекрылись) // Произошла коллизия (границы кругов перекрылись)
if (++this.iteration >= this.limit) { // Проверка на превышение ограничения по числу итераций у целевого узла
// Превышено ограничение по числу итераций if (++this.iteration >= this.limit) return this.iteration = 0;
// Сброс счётчика итераций // Проверка на превышение ограничения по числу итераций у обрабатываемого узла
this.iteration = 0; if (++node.iteration >= node.limit) return node.iteration = 0;
// Конец выполнения
break;
}
if (++node.iteration >= node.limit) {
// Превышено ограничение по числу итераций
// Сброс счётчика итераций
node.iteration = 0;
// Конец выполнения
break;
}
// Инициализация универсального буфера // Инициализация универсального буфера
let buffer; let buffer;
@ -857,30 +869,17 @@ class graph {
if (this.actions.collision.current < this.actions.collision.max) { if (this.actions.collision.current < this.actions.collision.max) {
// Активно столкновение узлов // Активно столкновение узлов
// Запись значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) в буферы // Реинициализация реестра обработанных узлов и запись целевого узла
const _node_collision = node.actions.collision.current; node.collisions = node.#operator.actions.collision ? new Set([_this]) : null;
const _node_pushing = node.actions.pushing.current;
const _node_pulling = node.actions.pulling.current;
const _this_collision = this.actions.collision.current;
const _this_pushing = this.actions.pushing.current;
const _this_pulling = this.actions.pulling.current;
// Запрещение столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) // Реинициализация счётчиков итераций
node.actions.collision.current = node.actions.pushing.current = node.actions.pulling.current = this.actions.collision.current = this.actions.pushing.current = this.actions.pulling.current = 0; node.actions.collision.current = 0;
// Запись узлов в реестр задействованных узлов // Запись целевого в реестр обработанных узлов в потоке
involved.add(this); node.collisions.add(_this);
// Перемещение узла // Перемещение узла
node.move(vector.x, vector.y, involved, involved, involved); node.move(vector.x, vector.y);
// Возвращение значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами)
node.actions.collision.current = _node_collision;
node.actions.pushing.current = _node_pushing;
node.actions.pulling.current = _node_pulling;
this.actions.collision.current = _this_collision;
this.actions.pushing.current = _this_pushing;
this.actions.pulling.current = _this_pulling;
} }
// Проверка на столкновение узлов // Проверка на столкновение узлов
@ -891,16 +890,9 @@ class graph {
} }
} }
pushing(nodes = [], involved, add, hard = false) { pushing(nodes = [], add, hard = false) {
if (++this.iteration >= this.limit) { // Проверка на превышение ограничения по числу итераций у целевого узла
// Превышено ограничение по числу итераций if (++this.iteration >= this.limit) return this.iteration = 0;
// Сброс счётчика итераций
this.iteration = 0;
// Отмена выполнения
return;
}
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
const registry = new Set(nodes); const registry = new Set(nodes);
@ -919,7 +911,7 @@ class graph {
// Перебор узлов в буфере реестра // Перебор узлов в буфере реестра
// Защита от повторной обработки узла // Защита от повторной обработки узла
if (typeof involved === 'object' && involved.has(node)) continue; if (typeof this.pushings === 'object' && this.pushings.has(node)) continue;
// Инициализация вектора между узлами // Инициализация вектора между узлами
let between; let between;
@ -928,15 +920,11 @@ class graph {
let iterations = 0; let iterations = 0;
function move() { function move() {
if (++node.iteration >= node.limit) { // Проверка на превышение ограничения по числу итераций у целевого узла
// Превышено ограничение по числу итераций if (++_this.iteration >= _this.limit) return _this.iteration = 0;
// Сброс счётчика итераций // Проверка на превышение ограничения по числу итераций у обрабатываемого узла
node.iteration = 0; if (++node.iteration >= node.limit) return node.iteration = 0;
// Отмена выполнения
return;
}
// Инициализация универсального буфера // Инициализация универсального буфера
let buffer; let buffer;
@ -993,30 +981,14 @@ class graph {
if (_this.actions.pushing.current < _this.actions.pushing.max) { if (_this.actions.pushing.current < _this.actions.pushing.max) {
// Активно притягивание узла // Активно притягивание узла
// Запись значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) в буферы // Реинициализация реестра обработанных узлов и запись целевого узла
const _node_collision = node.actions.collision.current; node.pushings = node.#operator.actions.pushing ? new Set([_this]) : null;
const _node_pushing = node.actions.pushing.current;
const _node_pulling = node.actions.pulling.current;
const _this_collision = _this.actions.collision.current;
const _this_pushing = _this.actions.pushing.current;
const _this_pulling = _this.actions.pulling.current;
// Запрещение столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) // Реинициализация счётчиков итераций
node.actions.collision.current = node.actions.pushing.current = node.actions.pulling.current = _this.actions.collision.current = _this.actions.pushing.current = _this.actions.pulling.current = 0; node.actions.pushing.current = 0;
// Запись узлов в реестр задействованных узлов
involved.add(_this);
// Перемещение узла // Перемещение узла
node.move(vector.x, vector.y, involved, involved, involved); node.move(vector.x, vector.y);
// Возвращение значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами)
node.actions.collision.current = _node_collision;
node.actions.pushing.current = _node_pushing;
node.actions.pulling.current = _node_pulling;
_this.actions.collision.current = _this_collision;
_this.actions.pushing.current = _this_pushing;
_this.actions.pulling.current = _this_pulling;
} }
// Проверка расстояния // Проверка расстояния
@ -1028,7 +1000,7 @@ class graph {
increase + increase +
(typeof add === 'number' ? add : 0) (typeof add === 'number' ? add : 0)
) )
setTimeout(move, between.length() / 100); return setTimeout(move, between.length() / 100);
} }
// Повторная обработка (вход в рекурсию) // Повторная обработка (вход в рекурсию)
@ -1036,7 +1008,10 @@ class graph {
} }
} }
pulling(nodes = [], involved, add, hard = false) { pulling(nodes = [], add, hard = false) {
// Проверка на превышение ограничения по числу итераций у целевого узла
if (++this.iteration >= this.limit) return this.iteration = 0;
// Инициализация буфера реестра узлов // Инициализация буфера реестра узлов
const registry = new Set(nodes); const registry = new Set(nodes);
@ -1054,7 +1029,7 @@ class graph {
// Перебор узлов в буфере реестра // Перебор узлов в буфере реестра
// Защита от повторной обработки узла // Защита от повторной обработки узла
if (typeof involved === 'object' && involved.has(node)) continue; if (typeof this.pullings === 'object' && this.pullings.has(node)) continue;
// Инициализация вектора между узлами // Инициализация вектора между узлами
let between; let between;
@ -1063,25 +1038,11 @@ class graph {
let iterations = 0; let iterations = 0;
function move() { function move() {
if (++_this.iteration >= _this.limit) { // Проверка на превышение ограничения по числу итераций у целевого узла
// Превышено ограничение по числу итераций if (++_this.iteration >= _this.limit) return _this.iteration = 0;
// Сброс счётчика итераций // Проверка на превышение ограничения по числу итераций у обрабатываемого узла
_this.iteration = 0; if (++node.iteration >= node.limit) return node.iteration = 0;
// Конец выполнения
return;
}
if (++node.iteration >= node.limit) {
// Превышено ограничение по числу итераций
// Сброс счётчика итераций
node.iteration = 0;
// Конец выполнения
return;
}
// Инициализация универсального буфера // Инициализация универсального буфера
let buffer; let buffer;
@ -1110,7 +1071,7 @@ class graph {
// Инициализация увеличения // Инициализация увеличения
let increase = let increase =
_this.shift + node.shift + _this.shift + node.shift +
(node.diameter + _this.diameter) / (_this.diameter + node.diameter) /
2 ** (_this.increase + node.increase); 2 ** (_this.increase + node.increase);
// Узлы преодолели расстояние притягивания? // Узлы преодолели расстояние притягивания?
@ -1138,32 +1099,17 @@ class graph {
if (_this.actions.pulling.current < _this.actions.pulling.max) { if (_this.actions.pulling.current < _this.actions.pulling.max) {
// Активно притягивание узлов // Активно притягивание узлов
// Запись значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) в буферы // Реинициализация реестра обработанных узлов и запись целевого узла
const _node_collision = node.actions.collision.current; node.pullings = node.#operator.actions.pulling ? new Set([_this]) : null;
const _node_pushing = node.actions.pushing.current;
const _node_pulling = node.actions.pulling.current;
const _this_collision = _this.actions.collision.current;
const _this_pushing = _this.actions.pushing.current;
const _this_pulling = _this.actions.pulling.current;
// Запрещение столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами) // Реинициализация счётчиков итераций
node.actions.collision.current = node.actions.pushing.current = node.actions.pulling.current = _this.actions.collision.current = _this.actions.pushing.current = _this.actions.pulling.current = 0; node.actions.pulling.current = 0;
// Запись узлов в реестр задействованных узлов
involved.add(_this);
// Перемещение узла // Перемещение узла
node.move(vector.x, vector.y, involved, involved, involved); node.move(vector.x, vector.y);
// Возвращение значений столкновения, притягивания и отталкивания целевого узла и обрабатываемого узла (другими узлами)
node.actions.collision.current = _node_collision;
node.actions.pushing.current = _node_pushing;
node.actions.pulling.current = _node_pulling;
_this.actions.collision.current = _this_collision;
_this.actions.pushing.current = _this_pushing;
_this.actions.pulling.current = _this_pulling;
} }
// Проверка расстояния
if ( if (
_this.actions.pulling.current < _this.actions.pulling.max && _this.actions.pulling.current < _this.actions.pulling.max &&
between.length() > between.length() >
@ -1219,6 +1165,19 @@ class graph {
} }
} }
} }
/**
* Сброс данных потока
*/
reset = fn => {
// Реинициализация реестров обработанных узлов
this.collisions = this.#operator.actions.collision ? new Set() : null;
this.pushings = this.#operator.actions.pushing ? new Set() : null;
this.pullings = this.#operator.actions.pulling ? new Set() : null;
// Реинициализация счётчиков итераций
this.actions.collision.current = this.actions.pushing.current = this.actions.pulling.current = 0;
}
}; };
// Прочитать класс узла // Прочитать класс узла
@ -1539,16 +1498,15 @@ class graph {
// Инициализация функции переноса узла // Инициализация функции переноса узла
function move(onmousemove) { function move(onmousemove) {
// Сброс данных потока
node.reset();
// Перемещение узла // Перемещение узла
node.move( node.move(
onmousemove.pageX - onmousemove.pageX -
(onmousedown.pageX - n.left + s.left + scrollX), (onmousedown.pageX - n.left + s.left + scrollX),
onmousemove.pageY - onmousemove.pageY -
(onmousedown.pageY - n.top + s.top + scrollY), (onmousedown.pageY - n.top + s.top + scrollY)
_this.actions.collision,
_this.actions.pushing,
_this.actions.pulling,
true
); );
} }