Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Физика

Ответ
 
Опции темы
Старый 29.06.2014, 15:50   #1
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
2D вращение

2D выпуклые тела. При коллизии, используя SAT нахожу вектор проникновения одного тела в другое. Плюсую к скоростям тел данный вектор - коллизия решена.
А как можно вычислить вращение двух тел после коллизии? Как я понимаю, вектор вращения будет перпендикулярен вектору проникновения, но как узнать направление( по часовой, против часовой ) этого вектора?
(Offline)
 
Ответить с цитированием
Старый 29.06.2014, 22:48   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: 2D вращение


Nikich пилит свой физдвиг?
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 29.06.2014, 23:55   #3
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

Знания физики дают возможность делать довольно красивые демки
https://dl.dropboxusercontent.com/u/...oth/index.html
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Nikich за это полезное сообщение:
LLI.T.A.L.K.E.R. (30.06.2014), moka (30.06.2014), pax (30.06.2014), St_AnGer (30.06.2014), Жека (01.07.2014)
Старый 30.06.2014, 00:09   #4
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: 2D вращение

момент инерции
то есть у тела есть центр тяжести и есть линия действия силы на тело вот перпендикуляр на эту линию от центра будет плечом для момента который создает эта сила. и закручивает эта сила тело по часовой или против часовой стрелки в зависимости от направления вектора силы или импульса причем на угловое ускорение равное делению момента инерции этого тела на полученный момент сил.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (30.06.2014)
Старый 30.06.2014, 00:13   #5
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

В смысле от направления силы? Направление силы может быть одинаковым, а тело будет крутиться по разному.
(Offline)
 
Ответить с цитированием
Старый 30.06.2014, 00:22   #6
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: 2D вращение

направление вектора силы вдоль линии действия ж
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (30.06.2014)
Старый 30.06.2014, 00:25   #7
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

Т.е. в любом случае необходимо найти саму точку касания?
(Offline)
 
Ответить с цитированием
Старый 30.06.2014, 00:27   #8
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: 2D вращение

ага, а вообще это все хорошо в курсе термеха дается во всяких плоскопаралельных и прочих видах движения
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (30.06.2014)
Старый 30.06.2014, 23:41   #9
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

https://dl.dropboxusercontent.com/u/...emp/index.html
Вот, собственно, что получилось. Вершины полигонов тягаются.
Для расчета движения вершин использовал метод интегрирования Верле, как и в симуляции ткани. Если кому-нибудь интересно, рассказал бы о реализации
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Nikich за это полезное сообщение:
FireOwl (01.07.2014), moka (01.07.2014), pax (01.07.2014), St_AnGer (01.07.2014)
Старый 01.07.2014, 00:08   #10
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D вращение

А можно туда 32+ кубика?
Как с трением и упругостью, настраиваемо?

Заметил что кубик на кубике не хочет лежать.
Прикольно! Тебе точно не нужно учиться, поверь - ты пожалеешь о 5 годах жизни, а 5 лет в твоём возрасте - это драгоценное время, очень-очень.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (01.07.2014)
Старый 01.07.2014, 00:48   #11
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

В плане производительности - да, можно, работает довольно шустро.
Но систему нужно допиливать, так как она работает нестабильно, когда одно тело лежит на другом.
Параметры легко настраиваются.
На счет образования: блин, живя в Лондоне легко так говорить А я не представляю, как отсюда можно перебраться за бугор, не имея лучших знаний.
(Offline)
 
Ответить с цитированием
Старый 01.07.2014, 03:16   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: 2D вращение

*Перенёс оффтоп сюда: http://forum.boolean.name/showthread.php?t=19285
(Offline)
 
Ответить с цитированием
Старый 01.07.2014, 08:12   #13
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: 2D вращение

У тебя как-то резко выкидывает из пересечения

moka, 30 штук нормально работает, хорошая производительность, а 200 - FPS = 5
(134 строка для смены количества, 147 строка - изменение размера)
(Nicith не против, что я его исходник правлю? )
Nicith, я бы не делал на твоем месте много циклов, а то ты считаешь нормали в цикле, сохраняешь их, а потом опять в цикле (в другом) читаешь их, а циклы все одной длины.
Nicith, я исправил несколько опечаток (при расчете смещения по x и y в нескольких местах вместо y стоял x(копипаста))

