用意してある膨大なcsvの3次元の点データから輪郭だけをC言語で実行して取りたいのですが、立体に行く前の練習として平面で平行四辺形などの点データなどを作成してそこから外だけをとろうと思っています。
プログラム例はこちらです。
#include <stdio.h>
FILE *fileOpen(char *,char *);
int main(void)
{
FILE *in_fp;
FILE *out_fp;
int ret;
double n[50][2];/*配列宣言*/
double max[2] ={-999,-999};/**/
double max1[40][2];/**/
double min[2] ={999,999};
double min1[40][2];
double k[50][2];
int i=0;
int j=0;
int d=0; /**/
in_fp = fileOpen("heiko.csv","r");
out_fp = fileOpen("heiko1-1.csv","w");
while( ( ret = fscanf( in_fp, "%lf,%lf,",&n[d][0], &n[d][1] ) ) !=EOF ){
d++; /*次の行をとるためにd+1する*/
}
/*読み込んだd回分jを繰り返す。*/
/*xyの最大値最小値をmax[i],min[i]に格納して、大きいとき、小さいときにmax1,min1に格納*/
for (j=0; j<d; j++){
for (i=0; i<2; i++){
if(max[i] < n[j][i]){
max[i] = n[j][i];
max1[j][0] = n[j][0];
max1[j][1] = n[j][1];
}
if(min[i] > n[j][1]){
min[i] = n[j][i];
min1[j][0] = n[j][0];
min1[j][1] = n[j][1];
}
}
}
for (j=0; j<d; j++){
/*yがminより小さいとき、またはyがmaxより大きいときにkに格納*/
if(min[1] >= n[j][1] || max[1] <= n[j][1]){
k[j][0] = n[j][0];
k[j][1] = n[j][1];
fprintf(out_fp," %lf,",k[j][0]); /**/
fprintf(out_fp," %lf,",k[j][1]); /**/
}
if(max1[j][1] == n[j][1] && max1[j][0] == n[j][0]){
if (min[1] >= n[j][1] || max[1] <= n[j][1]){
}
else {
k[j][0] = max1[j][0];
k[j][1] = max1[j][1];
fprintf(out_fp," %lf,",k[j][0]); /**/
fprintf(out_fp," %lf,",k[j][1]); /**/
}
}
fprintf(out_fp,"\n"); /*次の行にデータを出力したいため改行。*/
}
fclose(in_fp);
fclose(out_fp);
return 0;
}
FILE *fileOpen(char *p_fileName,char *p_mode)
{
FILE *fp;
fp = fopen(p_fileName,p_mode);
if(fp == NULL){
fprintf(stderr,"ファイル[%s]を開くことができませんでした。\n",p_fileName);
exit(1);
}
return fp;
}
[thumbnail]http://gyazo.com/3dfffc9ef7d6d7a3fb323746e41d25b4.png[/thumbnail]
xyの最大値と最小値だけがわかるだけで、y=2、3、4などの時のxの最大値と最小値がわからないので、右側の点がとれてないのだと思います。
そのyが最小、最大以外でのとりかたがわからないので悩んでいます。アドバイスお願いします。
C言語については授業でちょっとやったぐらいでファイル入出力などは授業で習わずに終わったので、ネットで勉強しました。