Набирайте очки по касательной окружности (или овала) и балансируйте покерные фишки на

Я пытаюсь отобразить некоторые фишки для бесплатной игры в покер (клиент HTML/Javascript, сервер python). Вокруг центра стола есть места. для каждого места я знаю косинус, синус, радиус (расстояние от центра стола) и массив значений/количеств фишек.

Я пытаюсь отобразить каждую стружку, выровненную и сбалансированную по касательной в точке опоры.

На изображении: (я не могу создать изображение, поэтому: http://i.stack.imgur.com/a4Obw.png )

на данный момент я написал этот код:

function balanced_stack( chips, cos, sin, radius ) 
{
    var html = ''

    // I receive a chips array like [ [ 100, 8 ], [ 200, 10 ], [ 500, 7 ] ]
    // so 8 chips of 100$, 10 chips of 200$ .. etc
    for(var i in chips) 
    {
        var value = chips[i][0]; // the token value
        var count = chips[i][1]; // the token count

        var m = 0; // margin for a single stack
        var left = i * 20 * sin + cos * radius;
        var top = -i * 20 * cos + sin * radius;

        for( var j=1; j<= count; j++ ) 
        {       
            html += '<img style="z-index:'+( parseInt(top) + 9999)+'; left:'+left+'px; top: '+top+'px; margin-top:'+( -2*m )+'px;" \
                            src="/images/chips/'+value+'.png" />'
            m ++;
        }

        return html
    }
}

но он не сбалансирован и некрасив.

add : косинус и синус могут быть больше 1 и меньше -1, потому что таблица может быть овальной


person Dalou    schedule 15.12.2010    source источник
comment
Рассмотрите возможность использования Flash для этого. Язык программирования для Flash, называемый ActionScript, относительно прост в освоении. Я имею в виду, что мне удалось получить 95% курсовой работы в университете без какого-либо предварительного опыта. Причина, по которой я говорю использовать AS, заключается в том, что использование JS открывает приложение для множества взломов. Я имею в виду, например, вы можете ввести JS в URL-адрес текущей страницы, чтобы изменить страницу, на которой вы сейчас находитесь, или отключить ее, или просмотреть исходный код. С AS они не могут этого сделать. Все, что им нужно, это установить Flash. Они либо могут играть в нее, не имея возможности взломать ее так легко, либо не могут играть вообще.   -  person ClarkeyBoy    schedule 15.12.2010
comment
@ClarkeyBoy: я знаю, что actionscript — лучший способ работать с тригонометрией, но я действительно хочу сделать эту игру на чистом HTML/javascript, и это сервер python, который контролирует все действия, никакого возможного взлома, javascript просто отображает элементы игры   -  person Dalou    schedule 15.12.2010
comment
хорошо, пока это безопасно, проблем не должно быть. Просто подумал, что я изложил свою точку зрения, чтобы вы подумали, вот и все.   -  person ClarkeyBoy    schedule 15.12.2010
comment
@ClarkeyBoy: я работаю над другим проектом, онлайн-игрой 2D FPS, в которой используется скрипт действий :) конечно, это довольно круто для триго и безопасности, и мы можем работать с сокетами ^^   -  person Dalou    schedule 15.12.2010


Ответы (4)


Если эллипс определяется как {a*cos(x),b*sin(x)}, тангенс равен {-a*sin(x),b*cos(x)}. Использование определения, которое объединяет оси эллипса с синусом/косинусом угла вокруг стола, не позволяет вам легко извлечь это. Кроме того, кажется плохой идеей называть эту величину sin/cos, поскольку они ограничены областью от -1 до +1 по их математическому определению...

person SEngstrom    schedule 15.12.2010
comment
спасибо, я попробую с определением эллипса. Есть идеи по поводу балансировки? - person Dalou; 15.12.2010
comment
не совсем уверен, что вы подразумеваете под сбалансированным, возможно, вы имеете в виду уравнение для этого тангенса: {acos(x),bcos(x)}+d*{-asin(x ),bcos(x)}, где d — параметр расстояния от точки на эллипсе, которую вы рассматриваете... - person SEngstrom; 15.12.2010
comment
по касательной все в порядке, я имею в виду сбалансированный, человеческий и упорядоченный передел чипов - person Dalou; 16.12.2010

Кажется, я решил задачу касательной с помощью уравнения Сенгстрема. Все чипы выровнены по правой касательной. Вы можете увидеть здесь: alt text

function( chips, cos, sin, radius ) 
{
    var html = ''

    // Considering the equation for the tangent {a*cos(x),b*cos(x)}+d*{-a*sin(x),b*cos(x)}
    var a = 1.6; // x coefficient for the ellipse
    var b = 1; // y coefficient for the ellipse


    // I receive a chips array like [ [ 100, 8 ], [ 200, 10 ], [ 500, 7 ] ], so 8 chips of 100$, 10 chips of 200$ .. etc
    for(var i in chips) 
    {
        var value = chips[i][0]; // the token value
        var count = chips[i][1]; // the token count

        var m = 0; // margin for a single stack

        var left = i * 20 * sin * a + cos * radius * a; 
        var top = -i * 20 * cos * b + sin * radius * b;

        for( var j=1; j<= count; j++ ) 
        {       
            html += '<img style="z-index:'+( parseInt(top) + 9999)+'; left:'+left+'px; top: '+top+'px; margin-top:'+( -2*m )+'px;" \
                            class="chip chip_'+value+'" src="/images/chips/'+CHIPS.COLORS[ value ]+'.png" />'
            m ++;
        }       
    }
    return html
}

Но, как вы можете видеть, между каждым отдельным стеком есть пустое пространство, потому что чип имеет ширину 20 пикселей, с обычным cos/sin это нормально, но здесь расстояние между каждым отдельным стеком увеличивается на коэффициент эллипса (i * 20 * грех * а)

person Dalou    schedule 16.12.2010

Подумайте об этом так: второй термин для (left,top) в вашем коде находит центр стека. К этому вы хотите добавить стеки по касательной. Поскольку ваши стеки определяются шириной в пикселях, форма члена, добавляемого к центральной точке, может иметь удобную форму i*pxwidth*{nx,ny}, где nx и ny — компоненты (x,y) нормализованный вектор касательной, «i» — целое число, подсчитывающее отдельные стеки, а pxwidth — желаемая ширина в пикселях. Если sin и cos являются истинными синусами/косинусами, (-sin,cos) уже является нормализованным вектором, поскольку sin^2+cos^2=1.

Чего я не понимаю в вашем коде, так это ((20*a)-20), что равно 20*(a-1). Какой-то поправочный коэффициент для a>1. Он несимметричен для b, но тогда он был бы нулевым для b=1...

person SEngstrom    schedule 16.12.2010

Я попробовал решения немного вслепую и написал: (кажется, это работает)

var left = (i * ((20*a) - 20) * sin * a) + (cos * radius * a); 
var top = -(i * ((20*a) - 20) * cos * b) + (sin * radius * b);

Можете ли вы объяснить мне, почему это работает? Я математически слаб.

с 20 фальшивыми игроками за столом с эллипсом (a=1,6, b=1):

альтернативный текст

person Dalou    schedule 16.12.2010