2010-12-15 56 views
2

我尝试显示一些免费扑克游戏(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 
    } 
} 

但它是不正确的平衡和不好看。

增加:在余弦和窦可以比-1大于1且小于因为如果椭圆是由定义的表可以是椭圆形

+0

考虑使用Flash进行此操作。 Flash的编程语言(称为ActionScript)相对容易学习。我的意思是设法在没有任何经验的情况下,在我的单项课程中取得95%的成绩。我说使用AS的原因是因为使用JS打开应用程序到很多黑客。我的意思是,例如,您可以在当前页面的URL中键入JS以改变您当前所在的页面,或将其关闭或查看源代码。用AS他们不能这样做。他们需要的只是安装Flash。他们要么能够很容易地破解它,要么根本不能玩。 – ClarkeyBoy 2010-12-15 16:43:13

+0

@ClarkeyBoy:我知道actionscript是一种更好的三角函数工作方式,但我真的想用纯HTML/javascript来制作这个游戏,它是控制每一个动作的python服务器,没有可能的黑客,javascript只是显示游戏元素 – Dalou 2010-12-15 16:49:27

+0

好的只要它的安全应该没有问题。只是想我会提出我的观点,让你考虑一切。 – ClarkeyBoy 2010-12-15 16:55:11

回答

1

{A * COS(X)中,b *的sin(x)} ,切线是{-a * sin(x),b * cos(x)}。使用将椭圆轴与桌子周围的角度的正弦/余弦组合的定义不允许您轻松提取。此外,将它称为数量sin/cos似乎是一个糟糕的主意,因为它们通过它们的数学定义被限制在域-1到+1之间...

+0

谢谢你,我会尝试使用椭圆定义。任何有关平衡的想法? – Dalou 2010-12-15 19:21:57

+0

不确定你的意思是平衡的,也许你是指该切线的方程:{a * cos(x),b * cos(x)} + d * { - a * sin(x),b * cos x)}其中d是距离椭圆上您正在考虑的点的距离的参数... – SEngstrom 2010-12-15 20:34:05

+0

正切,我的意思是平衡的,一个人和有序的芯片重新分区 – Dalou 2010-12-16 10:16:49

0

我想我解决了方程SEngstrom。 所有芯片都对齐在正切线上。你可以在这里看到: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 /罪是不错,但在这里,距离之间的每个单栈由椭圆系数放大(I * 20 *罪* 一个

0

我试图解决方案有点盲目,我写道:(似乎工作)

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):

alt text

0

想想这样说:对于第二个任期(左,上)在代码中找到堆栈的中心。为了你想沿切线添加堆栈。由于您的堆栈由像素宽度定义,因此要添加到中心点的项的形式可以具有方便的形式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)。某种修正系数大于1。它对b不对称,但对于b = 1,它将为零...