#include<iostream>
#include<vector>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
//#include"Point.h"
using namespace std;
struct Point{
char label;//for gnuplot.
int index;//rank. sort by heading.
double x, y;//coordinate.
double heading(Point& other){
return atan2(y - this->y, x - this->x);
}
//friend ostream& operator<<(const Point& self, const ostream& os);
friend ostream& operator<<(ostream& os, const Point& self);
};
//ostream& operator<<(const ostream& os, const Point& self)
//ostream& operator<<(const Point& self, const ostream& os)
ostream& operator<<(ostream& os, const Point& self)
{
os << self.label << ":" << "(" << self.x << ", " << self.y << ")";
return os;
}
double makerand(){
return rand() / (double)RAND_MAX;
}
void makedata(vector<Point>& ps, int size){
char ch = 'A';
for(int i=0; i<size; i++){
Point temp = {ch, -1, makerand(), makerand()};
ps.push_back(temp);
ch++;
}
}
void output_gnuplot(vector<Point>& ps, char base[]){
char fn[256];
sprintf(fn, "%s_gnuplot.dat", base);
FILE* fp = fopen(fn, "w");
fprintf(fp, "# %d\n", ps.size());
for(int i=0; i<ps.size(); i++){
fprintf(fp, "%lf %lf\n", ps[i].x, ps[i].y);
}
fclose(fp);
}
void output_exe(vector<Point>& ps, char base[]){
char fn[256];
sprintf(fn, "%s_exe.dat", base);
FILE* fp = fopen(fn, "w");
fprintf(fp, "%d\n", ps.size());
for(int i=0; i<ps.size(); i++){
fprintf(fp, "%c %lf %lf\n", ps[i].label, ps[i].x, ps[i].y);
}
fclose(fp);
}
void output_gp_script(vector<Point>& ps, char base[], bool is_png){
char fn[256];
sprintf(fn, "%s.gp", base);
FILE* fp = fopen(fn, "w");
if(is_png){
fprintf(fp, "set terminal png\n");
fprintf(fp, "set output \"%s.png\"\n", base);
}
fprintf(fp, "set size square\n");
fprintf(fp, "set nokey\n");//凡例を消す
for(int i=0; i<ps.size(); i++){
fprintf(fp, "set label %d at %lf,%lf \"%c\"\n", i+1, ps[i].x, ps[i].y, ps[i].label);
}
char fn_dat[256];
sprintf(fn_dat, "%s_gnuplot.dat", base);
fprintf(fp, "plot \"%s\"\n", fn_dat);
fclose(fp);
}
int main(int argc, char* args[]){
unsigned int seed = 7729;
srand(seed);
if(argc != 3){
fprintf(stderr, "arg error, argc=%d\n", argc);
exit(1);
}
//makedata [N] [basename]
int N;//size.
sscanf(args[1], "%d", &N);
//printf("N=%d\n", N);//check
if(N > 26){
N = 26;
}
char base[256];//base name.
strcpy(base, args[2]);
vector<Point> ps;
makedata(ps, N);
output_gnuplot(ps, base);
output_gp_script(ps, base, false);
output_exe(ps, base);
//convex hull//check
/*
char fn_txt[256];
sprintf(fn_txt, "%s.txt", args[2]);
FILE* txt = fopen(fn_txt, "w");
//gnuplotで線を引くチェックのため、前半の半分だけを選んで別ファイルにする。
for(int i=0; i<ps.size()/2; i++){//check
fprintf(txt, "%lf %lf\n", ps[i].x, ps[i].y);
}
fclose(txt);
fprintf(gp, "plot \"%s\" with lines\n", fn_txt);
*/
//fclose(gp);
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxjc3RkaW8+CiNpbmNsdWRlPGNzdGRsaWI+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxjc3RyaW5nPgovLyNpbmNsdWRlIlBvaW50LmgiCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFBvaW50ewoJY2hhciBsYWJlbDsvL2ZvciBnbnVwbG90LgoJaW50IGluZGV4Oy8vcmFuay4gc29ydCBieSBoZWFkaW5nLgoJZG91YmxlIHgsIHk7Ly9jb29yZGluYXRlLgoJCglkb3VibGUgaGVhZGluZyhQb2ludCYgb3RoZXIpewoJCXJldHVybiBhdGFuMih5IC0gdGhpcy0+eSwgeCAtIHRoaXMtPngpOwoJfQoJLy9mcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBQb2ludCYgc2VsZiwgY29uc3Qgb3N0cmVhbSYgb3MpOwoJZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IFBvaW50JiBzZWxmKTsKfTsKLy9vc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IG9zdHJlYW0mIG9zLCBjb25zdCBQb2ludCYgc2VsZikKLy9vc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IFBvaW50JiBzZWxmLCBjb25zdCBvc3RyZWFtJiBvcykKb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvcywgY29uc3QgUG9pbnQmIHNlbGYpCnsKCW9zIDw8IHNlbGYubGFiZWwgPDwgIjoiIDw8ICIoIiA8PCBzZWxmLnggPDwgIiwgIiA8PCBzZWxmLnkgPDwgIikiOwoJcmV0dXJuIG9zOwp9Cgpkb3VibGUgbWFrZXJhbmQoKXsKCXJldHVybiByYW5kKCkgLyAoZG91YmxlKVJBTkRfTUFYOwp9CnZvaWQgbWFrZWRhdGEodmVjdG9yPFBvaW50PiYgcHMsIGludCBzaXplKXsKCWNoYXIgY2ggPSAnQSc7Cglmb3IoaW50IGk9MDsgaTxzaXplOyBpKyspewoJCVBvaW50IHRlbXAgPSB7Y2gsIC0xLCBtYWtlcmFuZCgpLCBtYWtlcmFuZCgpfTsKCQlwcy5wdXNoX2JhY2sodGVtcCk7CgkJY2grKzsKCX0KfQp2b2lkIG91dHB1dF9nbnVwbG90KHZlY3RvcjxQb2ludD4mIHBzLCBjaGFyIGJhc2VbXSl7CgljaGFyIGZuWzI1Nl07CglzcHJpbnRmKGZuLCAiJXNfZ251cGxvdC5kYXQiLCBiYXNlKTsKCUZJTEUqIGZwID0gZm9wZW4oZm4sICJ3Iik7CgkKCWZwcmludGYoZnAsICIjICVkXG4iLCBwcy5zaXplKCkpOwoJCglmb3IoaW50IGk9MDsgaTxwcy5zaXplKCk7IGkrKyl7CgkJZnByaW50ZihmcCwgIiVsZiAlbGZcbiIsIHBzW2ldLngsIHBzW2ldLnkpOwoJfQoJCglmY2xvc2UoZnApOwp9CnZvaWQgb3V0cHV0X2V4ZSh2ZWN0b3I8UG9pbnQ+JiBwcywgY2hhciBiYXNlW10pewoJY2hhciBmblsyNTZdOwoJc3ByaW50ZihmbiwgIiVzX2V4ZS5kYXQiLCBiYXNlKTsKCUZJTEUqIGZwID0gZm9wZW4oZm4sICJ3Iik7CgkKCWZwcmludGYoZnAsICIlZFxuIiwgcHMuc2l6ZSgpKTsKCQoJZm9yKGludCBpPTA7IGk8cHMuc2l6ZSgpOyBpKyspewoJCWZwcmludGYoZnAsICIlYyAlbGYgJWxmXG4iLCBwc1tpXS5sYWJlbCwgcHNbaV0ueCwgcHNbaV0ueSk7Cgl9CgkKCWZjbG9zZShmcCk7Cn0Kdm9pZCBvdXRwdXRfZ3Bfc2NyaXB0KHZlY3RvcjxQb2ludD4mIHBzLCBjaGFyIGJhc2VbXSwgYm9vbCBpc19wbmcpewoJY2hhciBmblsyNTZdOwoJc3ByaW50ZihmbiwgIiVzLmdwIiwgYmFzZSk7CglGSUxFKiBmcCA9IGZvcGVuKGZuLCAidyIpOwoJCglpZihpc19wbmcpewoJCWZwcmludGYoZnAsICJzZXQgdGVybWluYWwgcG5nXG4iKTsKCQlmcHJpbnRmKGZwLCAic2V0IG91dHB1dCBcIiVzLnBuZ1wiXG4iLCBiYXNlKTsKCX0KCQoJZnByaW50ZihmcCwgInNldCBzaXplIHNxdWFyZVxuIik7CglmcHJpbnRmKGZwLCAic2V0IG5va2V5XG4iKTsvL+WHoeS+i+OCkua2iOOBmQoJCglmb3IoaW50IGk9MDsgaTxwcy5zaXplKCk7IGkrKyl7CgkJZnByaW50ZihmcCwgInNldCBsYWJlbCAlZCBhdCAlbGYsJWxmIFwiJWNcIlxuIiwgaSsxLCBwc1tpXS54LCBwc1tpXS55LCBwc1tpXS5sYWJlbCk7Cgl9CgkKCWNoYXIgZm5fZGF0WzI1Nl07CglzcHJpbnRmKGZuX2RhdCwgIiVzX2dudXBsb3QuZGF0IiwgYmFzZSk7CglmcHJpbnRmKGZwLCAicGxvdCBcIiVzXCJcbiIsIGZuX2RhdCk7CglmY2xvc2UoZnApOwp9CmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmdzW10pewoJdW5zaWduZWQgaW50IHNlZWQgPSA3NzI5OwoJc3JhbmQoc2VlZCk7CgkKCWlmKGFyZ2MgIT0gMyl7CgkJZnByaW50ZihzdGRlcnIsICJhcmcgZXJyb3IsIGFyZ2M9JWRcbiIsIGFyZ2MpOwoJCWV4aXQoMSk7Cgl9CgkvL21ha2VkYXRhIFtOXSBbYmFzZW5hbWVdCgkKCWludCBOOy8vc2l6ZS4KCXNzY2FuZihhcmdzWzFdLCAiJWQiLCAmTik7CgkvL3ByaW50ZigiTj0lZFxuIiwgTik7Ly9jaGVjawoJaWYoTiA+IDI2KXsKCQlOID0gMjY7Cgl9CgkKCWNoYXIgYmFzZVsyNTZdOy8vYmFzZSBuYW1lLgoJc3RyY3B5KGJhc2UsIGFyZ3NbMl0pOwoJCgl2ZWN0b3I8UG9pbnQ+IHBzOwoJCgltYWtlZGF0YShwcywgTik7CglvdXRwdXRfZ251cGxvdChwcywgYmFzZSk7CglvdXRwdXRfZ3Bfc2NyaXB0KHBzLCBiYXNlLCBmYWxzZSk7CglvdXRwdXRfZXhlKHBzLCBiYXNlKTsKCQoJCgkKCQoJLy9jb252ZXggaHVsbC8vY2hlY2sKCS8qCgljaGFyIGZuX3R4dFsyNTZdOwoJc3ByaW50Zihmbl90eHQsICIlcy50eHQiLCBhcmdzWzJdKTsKCUZJTEUqIHR4dCA9IGZvcGVuKGZuX3R4dCwgInciKTsKCS8vZ251cGxvdOOBp+e3muOCkuW8leOBj+ODgeOCp+ODg+OCr+OBruOBn+OCgeOAgeWJjeWNiuOBruWNiuWIhuOBoOOBkeOCkumBuOOCk+OBp+WIpeODleOCoeOCpOODq+OBq+OBmeOCi+OAggoJZm9yKGludCBpPTA7IGk8cHMuc2l6ZSgpLzI7IGkrKyl7Ly9jaGVjawoJCWZwcmludGYodHh0LCAiJWxmICVsZlxuIiwgcHNbaV0ueCwgcHNbaV0ueSk7Cgl9CglmY2xvc2UodHh0KTsKCQoJZnByaW50ZihncCwgInBsb3QgXCIlc1wiIHdpdGggbGluZXNcbiIsIGZuX3R4dCk7CgkqLwoJCgkKCS8vZmNsb3NlKGdwKTsKCQoJcmV0dXJuIDA7Cn0K