先上效果图

效果图.png
思路:用到三角形内角和为180°,余弦定理,正弦定理等与三角形相关的属性。其实解决卡牌显示就是一道数学几何题。
几何图如图

几何图.png
求得∠ADG的角度即为每张牌应该旋转的角度值△α , x增量△x,y增量△y
已知AB,DE,r = AD = CD = BD = DG
r² = DH² + GH²
r² = AE² + ED²
tan∠ADC = AE / ED // AE已知,DE已知 , 求出 α = ∠ADC
可求出r = ED / cos∠ADC // tan∠ADC已知,求出r
已知有x张牌
△α = α / x
β = ∠GDH = △α*( i - 1 ) - α //这里要分正负,参考正弦函数图
求出△x增量为 r*sinβ
求出△y增量为 r*cosβ - ED
核心代码如下:
public void SortCard()
{
int num = cardItem.Count;
beYondNum = num;
Debug.Log("列表长度为:" + num);
float width = 2 * Screen.width / (3 * maxWidNum) * num; //张开宽度 , 屏幕分辨率的一半/maxWidNum张牌
if (num >= maxWidNum)
{
width = Screen.width / 2;
}
float h0 = height;
float angle = 0;
float deaAngle = 0;
if (num > 1)
{
angle = Mathf.Atan((width / 2) / h0) * (180 / Mathf.PI);
deaAngle = 2 * angle / (num - 1);
}
float r = Mathf.Abs(h0 / (Mathf.Cos((Mathf.PI / 180) * angle)));
for (int i =0; i < num; i++)
{
float disWidth = r * Mathf.Sin((Mathf.PI / 180) * (deaAngle * i - angle));
cardItem[i].rectTransform.eulerAngles = new Vector3(0, 0, angle - deaAngle * i);
float h = 0;
h = r * Mathf.Cos((Mathf.PI / 180) * (deaAngle * i - angle)) - h0;
cardItem[i].rectTransform.localPosition = new Vector3(disWidth, h, 0);
}
}
注:在Unity中需要注意弧度与角度的转化
网友评论