<<html data-savefrom-tab-data="{&quot;module&quot;:&quot;lm&quot;,&quot;tooltip&quot;:&quot;Найдено ссылок: 0&quot;}"><head>
<
meta http-equiv="content-type" content="text/html; charset=UTF-8"><style type="text/css"></style></head><body data-savefrom-link-count="0"><div style="width:800; height:600;margin: auto;">
    <
span id="output" style="position: absolute;">FPS55</span>

    <
canvas id="canvas" width="800" height="600" style="width: 800; height: 600;"></canvas>
</
div>
<
script>
window.requestAnimFrame =
        
window.requestAnimationFrame ||
        
window.webkitRequestAnimationFrame ||
        
window.mozRequestAnimationFrame ||
        
window.oRequestAnimationFrame ||
        
window.msRequestAnimationFrame ||
        function (
callback) {
            
window.setTimeout(callback1000 60);
        };
var 
out document.getElementById("output");
var 
canvas document.getElementById("canvas");
var 
ctx canvas.getContext("2d");
var 
lastTick = + new Date();
var 
dt 0;

ctx.fillStyle "#000";
ctx.strokeStyle "rgba(60,60,60,1)";
ctx.lineWidth 1;
var 
mouse = {
        
downfalse,
        
button1,
        
x0,
        
y0,
        
px0,
        
py0
    
};
var 
settings={
    
w60,
    
h30,
    
size100,
    
k2.5,
    
gravity: {x:0y:500},
    
physics_iterations3
    
};
canvas.onmousedown = function (e) {
        
mouse.button e.which;
        
mouse.px mouse.x;
        
mouse.py mouse.y;
        var 
rect canvas.getBoundingClientRect();
        
mouse.e.clientX rect.left,
        
mouse.e.clientY rect.top,
        
mouse.down true;
        
e.preventDefault();
    };

    
canvas.onmouseup = function (e) {
        
mouse.down false;
        
e.preventDefault();
    };

    
canvas.onmousemove = function (e) {
        
mouse.px mouse.x;
        
mouse.py mouse.y;
        var 
rect canvas.getBoundingClientRect();
        
mouse.e.clientX rect.left,
        
mouse.e.clientY rect.top,
        
e.preventDefault();
    };

    
canvas.oncontextmenu = function (e) {
        
e.preventDefault();
    };
