mirror of
https://github.com/Ttanasart-pt/Pixel-Composer.git
synced 2025-02-15 14:45:12 +01:00
150 lines
No EOL
3.6 KiB
Text
150 lines
No EOL
3.6 KiB
Text
function Mesh() constructor {
|
|
triangles = [];
|
|
center = [ 0, 0 ];
|
|
bbox = [ 0, 0, 1, 1 ];
|
|
|
|
static getRandomPoint = function(seed) {
|
|
random_set_seed(seed);
|
|
if(array_length(triangles) == 0) return [ 0, 0 ];
|
|
|
|
var tri = triangles[irandom(array_length(triangles) - 1)];
|
|
var p0 = tri[0];
|
|
var p1 = tri[1];
|
|
var p2 = tri[2];
|
|
|
|
var a1 = random1D(seed); seed++;
|
|
var a2 = random1D(seed); seed++;
|
|
|
|
var _x = (1 - sqrt(a1)) * p0.x + (sqrt(a1) * (1 - a2)) * p1.x + (sqrt(a1) * a2) * p2.x;
|
|
var _y = (1 - sqrt(a1)) * p0.y + (sqrt(a1) * (1 - a2)) * p1.y + (sqrt(a1) * a2) * p2.y;
|
|
|
|
return new __vec2( _x, _y );
|
|
}
|
|
|
|
static draw = function(_x, _y, _s) {
|
|
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
|
|
var t = triangles[i];
|
|
|
|
draw_line(_x + t[0].x * _s, _y + t[0].y * _s, _x + t[1].x * _s, _y + t[1].y * _s);
|
|
draw_line(_x + t[1].x * _s, _y + t[1].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
|
|
draw_line(_x + t[0].x * _s, _y + t[0].y * _s, _x + t[2].x * _s, _y + t[2].y * _s);
|
|
}
|
|
}
|
|
|
|
static pointIn = function(_x, _y) {
|
|
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
|
|
var t = triangles[i];
|
|
|
|
if(point_in_triangle(_x, _y, t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static mergePath = function(_conn = true) {
|
|
if(array_length(triangles) == 0) return [];
|
|
|
|
var segments = [];
|
|
var pointsPairs = {};
|
|
|
|
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
|
|
var t = triangles[i];
|
|
|
|
for( var j = 0; j < 3; j++ ) {
|
|
var p0 = t[(j + 0) % 3];
|
|
var p1 = t[(j + 1) % 3];
|
|
|
|
var overlap = false;
|
|
var ind = -1;
|
|
var amo = array_length(segments);
|
|
|
|
for( var k = 0; k < amo; k ++ ) {
|
|
if( (segments[k][0].equal(p0) && segments[k][1].equal(p1)) ||
|
|
(segments[k][0].equal(p1) && segments[k][1].equal(p0)) ) {
|
|
|
|
overlap = true;
|
|
ind = k;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(overlap) array_delete(segments, ind, 1);
|
|
else array_push(segments, [ p0, p1 ]);
|
|
}
|
|
}
|
|
|
|
if(!_conn) return segments;
|
|
|
|
for( var i = 0, n = array_length(segments); i < n; i++ ) {
|
|
var _s = segments[i];
|
|
pointsPairs[$ _s[0]] = _s[1];
|
|
pointsPairs[$ _s[1]] = _s[0];
|
|
}
|
|
|
|
var path = [ segments[0][0], segments[0][1] ];
|
|
var indx = 1;
|
|
|
|
for( var i = 0, n = array_length(segments); i < n; i++ ) {
|
|
var last_point = path[indx];
|
|
var next_point = pointsPairs[$ last_point];
|
|
if(next_point == undefined) break;
|
|
|
|
struct_remove(pointsPairs, last_point);
|
|
array_push(path, next_point);
|
|
indx++;
|
|
}
|
|
|
|
return path;
|
|
}
|
|
|
|
static clone = function() {
|
|
var msh = new Mesh();
|
|
|
|
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
|
|
msh.triangles[i] = [
|
|
triangles[i][0].clone(),
|
|
triangles[i][1].clone(),
|
|
triangles[i][2].clone(),
|
|
];
|
|
}
|
|
|
|
msh.center = [ center[0], center[1] ];
|
|
|
|
return msh;
|
|
}
|
|
|
|
static calcCoM = function() {
|
|
var _ax = 0;
|
|
var _ay = 0;
|
|
var _p = 0;
|
|
var _minx = infinity;
|
|
var _miny = infinity;
|
|
var _maxx = -infinity;
|
|
var _maxy = -infinity;
|
|
|
|
for( var i = 0, n = array_length(triangles); i < n; i++ ) {
|
|
var _tr = triangles[i];
|
|
|
|
for( var j = 0; j < 3; j++ ) {
|
|
_ax += _tr[j].x;
|
|
_ay += _tr[j].y;
|
|
|
|
_minx = min(_minx, _tr[j].x);
|
|
_miny = min(_miny, _tr[j].y);
|
|
_maxx = max(_maxx, _tr[j].x);
|
|
_maxy = max(_maxy, _tr[j].y);
|
|
_p++;
|
|
}
|
|
}
|
|
|
|
center = [ 0, 0 ];
|
|
if(_p == 0) return;
|
|
|
|
center = [ _ax / _p, _ay / _p ];
|
|
bbox = [ _minx, _miny, _maxx, _maxy ];
|
|
}
|
|
|
|
static serialize = function() { return ""; }
|
|
static deserialize = function(s) { return self; }
|
|
} |