카드를 골고루 펴려면 어떻게해야합니까?


20

카드 놀이 (너비와 높이가있는 직사각형 이미지) 세트를 감안할 때 실제로 카드를 손에 쥐는 것처럼 '팬'패턴으로 나타나도록 각 카드를 회전하고 배치하는 방법은 무엇입니까? 이를 위해 어떤 수학이 필요합니까?

최신 정보

다음은 JavaScript로 브라우저를 구현 한 최종 단계입니다. https://cosmicrealms.com/blog/2013/03/16/hand-of-cards/http://jsfiddle.net/tyyvk/108/


9
선생님, 손에 에이스가 너무 많은 것 같습니다. 테이블에서 물러나십시오.
Tomas Andrle

이후 버전의 MooTools를 사용하려면 바이올린을 업데이트해야합니다.
tomdemuyt

답변:


30

이론

이것을 구현하는 플랫폼을 지정하지 않았으므로 언어에 관계없이 알고리즘에 대한 설명을 제공합니다.

  1. 먼저 동일한 초기 위치를 지정하여 모든 카드 를 서로 겹쳐 놓습니다.
  2. 그런 다음 각 카드마다 회전을 적용하십시오 (보통 하단 모서리 중 하나를 중심으로 하지만이 원점을 이동하면 팬의 모양을 조정할 수 있습니다).
  3. 카드 수와 퍼지는 양에 따라 각 호출 사이의 회전 각도를 증가시킵니다 .

그건 회전이 카드의 하단 모서리 중 하나 중심으로 (또는 코너 근처) 그것을보고에서 분명해야합니다 :

여기에 이미지 설명을 입력하십시오


이행

이를 구현하는 방법은 플랫폼에 따라 다릅니다. XNA에서는 원점 매개 변수를 사용 SpriteBatch.Draw하여 회전 중심을 간단히 변경할 수 있습니다.

다음 코드를 사용하여 얻은 내용은 다음과 같습니다 (원점을 약간 조정하면 모양이 좋아 보입니다. 기본적으로 원점은 오른쪽 모서리 근처에서 시작하여 왼쪽 모서리 근처에서 끝납니다).

int cards = 20;
float range = MathHelper.ToRadians(90);
float initialAngle = MathHelper.ToRadians(-45);
float increment = range / cards;
Vector2 leftCorner = new Vector2(0, texture.Height * 0.9f);
Vector2 rightCorner = new Vector2(texture.Width, texture.Height * 0.9f);
Vector2 fanPosition = new Vector2(400, 300);
spriteBatch.Begin();
for (float angle = 0; angle < range; angle+=increment)
{
    float cardAngle = initialAngle + angle;
    Vector2 cardOrigin = Vector2.Lerp(rightCorner, leftCorner, angle / range);
    spriteBatch.Draw(texture, fanPosition, null, Color.White, cardAngle, cardOrigin, 1f, SpriteEffects.None, 0f);
}
spriteBatch.End();

그리고 결과 :

여기에 이미지 설명을 입력하십시오


7
다른 회전 중심을 사용하여 모양을 조정할 수 있다고 덧붙이고 싶습니다. 작은 호를 스팬하려면 카드 아래에있는 회전 점을 사용해야합니다.
aaaaaaaaaaaa

@eBusiness 맞습니다. 추가하겠습니다.
David Gouveia

고마워 데이빗! JavaScript로 표시 한 코드를 여기에 구현했습니다. jsfiddle.net/tyyvk/7
Sembiance
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.