function 
collide(a1a2b1b2)
{
    var 
result;

    var 
ua_t = (b2.b1.x) * (a1.b1.y) - (b2.b1.y) * (a1.b1.x);
    var 
ub_t = (a2.a1.x) * (a1.b1.y) - (a2.a1.y) * (a1.b1.x);
    var 
u_b  = (b2.b1.y) * (a2.a1.x) - (b2.b1.x) * (a2.a1.y);

    if ( 
u_b != ) {
        var 
ua ua_t u_b;
        var 
ub ub_t u_b;

        if ( 
<= ua && ua <= && <= ub && ub <= ) {
            
result = {x:a1.ua * (a2.a1.x),y:a1.ua * (a2.a1.y)};
        } else {
//            result = new Intersection("No Intersection");
            
result 0;
        }
    } else {
        if ( 
ua_t == || ub_t == ) {
//            result = new Intersection("Coincident");
            
result 0;
        } else {
//            result = new Intersection("Parallel");
            
result 0;
        }
    }

    return 
result;
}
var 
shapes = [];
function 
createPoint(shape,x,y,weight){
    
shape.points.push({x:x,y:y,px:x,py:y,ax:0,ay:0,link:[],weightweight});
}
function 
createLink(shape,i,j,edge){
    
shape.constrs.push({i:i,j:j,len:Math.sqrt((shape.points[i].x-shape.points[j].x)*(shape.points[i].x-shape.points[j].x)+(shape.points[i].y-shape.points[j].y)*(shape.points[i].y-shape.points[j].y)), edgeedge});
}
function 
createShape(pts){
    var 
shape = {points: [], constrs: [], cmx0cmy0};
    for (var 
i=0;pts.lengthi++){
        if (
typeof pts[i][2] == 'undefined'pts[i][2]=1;
        
createPoint(shape,pts[i][0],pts[i][1],pts[i][2]);
        
shape.cmx += pts[i][0];
        
shape.cmy += pts[i][1];
    }
    
shape.cmx /= pts.length;
    
shape.cmy /= pts.length;
    for (var 
i=0i<pts.lengthi++){
        for (var 
j=i+1j<pts.lengthj++){
            
createLink(shape,i,j,(((j-i)==1)||((pts.length-j-i)==1)));
        }
    }
    
shapes.push(shape);
}

//createShape([[100,100],[150,200],[50,200]]);
//createShape([[300,300],[400,300],[400,400],[300,400]]);
//createShape([[300,300],[400,300],[400,400],[300,400]]);
//createShape([[300,300],[400,300],[400,400],[300,400]]);
//createShape([[300,300],[400,300],[400,400],[300,400]]);
//createShape([[300,300],[400,300],[400,400],[300,400]]);
//createShape([[500,300],[600,300],[600,400],[500,400]]);
//createShape([[100,100],[150,200],[150,250],[50,200]]);
//createShape([[100,100],[130,200],[70,200]]);
var getRandomInt = function(minmax)
{
      return 
Math.floor(Math.random() * (max min 1)) + min;
}

for(var 
i=0;i<3;i++){
    var 
x  getRandomInt(200,600);
    var 
y  getRandomInt(100,500);
    var 
s  getRandomInt(3,8);
    
    var 
seg = new Array();
    
    for(var 
l=0;l<s;l++){
        var 
getRandomInt(60,120);
        var 
2*Math.PI*(l/s);
        
seg.push([Math.cos(a)*r+x,Math.sin(a)*r+y])
    }
    
    
createShape(seg);
}

var 
pinned 0;

function 
updateForces(){
    if (!
mouse.downpinned 0;
    for (var 
k=0k<shapes.lengthk++){
        var 
points shapes[k].points;
        for (var 
i=0i<points.lengthi++){
                if (!
points[i]) continue;
                var 
point points[i];
                
point.ax settings.gravity.x;
                
point.ay settings.gravity.y;
                if (!
pinned && mouse.down && ((point.x-mouse.x)*(point.x-mouse.x)+(point.y-mouse.y)*(point.y-mouse.y)<1024)){
                    
pinned points[i];
                    if (
mouse.button==3) {delete points[i]; break;}
                }
        }
    }
    
pinned.+= (mouse.x-mouse.px);
    
pinned.+= (mouse.y-mouse.py);
//    ctx.strokeStyle = "green";
//    ctx.lineWidth = 3;
//    ctx.beginPath();
//    ctx.moveTo(pinned.x,pinned.y);
//    ctx.lineTo(pinned.x + (mouse.x-mouse.px)*100,pinned.y + (mouse.y-mouse.py)*100);
//    ctx.stroke();
//    ctx.lineWidth = 1;
}
function 
updatePhysics(dt){
    for (var 
k=0k<shapes.lengthk++){
        var 
shape1 shapes[k];
        var 
points shape1.points;
        var 
constrs shape1.constrs;
        
//        for (var k2=0; k2<shapes.length; k2++){
//
//            if (k2==k) continue;
//            var points2 = shapes[k2].points;
//            var constrs2 = shapes[k2].constrs;
//            for (var i=0; i<constrs.length; i++){
//                if (!constrs[i].edge)  continue;
//                for (var j=0; j<constrs2.length; j++){
//                    if (!constrs2[j].edge) continue;
//                    var tmp = collide(points[constrs[i].i],points[constrs[i].j],points2[constrs2[j].i],points2[constrs2[j].j]);
//                    if (tmp){
//                        var closest,closestp,closest2, closestp2;
//                        var point1 = points[constrs[i].i], point2 = points[constrs[i].j],
//                            point3 = points2[constrs2[j].i], point4 = points2[constrs2[j].j];
//                        var dx1 = point1.x - tmp.x,dy1 = point1.y - tmp.y;
//                        var dx2 = point2.x - tmp.x,dy2 = point2.y - tmp.y;
//                        var dx3 = point3.x - tmp.x,dy3 = point3.y - tmp.y;
//                        var dx4 = point4.x - tmp.x,dy4 = point4.y - tmp.y;
//
//                        if (dx1*dx1+dy1*dy1<dx2*dx2+dy2*dy2)
//                            closest = {x:dx1,y:dy1}, closestp = point1;
//                        else
//                            closest = {x:dx2,y:dy2}, closestp = point2;
//                        if (dx3*dx3+dy3*dy3<dx4*dx4+dy4*dy4)
//                            closest2 = {x:dx3,y:dy3}, closestp2 = point3;
//                        else
//                            closest2 = {x:dx4,y:dy4}, closestp2 = point4;
//                        if (closest2.x*closest2.x+closest2.y*closest2.y<closest.x*closest.x+closest.y*closest.y){
//                            closest = closest2;
//                            closestp = closestp2;
//                            var t = point1;
//                            var t2 = point2;
//                            point1 = point3;
//                            point3 = t;
//                            point2 = point4;
//                            point4 = t2;
//
//                        }
//
//                        points[constrs[i].i].x -= closest.x/2;
//                        points[constrs[i].j].x -= closest.x/2;
//                        points[constrs[i].i].y -= closest.y/2;
//                        points[constrs[i].j].y -= closest.y/2;
//                        points2[constrs2[j].i].x += closest.x/2;
//                        points2[constrs2[j].j].x += closest.x/2;
//                        points2[constrs2[j].i].y += closest.y/2;
//                        points2[constrs2[j].j].y += closest.y/2;
//                        var startx = point3.x, starty = point3.y;
//                        var endx = point4.x, endy = point4.y;
//                        var dot = (endx-startx)*closest.x+(endy-starty)*closest.y;
//                        if (dot>0)
//                            startx = point4.x,
//                                    starty = point4.y,
//                                    endx = point3.x,
//                                    endy = point3.y,
//                                    dot = (endx-startx)*closest.x+(endy-starty)*closest.y;
//
//                        var x = endx - startx, y = endy - starty;
//                        var len = Math.sqrt(x*x+y*y);
//                        dot /= len;
//                        x /= len; y /= len;
//                        x *= dot; y *= dot;
//
//                        var deltax = closest.x - x, deltay = closest.y - y;
//                        ctx.strokeStyle = "rgba(60,60,255,1)";
//                        ctx.fillStyle = "rgba(60,60,255,1)";
//                        ctx.lineWidth = 4;
//
//                        ctx.beginPath();
//                        ctx.moveTo(tmp.x,tmp.y);
//                        ctx.lineTo(tmp.x+x,tmp.y+y);
//                        ctx.stroke();
//                        ctx.beginPath();
//                        ctx.strokeStyle = "rgba(255,60,60,1)";
//                        ctx.moveTo(tmp.x,tmp.y);
//                        ctx.lineTo(tmp.x+closest.x,tmp.y+closest.y);
//                        ctx.stroke();
//                        ctx.beginPath();
//                        ctx.strokeStyle = "rgba(60,255,60,1)";
//                        ctx.moveTo(tmp.x,tmp.y);
//                        ctx.lineTo(tmp.x+deltax,tmp.y+deltay);
//                        ctx.stroke();
//                        ctx.fillStyle = "rgba(255,0,0,1)";
//                        closestp.x -= deltax/2;
//                        closestp.y -= deltay/2;
//                        points[constrs[i].i].x -= deltax/4;
//                        points[constrs[i].j].x -= deltax/4;
//                        points[constrs[i].i].y -= deltay/4;
//                        points[constrs[i].j].y -= deltay/4;
//                        points2[constrs2[j].i].x += deltax/4;
//                        points2[constrs2[j].j].x += deltax/4;
//                        points2[constrs2[j].i].y += deltay/4;
//                        points2[constrs2[j].j].y += deltay/4;
//                    }
//                }
//            }
//            ctx.strokeStyle = "rgba(60,60,60,1)";
//            ctx.lineWidth = 1;
//        }
            
            
        
for (var k2=k+1k2<shapes.lengthk2++){
            var 
points1 points;//shapes[k].points;
            
var points2 shapes[k2].points;
            
            var 
shape2 shapes[k2];
            var 
minDepth 100500;
            var 
minAxis 0;
            var 
axises = [];
            
            for (var 
j=0j<points1.lengthj++){
                var 
start,end;
                if (
jend points1[j], start points1[j-1];
                else   
start points1[points1.length-1], end points1[0];
                var 
e1 = {xstart.end.xystart.end.y};
                var 
Math.sqrt(e1.x*e1.x+e1.y*e1.y);
                
axises.push({x: -e1.y/ty: +e1.x/tsshape1});
            }

            for (var 
j=0j<points2.lengthj++){
                var 
start,end;
                if (
jend points2[j], start points2[j-1];
                else   
start points2[points2.length-1], end points2[0];
                var 
e1 = {xstart.end.xystart.end.y};
                var 
Math.sqrt(e1.x*e1.x+e1.y*e1.y);
                
axises.push({x: -e1.y/ty: +e1.x/tsshape2});
            }
            var 
collided 0;
            for (var 
a=0a<axises.lengtha++){
                var 
shape1min = {x:100500}, shape1max = {x:-100500};
                for (var 
p=0p<points1.lengthp++){
                    var 
proj points1[p].x*axises[a].x+points1[p].y*axises[a].y;
                    if (
shape1min.x>projshape1min = {xprojppoints1[p], s1};
                    if (
shape1max.x<projshape1max = {xprojppoints1[p], s1};
                }
                var 
shape2min = {x:100500}, shape2max = {x:-100500};
                for (var 
p=0p<points2.lengthp++){
                    var 
proj points2[p].x*axises[a].x+points2[p].y*axises[a].y;
                    if (
shape2min.x>projshape2min = {xprojppoints2[p], s2};
                    if (
shape2max.x<projshape2max = {xprojppoints2[p], s2};
                }
                var 
max shape1max.x>shape2max.x?shape2max:shape1max;
                var 
min shape1min.x>shape2min.x?shape1min:shape2min;
                var 
diff max.min.x;
                if (
diff<0) {break;}
                if (
diff<minDepth) {
                    
minDepth diff;
                    
minAxis = {aaxises[a], p1min.pp2max.ps1min.ss2max.s};
                }
                if (
== axises.length 1collided 1;
            }
                if (
collided){
//                    if (minAxis.s==shape2){
//                        var ttt = shape1;
//                        shape1 = shape2;
//                        shape2 = ttt;
//                    }
//                    for (var p=0; p<shape1.points.length; p++){
//                        shape1.points[p].x -= minAxis.x * minDepth;
//                        shape1.points[p].y -= minAxis.y * minDepth;
//                    }
//                    for (var p=0; p<shape2.points.length; p++){
//                        shape2.points[p].x += minAxis.x * minDepth;
//                        shape2.points[p].y += minAxis.y * minDepth;
//                    }
                    
var dx minDepth*minAxis.a.xdy minDepth*minAxis.a.y;
                    
ctx.strokeStyle "green";
                    
ctx.beginPath();
                   
ctx.moveTo(minAxis.p1.x,minAxis.p1.y);
                    
ctx.lineTo(minAxis.p1.dx*50,minAxis.p1.dy*50);
                    
ctx.stroke();
                    
                    if (
minAxis.s1==1){
                        var 
tx shape1.cmx minAxis.p1.xty shape1.cmy minAxis.p1.y;
                        var 
len Math.sqrt(tx*tx+ty*ty);
                        
tx /= lenty /= len;
                        var 
= -tx*minAxis.a.y+ty*minAxis.a.x;

                        for (var 
t=0t<points1.lengtht++) {
                            var 
rx = (shape1.cmy points1[t].y), ry = -(shape1.cmx points1[t].x);
                            var 
len Math.sqrt(rx*rx+ry*ry);
                            
rx rx lenry ry len;

                            
points1[t].x+=dx/2+rx;
                            
points1[t].y+=dy/2+ry;
                        }
                        var 
tx shape2.cmx minAxis.p1.xty shape2.cmy minAxis.p1.y;
                        var 
len Math.sqrt(tx*tx+ty*ty);
                        
tx /= lenty /= len;
                        var 
tx*minAxis.a.y-ty*minAxis.a.x;

                        for (var 
t=0t<points2.lengtht++) {
                            var 
rx = (shape2.cmy points2[t].y), ry = -(shape2.cmx points2[t].x);
                            var 
len Math.sqrt(rx*rx+ry*ry);
                            
rx rx lenry ry len;

                            
points2[t].x+=-dx/2+rx;
                            
points2[t].y+=-dy/2+ry;
                        }
                    }
                    else{
                        var 
tx shape1.cmx minAxis.p1.xty shape1.cmy minAxis.p1.y;
                        var 
len Math.sqrt(tx*tx+ty*ty);
                        
tx /= lenty /= len;
                        var 
tx*minAxis.a.y-ty*minAxis.a.x;

                        for (var 
t=0t<points1.lengtht++) {
                            var 
rx = (shape1.cmy points1[t].y), ry = -(shape1.cmx points1[t].x);
                            var 
len Math.sqrt(rx*rx+ry*ry);
                            
rx rx lenry ry len;

                            
points1[t].x+=-dx/2+rx;
                            
points1[t].y+=-dy/2+ry;
                        }
                        var 
tx shape2.cmx minAxis.p1.xty shape2.cmy minAxis.p1.y;
                        var 
len Math.sqrt(tx*tx+ty*ty);
                        
tx /= lenty /= len;
                        var 
= -tx*minAxis.a.y+ty*minAxis.a.x;

                        for (var 
t=0t<points2.lengtht++) {
                            var 
rx = (shape2.cmy points2[t].y), ry = -(shape2.cmx points2[t].x);
                            var 
len Math.sqrt(rx*rx+ry*ry);
                            
rx rx lenry ry len;

                            
points2[t].x+=dx/2+rx;
                            
points2[t].y+=dy/2+ry;
                        }
                    }
//                    ctx.beginPath();
//                    ctx.moveTo(minAxis.p2.x,minAxis.p2.y);
//                    ctx.lineTo(minAxis.p2.x - dx*50,minAxis.p2.y - dy*50);
//                    ctx.stroke();
//                    minAxis.p1.x += dx;
//                    minAxis.p1.y += dy;
//                    minAxis.p2.x -= dx;
//                    minAxis.p2.y -= dy;
                
}

        }

        for (var 
i=0i<constrs.lengthi++){
            if (!
constrs[i] || !points[constrs[i].i] || !points[constrs[i].j]) continue;
            var 
point1 points[constrs[i].i],point2 points[constrs[i].j];
            var 
deltax point2.point1.x;
            var 
deltay point2.point1.y;
            var 
deltal Math.sqrt(deltax*deltax+deltay*deltay);
            
//if (deltal>settings.k*constrs[i].len) {delete constrs[i]; continue;}
            
if (!point1.weight && !point2.weight) continue;
            var 
= (deltal-constrs[i].len)/(deltal*(point1.weight+point2.weight));
            
deltax *= d*.5;
            
deltay *= d*.5;
            
point1.+= deltax*point1.weight;
            
point1.+= deltay*point1.weight;
            
point2.-= deltax*point2.weight;
            
point2.-= deltay*point2.weight;
        }
        
shapes[k].cmx 0;
        
shapes[k].cmy 0;
        for (var 
i=0i<points.lengthi++){
            if (!
points[i]) continue;
            var 
point points[i];
            var 
tmpx point.x;
            var 
tmpy point.y;
            if (
point.weight) {
                
point.+= (point.x-point.px)*.99+(point.ax*dt*dt);
                
point.+= (point.y-point.py)*.99+(point.ay*dt*dt);
            }
            
point.Math.max(Math.min(point.x,canvas.width),0);
            
point.Math.max(Math.min(point.y,canvas.height),0);
            
point.px tmpx;
            
point.py tmpy;
            
shapes[k].cmx += point.x;
            
shapes[k].cmy += point.y;
        }
        
shapes[k].cmx /= points.length;
        
shapes[k].cmy /= points.length;
    }
}
function 
draw(){
    
ctx.strokeStyle "black";
    
ctx.fillStyle "black";
    
ctx.beginPath();
    for (var 
k=0k<shapes.lengthk++){
        var 
points shapes[k].pointsconstrs shapes[k].constrs;
        for (var 
i=0i<constrs.lengthi++){
                if (!
constrs[i] || !constrs[i].edge || !points[constrs[i].i] || !points[constrs[i].j]) continue;
                var 
point1 points[constrs[i].i],point2 points[constrs[i].j];
                
ctx.moveTo(point1.x,point1.y);
                
ctx.lineTo(point2.x,point2.y);
        }
        
ctx.fillRect(shapes[k].cmx-4,shapes[k].cmy-4,8,8);
    }
    
ctx.stroke();
    
}
function 
main(){
    
ctx.fillStyle="#fff";
    
ctx.fillRect(0,0,800,600);
    
updateForces();
    for (var 
i=0i<settings.physics_iterationsi++) updatePhysics(.016);
    
draw();
    var 
time = + new Date;
    
dt = (time lastTick)/1000;
    
lastTick time;
    
requestAnimationFrame(main);
}
main();
setInterval(function(){out.innerHTML="FPS: "+Math.floor(1/dt);},1000);
</script>
</body></html> 
__________________
Сайт: http://iexpo.ml

Последний раз редактировалось RegIon, 01.07.2014 в 12:11.
(Offline)
 
Ответить с цитированием
Старый 01.07.2014, 11:36   #14
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: 2D вращение

Я вообще не оптимизировал код. В идеале, нужно сразу проверять по Bounding box'ам, а уже потом делать проверку по SAT.
Очень вряд ли, что это были опечатки. X и Y меняются местами, когда нужен вектор, перпендикулярный данному.
Сегодня выложу демку с читабельным кодом, возможно удастся пофиксить кривости при нахождении одного тела на другом.
(Offline)
 
Ответить с цитированием
Старый 01.07.2014, 12:09   #15
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: 2D вращение

points2[t].x+=dx/2+rx;
points2[t].y+=dy/2+rx;

не уверен что так должно быть
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 14:15.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com