|
template<typename Output> |
|
static void generate_hearts( |
|
coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y, Output &output) |
|
{ |
|
size_t xwidth = max_x - min_x; |
|
size_t ywidth = max_y - min_y; |
|
|
|
//We are setting these variables to the width of one heart block (which is a half upside down heart, |
|
//a full right-side up heart, and a half upside down heart) and then slightly larger than the height |
|
//of one heart block. |
|
float object_width = 12.4334; |
|
float object_height = 13.8993; |
|
|
|
// Our little block for for the heart is 12.4334 by 13.7993, so let's figure out how many rows and how many |
|
// columns and rows of hearts we are drawing. |
|
int num_cols = xwidth / object_width; |
|
|
|
//One extra column for excess |
|
num_cols++; |
|
|
|
int num_rows = ywidth / object_height; |
|
|
|
//One extra rows for excess |
|
num_rows++; |
|
|
|
|
|
//Now we are looping through all the rows of hearts and for each row, we'll go through and draw the hearts. |
|
//We will alternate between drawing the hearts right to left and then left to right. |
|
|
|
for (int i = 0; i < num_rows; i++) { |
|
// Mod is the remainder after division. If the row mod 2 is 0, let's go forwards. Otherwise go backwards |
|
bool forward = ((i % 2) == 0); |
|
|
|
if (forward) { |
|
for (int j = 0; j < num_cols; j++) { |
|
|
|
//These starting point adjustments take into account where this heart should be |
|
//positioned |
|
float startingx = min_x + (j * object_width); |
|
float startingy = min_y + (i * object_height); |
|
|
|
//Drawing the points for one heart block |
|
output.add_point({startingx + 0.0, startingy + 11.698871612548828}); |
|
output.add_point({startingx + 0.48252344131469727, startingy + 12.472164154052734}); |
|
output.add_point({startingx + 1.0282902717590332, startingy + 13.051066398620605}); |
|
output.add_point({startingx + 1.618091106414795, startingy + 13.453367233276367}); |
|
output.add_point({startingx + 2.232719659805298, startingy + 13.696859359741211}); |
|
output.add_point({startingx + 2.8529675006866455, startingy + 13.799332618713379}); |
|
output.add_point({startingx + 3.4596261978149414, startingy + 13.778580665588379}); |
|
output.add_point({startingx + 4.033487796783447, startingy + 13.652393341064453}); |
|
output.add_point({startingx + 4.555344581604004, startingy + 13.438562393188477}); |
|
output.add_point({startingx + 5.005988121032715, startingy + 13.154878616333008}); |
|
output.add_point({startingx + 5.3662109375, startingy + 12.819133758544922}); |
|
output.add_point({startingx + 5.616804599761963, startingy + 12.449119567871094}); |
|
output.add_point({startingx + 5.738561630249023, startingy + 12.062625885009766}); |
|
output.add_point({startingx + 5.783353328704834, startingy + 11.34355640411377}); |
|
output.add_point({startingx + 5.7755842208862305, startingy + 10.738739967346191}); |
|
output.add_point({startingx + 5.720309734344482, startingy + 10.234014511108398}); |
|
output.add_point({startingx + 5.622584342956543, startingy + 9.815216064453125}); |
|
output.add_point({startingx + 5.487462997436523, startingy + 9.468185424804688}); |
|
output.add_point({startingx + 5.320000648498535, startingy + 9.17875862121582}); |
|
output.add_point({startingx + 5.125252723693848, startingy + 8.932771682739258}); |
|
output.add_point({startingx + 4.908273696899414, startingy + 8.716064453125}); |
|
output.add_point({startingx + 4.674119472503662, startingy + 8.514473915100098}); |
|
output.add_point({startingx + 4.427844047546387, startingy + 8.313838005065918}); |
|
output.add_point({startingx + 4.174503326416016, startingy + 8.099992752075195}); |
|
output.add_point({startingx + 3.919152021408081, startingy + 7.858778953552246}); |
|
output.add_point({startingx + 3.5660459995269775, startingy + 7.476938247680664}); |
|
output.add_point({startingx + 3.183459758758545, startingy + 7.095097064971924}); |
|
output.add_point({startingx + 2.7671940326690674, startingy + 6.713256359100342}); |
|
output.add_point({startingx + 2.297572612762451, startingy + 6.331415176391602}); |
|
output.add_point({startingx + 2.0422210693359375, startingy + 6.090198993682861}); |
|
output.add_point({startingx + 1.7888798713684082, startingy + 5.876355171203613}); |
|
output.add_point({startingx + 1.542604923248291, startingy + 5.675718784332275}); |
|
output.add_point({startingx + 1.308450698852539, startingy + 5.474128246307373}); |
|
output.add_point({startingx + 1.0914721488952637, startingy + 5.257421493530273}); |
|
output.add_point({startingx + 0.8967242240905762, startingy + 5.011435508728027}); |
|
output.add_point({startingx + 0.7292623519897461, startingy + 4.72200870513916}); |
|
output.add_point({startingx + 0.5941405296325684, startingy + 4.374977111816406}); |
|
output.add_point({startingx + 0.4964151382446289, startingy + 3.9561800956726074}); |
|
output.add_point({startingx + 0.44114065170288086, startingy + 3.4514541625976562}); |
|
output.add_point({startingx + 0.43337106704711914, startingy + 2.846637725830078}); |
|
output.add_point({startingx + 0.4781632423400879, startingy + 2.1275672912597656}); |
|
output.add_point({startingx + 0.5999202728271484, startingy + 1.7410764694213867}); |
|
output.add_point({startingx + 0.8505139350891113, startingy + 1.3710613250732422}); |
|
output.add_point({startingx + 1.2107362747192383, startingy + 1.0353174209594727}); |
|
output.add_point({startingx + 1.6613798141479492, startingy + 0.7516336441040039}); |
|
output.add_point({startingx + 2.183236598968506, startingy + 0.5378017425537109}); |
|
output.add_point({startingx + 2.7570979595184326, startingy + 0.41161346435546875}); |
|
output.add_point({startingx + 3.3637564182281494, startingy + 0.39086151123046875}); |
|
output.add_point({startingx + 3.984004020690918, startingy + 0.4933347702026367}); |
|
output.add_point({startingx + 4.5986328125, startingy + 0.7368268966674805}); |
|
output.add_point({startingx + 5.18843412399292, startingy + 1.1391286849975586}); |
|
output.add_point({startingx + 5.734200954437256, startingy + 1.7180299758911133}); |
|
output.add_point({startingx + 6.216724395751953, startingy + 2.491321563720703}); |
|
output.add_point({startingx + 6.69924783706665, startingy + 1.7180299758911133}); |
|
output.add_point({startingx + 7.245014667510986, startingy + 1.1391286849975586}); |
|
output.add_point({startingx + 7.834815979003906, startingy + 0.7368268966674805}); |
|
output.add_point({startingx + 8.449444770812988, startingy + 0.4933347702026367}); |
|
output.add_point({startingx + 9.069692611694336, startingy + 0.39086151123046875}); |
|
output.add_point({startingx + 9.676350593566895, startingy + 0.41161346435546875}); |
|
output.add_point({startingx + 10.250211715698242, startingy + 0.5378017425537109}); |
|
output.add_point({startingx + 10.772068977355957, startingy + 0.7516336441040039}); |
|
output.add_point({startingx + 11.222712516784668, startingy + 1.0353174209594727}); |
|
output.add_point({startingx + 11.582935333251953, startingy + 1.3710613250732422}); |
|
output.add_point({startingx + 11.833528518676758, startingy + 1.7410764694213867}); |
|
output.add_point({startingx + 11.955286026000977, startingy + 2.1275672912597656}); |
|
output.add_point({startingx + 12.000078201293945, startingy + 2.846637725830078}); |
|
output.add_point({startingx + 11.992307662963867, startingy + 3.4514541625976562}); |
|
output.add_point({startingx + 11.937033653259277, startingy + 3.9561800956726074}); |
|
output.add_point({startingx + 11.83930778503418, startingy + 4.374977111816406}); |
|
output.add_point({startingx + 11.70418643951416, startingy + 4.72200870513916}); |
|
output.add_point({startingx + 11.536724090576172, startingy + 5.011435508728027}); |
|
output.add_point({startingx + 11.341976165771484, startingy + 5.257421493530273}); |
|
output.add_point({startingx + 11.124998092651367, startingy + 5.474128246307373}); |
|
output.add_point({startingx + 10.890844345092773, startingy + 5.675718784332275}); |
|
output.add_point({startingx + 10.644569396972656, startingy + 5.876355171203613}); |
|
output.add_point({startingx + 10.391227722167969, startingy + 6.090198993682861}); |
|
output.add_point({startingx + 10.135875701904297, startingy + 6.331415176391602}); |
|
output.add_point({startingx + 9.666254997253418, startingy + 6.713256359100342}); |
|
output.add_point({startingx + 9.249988555908203, startingy + 7.095097064971924}); |
|
output.add_point({startingx + 8.867403030395508, startingy + 7.476938247680664}); |
|
output.add_point({startingx + 8.514296531677246, startingy + 7.858778953552246}); |
|
output.add_point({startingx + 8.25894546508789, startingy + 8.099992752075195}); |
|
output.add_point({startingx + 8.00560474395752, startingy + 8.313838005065918}); |
|
output.add_point({startingx + 7.759329319000244, startingy + 8.514473915100098}); |
|
output.add_point({startingx + 7.525175094604492, startingy + 8.716064453125}); |
|
output.add_point({startingx + 7.308196067810059, startingy + 8.932771682739258}); |
|
output.add_point({startingx + 7.113448143005371, startingy + 9.17875862121582}); |
|
output.add_point({startingx + 6.945985794067383, startingy + 9.468185424804688}); |
|
output.add_point({startingx + 6.810864448547363, startingy + 9.815216064453125}); |
|
output.add_point({startingx + 6.713139057159424, startingy + 10.234014511108398}); |
|
output.add_point({startingx + 6.657864570617676, startingy + 10.738739967346191}); |
|
output.add_point({startingx + 6.650095462799072, startingy + 11.34355640411377}); |
|
output.add_point({startingx + 6.694887161254883, startingy + 12.062625885009766}); |
|
output.add_point({startingx + 6.816644191741943, startingy + 12.449119567871094}); |
|
output.add_point({startingx + 7.067237854003906, startingy + 12.819133758544922}); |
|
output.add_point({startingx + 7.427460670471191, startingy + 13.154878616333008}); |
|
output.add_point({startingx + 7.878104209899902, startingy + 13.438562393188477}); |
|
output.add_point({startingx + 8.399961471557617, startingy + 13.652393341064453}); |
|
output.add_point({startingx + 8.973822593688965, startingy + 13.778580665588379}); |
|
output.add_point({startingx + 9.58048152923584, startingy + 13.799332618713379}); |
|
output.add_point({startingx + 10.200729370117188, startingy + 13.696859359741211}); |
|
output.add_point({startingx + 10.815357208251953, startingy + 13.453367233276367}); |
|
output.add_point({startingx + 11.405158996582031, startingy + 13.051066398620605}); |
|
output.add_point({startingx + 11.950925827026367, startingy + 12.472164154052734}); |
|
output.add_point({startingx + 12.433448791503906, startingy + 11.698871612548828}); |
|
} |
|
} else { |
|
//Go backwards and draw the hearts from right to left! |
|
for (int j = num_cols - 1; j >= 0; j--) { |
|
|
|
float startingx = min_x + (j * object_width); |
|
float startingy = min_y + (i * object_height); |
|
|
|
output.add_point({startingx + 12.433448791503906, startingy + 11.698871612548828}); |
|
output.add_point({startingx + 11.950925827026367, startingy + 12.472164154052734}); |
|
output.add_point({startingx + 11.405158996582031, startingy + 13.051066398620605}); |
|
output.add_point({startingx + 10.815357208251953, startingy + 13.453367233276367}); |
|
output.add_point({startingx + 10.200729370117188, startingy + 13.696859359741211}); |
|
output.add_point({startingx + 9.58048152923584, startingy + 13.799332618713379}); |
|
output.add_point({startingx + 8.973822593688965, startingy + 13.778580665588379}); |
|
output.add_point({startingx + 8.399961471557617, startingy + 13.652393341064453}); |
|
output.add_point({startingx + 7.878104209899902, startingy + 13.438562393188477}); |
|
output.add_point({startingx + 7.427460670471191, startingy + 13.154878616333008}); |
|
output.add_point({startingx + 7.067237854003906, startingy + 12.819133758544922}); |
|
output.add_point({startingx + 6.816644191741943, startingy + 12.449119567871094}); |
|
output.add_point({startingx + 6.694887161254883, startingy + 12.062625885009766}); |
|
output.add_point({startingx + 6.650095462799072, startingy + 11.34355640411377}); |
|
output.add_point({startingx + 6.657864570617676, startingy + 10.738739967346191}); |
|
output.add_point({startingx + 6.713139057159424, startingy + 10.234014511108398}); |
|
output.add_point({startingx + 6.810864448547363, startingy + 9.815216064453125}); |
|
output.add_point({startingx + 6.945985794067383, startingy + 9.468185424804688}); |
|
output.add_point({startingx + 7.113448143005371, startingy + 9.17875862121582}); |
|
output.add_point({startingx + 7.308196067810059, startingy + 8.932771682739258}); |
|
output.add_point({startingx + 7.525175094604492, startingy + 8.716064453125}); |
|
output.add_point({startingx + 7.759329319000244, startingy + 8.514473915100098}); |
|
output.add_point({startingx + 8.00560474395752, startingy + 8.313838005065918}); |
|
output.add_point({startingx + 8.25894546508789, startingy + 8.099992752075195}); |
|
output.add_point({startingx + 8.514296531677246, startingy + 7.858778953552246}); |
|
output.add_point({startingx + 8.867403030395508, startingy + 7.476938247680664}); |
|
output.add_point({startingx + 9.249988555908203, startingy + 7.095097064971924}); |
|
output.add_point({startingx + 9.666254997253418, startingy + 6.713256359100342}); |
|
output.add_point({startingx + 10.135875701904297, startingy + 6.331415176391602}); |
|
output.add_point({startingx + 10.391227722167969, startingy + 6.090198993682861}); |
|
output.add_point({startingx + 10.644569396972656, startingy + 5.876355171203613}); |
|
output.add_point({startingx + 10.890844345092773, startingy + 5.675718784332275}); |
|
output.add_point({startingx + 11.124998092651367, startingy + 5.474128246307373}); |
|
output.add_point({startingx + 11.341976165771484, startingy + 5.257421493530273}); |
|
output.add_point({startingx + 11.536724090576172, startingy + 5.011435508728027}); |
|
output.add_point({startingx + 11.70418643951416, startingy + 4.72200870513916}); |
|
output.add_point({startingx + 11.83930778503418, startingy + 4.374977111816406}); |
|
output.add_point({startingx + 11.937033653259277, startingy + 3.9561800956726074}); |
|
output.add_point({startingx + 11.992307662963867, startingy + 3.4514541625976562}); |
|
output.add_point({startingx + 12.000078201293945, startingy + 2.846637725830078}); |
|
output.add_point({startingx + 11.955286026000977, startingy + 2.1275672912597656}); |
|
output.add_point({startingx + 11.833528518676758, startingy + 1.7410764694213867}); |
|
output.add_point({startingx + 11.582935333251953, startingy + 1.3710613250732422}); |
|
output.add_point({startingx + 11.222712516784668, startingy + 1.0353174209594727}); |
|
output.add_point({startingx + 10.772068977355957, startingy + 0.7516336441040039}); |
|
output.add_point({startingx + 10.250211715698242, startingy + 0.5378017425537109}); |
|
output.add_point({startingx + 9.676350593566895, startingy + 0.41161346435546875}); |
|
output.add_point({startingx + 9.069692611694336, startingy + 0.39086151123046875}); |
|
output.add_point({startingx + 8.449444770812988, startingy + 0.4933347702026367}); |
|
output.add_point({startingx + 7.834815979003906, startingy + 0.7368268966674805}); |
|
output.add_point({startingx + 7.245014667510986, startingy + 1.1391286849975586}); |
|
output.add_point({startingx + 6.69924783706665, startingy + 1.7180299758911133}); |
|
output.add_point({startingx + 6.216724395751953, startingy + 2.491321563720703}); |
|
output.add_point({startingx + 5.734200954437256, startingy + 1.7180299758911133}); |
|
output.add_point({startingx + 5.18843412399292, startingy + 1.1391286849975586}); |
|
output.add_point({startingx + 3.984004020690918, startingy + 0.4933347702026367}); |
|
output.add_point({startingx + 3.3637564182281494, startingy + 0.39086151123046875}); |
|
output.add_point({startingx + 2.7570979595184326, startingy + 0.41161346435546875}); |
|
output.add_point({startingx + 2.183236598968506, startingy + 0.5378017425537109}); |
|
output.add_point({startingx + 1.6613798141479492, startingy + 0.7516336441040039}); |
|
output.add_point({startingx + 1.2107362747192383, startingy + 1.0353174209594727}); |
|
output.add_point({startingx + 0.8505139350891113, startingy + 1.3710613250732422}); |
|
output.add_point({startingx + 0.5999202728271484, startingy + 1.7410764694213867}); |
|
output.add_point({startingx + 0.4781632423400879, startingy + 2.1275672912597656}); |
|
output.add_point({startingx + 0.43337106704711914, startingy + 2.846637725830078}); |
|
output.add_point({startingx + 0.44114065170288086, startingy + 3.4514541625976562}); |
|
output.add_point({startingx + 0.4964151382446289, startingy + 3.9561800956726074}); |
|
output.add_point({startingx + 0.5941405296325684, startingy + 4.374977111816406}); |
|
output.add_point({startingx + 0.7292623519897461, startingy + 4.72200870513916}); |
|
output.add_point({startingx + 0.8967242240905762, startingy + 5.011435508728027}); |
|
output.add_point({startingx + 1.0914721488952637, startingy + 5.257421493530273}); |
|
output.add_point({startingx + 1.308450698852539, startingy + 5.474128246307373}); |
|
output.add_point({startingx + 1.542604923248291, startingy + 5.675718784332275}); |
|
output.add_point({startingx + 1.7888798713684082, startingy + 5.876355171203613}); |
|
output.add_point({startingx + 2.0422210693359375, startingy + 6.090198993682861}); |
|
output.add_point({startingx + 2.297572612762451, startingy + 6.331415176391602}); |
|
output.add_point({startingx + 2.7671940326690674, startingy + 6.713256359100342}); |
|
output.add_point({startingx + 3.183459758758545, startingy + 7.095097064971924}); |
|
output.add_point({startingx + 3.5660459995269775, startingy + 7.476938247680664}); |
|
output.add_point({startingx + 3.919152021408081, startingy + 7.858778953552246}); |
|
output.add_point({startingx + 4.174503326416016, startingy + 8.099992752075195}); |
|
output.add_point({startingx + 4.427844047546387, startingy + 8.313838005065918}); |
|
output.add_point({startingx + 4.674119472503662, startingy + 8.514473915100098}); |
|
output.add_point({startingx + 4.908273696899414, startingy + 8.716064453125}); |
|
output.add_point({startingx + 5.125252723693848, startingy + 8.932771682739258}); |
|
output.add_point({startingx + 5.320000648498535, startingy + 9.17875862121582}); |
|
output.add_point({startingx + 5.487462997436523, startingy + 9.468185424804688}); |
|
output.add_point({startingx + 5.622584342956543, startingy + 9.815216064453125}); |
|
output.add_point({startingx + 5.720309734344482, startingy + 10.234014511108398}); |
|
output.add_point({startingx + 5.7755842208862305, startingy + 10.738739967346191}); |
|
output.add_point({startingx + 5.783353328704834, startingy + 11.34355640411377}); |
|
output.add_point({startingx + 5.738561630249023, startingy + 12.062625885009766}); |
|
output.add_point({startingx + 5.616804599761963, startingy + 12.449119567871094}); |
|
output.add_point({startingx + 5.3662109375, startingy + 12.819133758544922}); |
|
output.add_point({startingx + 5.005988121032715, startingy + 13.154878616333008}); |
|
output.add_point({startingx + 4.555344581604004, startingy + 13.438562393188477}); |
|
output.add_point({startingx + 4.033487796783447, startingy + 13.652393341064453}); |
|
output.add_point({startingx + 3.4596261978149414, startingy + 13.778580665588379}); |
|
output.add_point({startingx + 2.8529675006866455, startingy + 13.799332618713379}); |
|
output.add_point({startingx + 2.232719659805298, startingy + 13.696859359741211}); |
|
output.add_point({startingx + 1.618091106414795, startingy + 13.453367233276367}); |
|
output.add_point({startingx + 1.0282902717590332, startingy + 13.051066398620605}); |
|
output.add_point({startingx + 0.48252344131469727, startingy + 12.472164154052734}); |
|
output.add_point({startingx + 0.0, startingy + 11.698871612548828}); |
|
} |
|
} |
|
} |
|
} |
|
|
|
void FillHearts::generate( |
|
coord_t min_x, |
|
coord_t min_y, |
|
coord_t max_x, |
|
coord_t max_y, |
|
const double /* resolution */, |
|
InfillPolylineOutput &output) |
|
{ |
|
if (output.clips()) |
|
generate_hearts(min_x, min_y, max_x, max_y, static_cast<InfillPolylineClipper &>(output)); |
|
else |
|
generate_hearts(min_x, min_y, max_x, max_y, output); |
|
} |