2022-07-26 20:05:39 -04:00
|
|
|
import "scaling.asy" as scaling;
|
2022-07-27 06:00:47 -04:00
|
|
|
import "suits.asy" as suits;
|
2022-07-26 20:05:39 -04:00
|
|
|
import "numerals.asy" as numerals_paths;
|
2022-07-27 06:00:47 -04:00
|
|
|
import "nobles.asy" as nobles;
|
|
|
|
import "faces.asy" as general_faces;
|
2022-07-26 20:05:39 -04:00
|
|
|
|
2022-07-27 02:55:21 -04:00
|
|
|
real corner_radius = width/12;
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
path corner = arc(((width/2 - corner_radius), (height/2 - corner_radius)), corner_radius, 0, 90);
|
|
|
|
|
|
|
|
path card = corner--reverse(reflect((0,0), (0,1))*corner)--rotate(180)*corner--reverse(reflect((0,0), (1,0))*corner)--cycle;
|
|
|
|
|
|
|
|
real scpx = 0.2;
|
2022-07-28 18:14:15 -04:00
|
|
|
real scpy = 0.325;
|
2022-07-26 20:05:39 -04:00
|
|
|
|
2022-07-27 02:55:21 -04:00
|
|
|
transform placements[][] = {
|
2022-07-26 20:05:39 -04:00
|
|
|
// 0
|
|
|
|
{},
|
|
|
|
|
|
|
|
// 1
|
2022-07-27 02:55:21 -04:00
|
|
|
{ identity },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// 2
|
2022-07-27 02:55:21 -04:00
|
|
|
{ shift(0,height*scpy), shift(0,-height*scpy)*rotate(180) },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// 3
|
2022-07-27 02:55:21 -04:00
|
|
|
{ identity, shift(0,height*scpy), shift(0,-height*scpy)*rotate(180) },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// 4
|
2022-07-27 02:55:21 -04:00
|
|
|
{ shift(width*scpx,height*scpy), shift(width*scpx,-height*scpy)*rotate(180), shift(-width*scpx,height*scpy), shift(-width*scpx,-height*scpy)*rotate(180) },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// 5
|
2022-07-27 02:55:21 -04:00
|
|
|
{ identity, shift(width*scpx,height*scpy), shift(width*scpx,-height*scpy)*rotate(180), shift(-width*scpx,height*scpy), shift(-width*scpx,-height*scpy)*rotate(180) },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// 6
|
2022-07-27 02:55:21 -04:00
|
|
|
{ shift(width*scpx,0), shift(-width*scpx,0), shift(width*scpx,height*scpy), shift(width*scpx,-height*scpy)*rotate(180), shift(-width*scpx,height*scpy), shift(-width*scpx,-height*scpy)*rotate(180) },
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
// The four face cards
|
|
|
|
{}, {}, {}, {},
|
|
|
|
};
|
|
|
|
|
2022-07-28 18:14:15 -04:00
|
|
|
real scale_factor = 0.175;
|
2022-07-27 02:55:21 -04:00
|
|
|
real one_scale_factor = 0.4;
|
2022-07-26 20:05:39 -04:00
|
|
|
|
2022-07-28 18:14:15 -04:00
|
|
|
real numeral_scale_factor = 0.125;
|
|
|
|
pair numeral_pos = (-width*0.4, height*0.4);
|
|
|
|
real indicator_scale_factor = 0.085;
|
|
|
|
pair indicator_pos = (-width*0.4, height*0.275);
|
2022-07-26 20:05:39 -04:00
|
|
|
|
2022-07-27 02:55:21 -04:00
|
|
|
// note: if you bump this depth value to 4, you'll need to set
|
|
|
|
// buf_size=5000000 so latex doesn't choke
|
|
|
|
path[] recursive_card(int value, int suit, int depth=4, bool outermost=true) {
|
2022-07-26 20:05:39 -04:00
|
|
|
path result[];
|
|
|
|
if (!outermost) {
|
|
|
|
result.push(card);
|
|
|
|
}
|
|
|
|
path[] suit_icon;
|
|
|
|
if (suit == CARDS) {
|
|
|
|
if (depth == 0) { return result; }
|
|
|
|
suit_icon = recursive_card(value, suit, depth - 1, false);
|
|
|
|
} else {
|
|
|
|
suit_icon = icons[suit];
|
|
|
|
}
|
|
|
|
path[] indicator = shift(indicator_pos)*scale(indicator_scale_factor)*suit_icon;
|
2022-07-27 06:00:47 -04:00
|
|
|
path[] numeral;
|
|
|
|
path[] face;
|
|
|
|
if (value == NOBLE) {
|
|
|
|
numeral = noble_letters[suit];
|
|
|
|
face = noble_faces[suit];
|
|
|
|
} else {
|
|
|
|
numeral = numerals[value];
|
|
|
|
face = faces[value];
|
|
|
|
}
|
|
|
|
numeral = shift(numeral_pos)*scale(numeral_scale_factor)*numeral;
|
|
|
|
result = result^^face^^indicator^^(rotate(180)*indicator)^^numeral^^(rotate(180)*numeral);
|
2022-07-26 20:05:39 -04:00
|
|
|
|
|
|
|
real current_scale_factor = scale_factor;
|
|
|
|
if (value == 1) {
|
|
|
|
current_scale_factor = one_scale_factor;
|
|
|
|
}
|
|
|
|
for(int i = 0; i < placements[value].length; ++i) {
|
2022-07-27 02:55:21 -04:00
|
|
|
result = result^^(placements[value][i]*scale(current_scale_factor)*suit_icon);
|
2022-07-26 20:05:39 -04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|